<?php require_once('include/detail.inc.php');?>
只有一行内容,包含了 include 下的 detail.inc.php 文件,打开这个文件,定位到搜索吸收 name 参的代码上,其片段代码如下:
$arrWhere = array();$arrWhere[] = \"大众type_title_english = '\"大众.$_GET['name'].\"大众'\"大众;$strWhere = implode(' AND ', $arrWhere);$strWhere = 'where '.$strWhere;$arrInfo = $objWebInit->getInfoWhere($strWhere);
代码中是直接通过 $_GET 获取到的搜索内容,这里并没有做干系的防护方法,获取到搜索内容后,直接拼接到了 $strWhere 变量中,也便是 sql 语句的 where 部分,然后通报给了 getInfoWhere 函数,初步剖断是有 sql 注入危险,随后 ctrl + 左键定位到这个函数查看,其代码如下:
public function getInfoWhere($strWhere=null,$field = '',$table=''){ try { $table = $table?$table:$this->tablename1; $strSQL = \"大众SELECT $field FROM $table $strWhere\公众; $rs = $this->db->query($strSQL); $arrData = $rs->fetchall(PDO::FETCH_ASSOC); if(!empty($arrData[0]['structon_tb'])) $arrData = $this->loadTableFieldG($arrData); if($this->arrGPdoDB['PDO_DEBUG']) echo $strSQL.'<br><br>'; return current($arrData); } catch (PDOException $e) { echo 'Failed: ' . $e->getMessage().'<br><br>'; }}
在这个函数中传来的 $strWhere 变量直接拼接到了 $strSQL 中,直至到实行 sql,那么可以确定这个搜索功能有 sql 注入问题。条件是程序没有利用全局过滤器或其他的防护方法。
0x02:渗透验证
通过代码的流程可以看出来搜索功能是存在 sql 注入的,下面通过 burp 和 sqlmap 进行验证,结果如下:
可以证明,搜索功能存在 sql 注入漏洞。
0x03:修复建议常日情形下 sql 注入修复办法有两种,第一个是过滤危险的字符,这些字符不止限与单引号双引号,包扩 union、sleep 等数据库的关键字。第二个是利用预编译语句,收到的值利用占位符进行数据库的 CURD,而不是直接拼接到 sql 中。