ป้ายเลื่อน


WelCom To www.Kiss-Hack.blogspot.com สังคม IT สังคม Hacker

หมวดหมู่

วันอังคารที่ 17 กันยายน พ.ศ. 2556

ช่องโหว่ Blind SQL Injection ใน GCMS


ช่องโหว่นี้คือช่องโหว่ Injection ที่มาเป็นอันดับ 1 ใน Top 10 ของ OWASP 2013 นั่นคือ Blind SQL Injection ครับพบในไฟล์ print.php บรรทัดที่  6-11


5
6
7
8
9
10
11
// โมดูลที่ต้องการ
$module = $_GET['module'];
 // ตรวจสอบโมดูลที่เรียก
$sql = "SELECT `id`,`module`,`owner`,`config`";
$sql .= " FROM `".DB_MODULES."` AS M";
$sql .= " WHERE `module`='$module'";
$sql .= " LIMIT 1";
          ซึ่งมีการรับค่า $_GET['module']; มาจาก User มารวมกับคำสั่ง SQL ในตัวแปร $sql จึงสามารถเกิดช่องโหว่ที่ดูข้อมูลส่วนอื่นของฐานข้อมูลได้ ซึ่งการ Query เกิดจากบรรทัดที่ 14 ครับ

14
$modules = $db->customQuery($sql);
          ตามไปดูฟังก์ชั่น customQuery ในคลาส class.mysql.php ที่อยู่ใน /bin กันครับ

308
309
310
311
312
313
314
315
316
317
318
319
320
321
public function customQuery($sql) {
 $recArr = array();
 $query = @mysql_query($sql, $this->dbconnection);
 if ($query == false) {
  $this->debug("customQuery($sql)");
 } else {
  $_SESSION[$this->time]++;
  while ($row = mysql_fetch_array($query, MYSQL_ASSOC)) {
   $recArr[] = $row;
  }
  mysql_free_result($query);
 }
 return $recArr;
}
          การโจมตีจะเกิดขึ้นก็ต่อเมื่อมีการ Request คำสั่งที่มี  Malicious SQL Code ไปที่ URL นี้ครับ

1
http://localhost/gcms/print.php?action=print&id=[id]&module=[BSQLI]
          สังเกตบรรทัดที่ 310 จะมีการ Query คำสั่งในตัวแปร $sql ด้วยฟังก์ชั่น mysql_query ครับและมีการ return ค่าผลลัพธ์จากการ Query ที่บรรทัด 315 ด้วยฟังก์ชั่น mysql_fetch_array ครับ
          ผมได้รายงานไปทางผู้พัฒนา gcms แล้วได้รับคำขอบคุณกลับมาและผู้พัฒนาได้ทำการประกาศ patch แล้วครับตามลิงค์นี้ แจ้งข้อผิดพลาด สำหรับ GCMS
          ซึ่งได้รับการป้องกัน Blind SQL Injection ด้วยการใช้ Regular Expression ในการกรอง Input ครับ

18
19
20
21
22
23
24
25
26
27
28
if (preg_match('/^[a-z]+$/', $module)) {
  // ตรวจสอบโมดูลที่เรียก
 $sql = "SELECT `id`,`module`,`owner`,`config`";
 $sql .= " FROM `".DB_MODULES."` AS M";
 $sql .= " WHERE `module`='$module'";
 $sql .= " LIMIT 1";
 $modules = $cache->get($sql);
 if (!$modules) {
  $modules = $db->customQuery($sql);
  $cache->save($sql, $modules);
 }
         *ล่าสุดเจอช่องโหว่เดียวกันในไฟล์ feed.php ตั้งแต่บรรทัดที่ 7 เป็นต้นไป (21:58 น.)

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$module = $_REQUEST['module'];
 // จำนวนที่ต้องการ ถ้าไม่กำหนด คืนค่า 10 รายการ
 $count = (int)$_GET['rows'] * (int)$_GET['cols'];
 $count = $count == 0 ? (int)$_GET['count'] : $count;
 $count = $count <= 0 ? 10 : $count;
 // วันที่วันนี้
 $cdate = date("D, d M Y H:i:s +0700", $mmktime);
 $today = date('Y-m-d', $mmktime);
 // ตรวจสอบโมดูลที่เรียก
 $sql = "SELECT M.`id`,M.`module`,M.`owner`,D.`topic`,D.`description`,M.`config`";
 $sql .= " FROM `".DB_INDEX."` AS I";
 $sql .= " INNER JOIN `".DB_MODULES."` AS M ON M.`id`=I.`module_id` AND M.`module`='$module'";
 $sql .= " INNER JOIN `".DB_INDEX_DETAIL."` AS D ON D.`id`=I.`id` AND D.`module_id`=I.`module_id` AND D.`language` IN ('".LANGUAGE."','')";
 $sql .= " WHERE I.`module_id`=M.`id` AND I.`index`='1' AND I.`language` IN ('".LANGUAGE."','')";
 $sql .= " AND I.`published`='1' AND I.`published_date`<='$today'";
 $sql .= " LIMIT 1";
 $modules = $db->customQuery($sql);
       
สำหรับผู้ที่ใช้ GCMS อย่าลืม Patch ด้วยนะครับ ^^,, ICheer_No0M