ช่องโหว่นี้คือช่องโหว่ 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"; |
14
| $modules = $db->customQuery($sql); |
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;} |
1
| http://localhost/gcms/print.php?action=print&id=[id]&module=[BSQLI] |
ผมได้รายงานไปทางผู้พัฒนา 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); } |
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
