PHP 代码审计之 SQL 注入

2022-10-11 21:40:49 201 0
魁首哥

点击 右上角【关注】发哥微课堂头条号,get更多相关技能~

0x00:前言

用 CMS 做例子,今天刚下载安装,因为首页的搜索功能比较显眼,所以看了一下是存在 sql 注入的,基本没有防护机制,CMS 比较冷门,不属于热门,所以安全性也低一点,做审计练手很合适。

0x01:代码追踪

搜索时 URL 如下:/archives/detail.php?name=1,通过 URL 可知其相应的 php 文件为 archives 下的 detail.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.'

'; return current($arrData); } catch (PDOException $e) { echo 'Failed: ' . $e-> getMessage ().'

'; } }

在这个函数中传来的 $strWhere 变量直接拼接到了 $strSQL 中,直至到执行 sql,那么可以确定这个搜索功能有 sql 注入问题。前提是程序没有使用全局过滤器或其他的防护措施。

0x02:渗透验证

通过代码的流程可以看出来搜索功能是存在 sql 注入的,下面通过 burp 和 sqlmap 进行验证,结果如下:

可以证明,搜索功能存在 sql 注入漏洞。

0x03:修复建议

通常情况下 sql 注入修复方式有两种,第一个是过滤危险的字符,这些字符不止限与 单引号 双引号,包扩 union、sleep 等数据库的关键字。第二个是使用预编译语句,收到的值使用占位符进行数据库的 CURD,而不是直接拼接到 sql 中。

收藏
分享
海报
0 条评论
201
上一篇:3分钟短文 | PHP数组获取最后一个元素,10个方式中哪个有错? 下一篇:PHP 8.1.0 正式发布了

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码