หลังจากที่เขียนบทความวิเคราะห์ช่องโหว่ SQL Injection ของ IP.Board ออกมาไม่นานนักทาง Exploit-DB ได้มีประกาศช่องโหว่ SQL Injection และ Cross-site Scripting ของเว็บบอร์ดสำเร็จรูปชื่อดังอย่าง MyBB หรือ MyBulletinBoard ที่มีผู้ใช้งานเยอะไม่แพ้ IP.Board สำหรับเวอร์ชั่นที่มีช่องโหว่ดังกล่าวคือเวอร์ชั่น 1.8.1 หรือต่ำกว่าครับ
สำหรับช่องโหว่ระดับรุนแรงคือช่องโหว่ SQL Injection ที่เป็นแบบ Error Based มีคนเขียนโค้ดสำหรับเจาะช่องโหว่นี้เหมือนเอาโค้ดจากช่องโหว่ IP.Board มาดัดแปลงเล็กน้อยเลย สำหรับไฟล์ที่มีช่องโหว่คือไฟล์ member.php ตัวแปร question_id ที่จะเกิดขึ้นตอนสมัครสมาชิกครับ
if($mybb->settings['securityquestion']) { $question_id = $mybb->get_input('question_id'); $answer = $db->escape_string($mybb->get_input('answer')); $query = $db->query(" SELECT q.*, s.sid FROM ".TABLE_PREFIX."questionsessions s LEFT JOIN ".TABLE_PREFIX."questions q ON (q.qid=s.qid) WHERE q.active='1' AND s.sid='{$question_id}' ");
จากโค้ดจะเห็นว่ามีการรับค่า $_GET มาใส่ในตัวแปร question_id ผ่านฟังก์ชั่น get_input จากนั้นจึงนำเข้ามารวมกับคิวรี่ SQL ทดสอบการการโจมตีโดย SELECT COUNT(*) FROM mybb_users โดยอ้างอิงโค้ดจาก exploit
ทำให้ Hacker สามารถใช้ Regular Expression ตัดคำที่ต้องการออกมาจาก Error ที่เห็นได้ เมื่อตามไปดูโค้ดของฟังก์ชั่นที่ครอบ input ไว้นั่นคือฟังก์ชั่น get_input ที่อยู่ในไฟล์ /inc/class_core.php ครับ
/** * Checks the input data type before usage. * * @param string $name Variable name ($mybb->input) * @param int $type The type of the variable to get. Should be one of MyBB::INPUT_INT, MyBB::INPUT_ARRAY or MyBB::INPUT_STRING. * * @return mixed Checked data */ function get_input($name, $type = MyBB::INPUT_STRING) { switch($type) { case MyBB::INPUT_ARRAY: if(!isset($this->input[$name]) || !is_array($this->input[$name])) { return array(); } return $this->input[$name]; case MyBB::INPUT_INT: if(!isset($this->input[$name]) || !is_numeric($this->input[$name])) { return 0; } return (int)$this->input[$name]; case MyBB::INPUT_FLOAT: if(!isset($this->input[$name]) || !is_numeric($this->input[$name])) { return 0.0; } return (float)$this->input[$name]; case MyBB::INPUT_BOOL: if(!isset($this->input[$name]) || !is_scalar($this->input[$name])) { return false; } return (bool)$this->input[$name]; default: if(!isset($this->input[$name]) || !is_scalar($this->input[$name])) { return ''; } return $this->input[$name]; } }
การส่งค่าได้ส่งมาเป็น String และไม่มีการกรองค่าที่รับมาทำให้เกิดช่องโหว่ SQL Injection ได้ครับ ตอนนี้แพตช์เวอร์ชั่น 1.8.2 สำหรับแก้ไขช่องโหว่ SQL Injection และ Cross-site Scripting ได้ออกมาตั้งแต่วันที่ 13 พ.ย. ที่ผ่านมา โดยแก้ช่องโหว่ SQL Injection โดยใช้ฟังก์ชั่น escape_string ครอบเข้าไป
$question_id = $db->escape_string($mybb->get_input('question_id'));
ตามไปดูฟังก์ชั่น escape_string
function escape_string($string) { if($this->db_encoding == 'utf8') { $string = validate_utf8_string($string, false); } elseif($this->db_encoding == 'utf8mb4') { $string = validate_utf8_string($string); } if(function_exists("mysqli_real_escape_string") && $this->read_link) { $string = mysqli_real_escape_string($this->read_link, $string); } else { $string = addslashes($string); } return $string; }
มีการครอบ mysqli_real_escape_string เข้าไปแล้ว สำหรับใครที่ใช้ MyBB อยู่ก็อัพเดทกันด้วยนะครับ :)
Ref: MyBB 1.8.X <= 1.8.1 Error based SQL Injection
Ref: MyBB 1.8.X - Multiple Vulnerabilities
Ref: MyBB 1.8.2 Released – Security Release
ไม่มีความคิดเห็น:
แสดงความคิดเห็น