ช่องโหว่นี้คือช่องโหว่ 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