点击右上角【关注】发哥微课堂头条号,get更加多关联技能~
0x00:前言
用 CMS 做例子,今天刚下载安装,由于首页的搜索功能比较显眼,因此看了一下是存在 sql 注入的,基本无防护机制,CMS 比较冷门,不属于热门,因此安全性亦低一点,做审计练手很合适。
0x01:代码跟踪
搜索时 URL 如下:/archives/detail.php?name=1,经过 URL 可知其相应的 php 文件为 archives 下的 detail.php,打开此文件,内容如下: <?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 注入修复方式有两种,第1个是过滤危险的字符,这些字符不止限与单引号双引号,包扩 union、sleep 等数据库的关键字。第二个是运用预编译语句,收到的值运用占位符进行数据库的 CURD,而不是直接拼接到 sql 中。
|