代码审计-PHP专题原生开发SQL注入1day分析构造正则搜索语句执行监控功能定位
挖掘技巧:
-语句监控-数据库SQL监控排查可利用语句定向分析
-功能追踪-功能点文件SQL执行代码函数调用链追踪
-正则搜索-(update|select|insert|delete|).*?where.*=
如何快速的在多个文件代码里面找脆弱:
1、看文件路径
2、看代码里面的变量(可控)
3、看变量前后的过滤
1、Bluecms-CNVD-1Day-常规注入审计分析
审计流程:(update|select|insert|delete|).*?where.*=\
正则-ad_js.php->getone()->无过滤->有输出payload注入
Poc:
ad_js.php?ad_id=1 union select 1,2,3,4,5,6,database()
这里我们先创建一个账号
这里想挖sql注入的代码审计漏洞,可以使用正则表达式搜索
只有存在可控变量才有机会挖到漏洞,这里跟踪一下这个$ad_id变量
这里我们跟踪一下调用的函数getone
跟踪过去这里是一个接收sql语句的函数,然后这里有一个query的执行
并且这里也适合挖sql注入,因为这里面有回显
果然这里是一个执行sql语句的方法
这里其实很明显的就是sql注入了
为什么payload是ad_js.php?ad_id=1 union select 1,2,3,4,5,6,database()
因为我们在ad_js.php中找到的漏洞点,然后config.php文件中有一个$pre = "blue";这段代码的含义就是我们搜索的数据库前面都带有blue_的前缀,然后这个数据库中一共是7列,或者盲测也可以测试出来是7列,再加上常规sql注入即可
拓展:这里sql注入一般会带有xss漏洞,由于这里没有过滤,那可以尝试xss漏洞
<script>alert(1)</script>
payload:
http://127.0.0.1:83/uploads/ad_js.php?ad_id=1<script>alert(1)</script>
2、emlog-CNVD-1Day-常规注入审计分析
https://www.cnvd.org.cn/flaw/show/CNVD-2018-26200
审计流程:
comment.php->delCommentByIp($ip)->无过滤->构造触发
Poc:
/admin/comment.php?action=delbyip&ip=127.0.0.1%27and(extractvalue(1,concat(0x7e,(select%20user()),0x7e)))%20--+&token=11f3f9cb7e78e3f88e39ea5678939b7d
这里我们翻找了一下,因为这里可控变量太多,并且没有什么具体的sql语句,所以我们查看一下调用的方法、函数等,这里找到一个delComment
这里是关键点,我们传入的ip然后调用的是下面的del方法,我们追踪一下这个del方法
这里就出现了,上面是$ip,也就是我们要传入的值,然后下面一个sql语句,接收我们的值,这里看起来是可控的,因此可能存在漏洞
这里能找到action这个变量的来源,GET传参的一个action
这里执行sql语句并没有回显,所以尝试报错或者延迟注入
这里我们注入会提示权限不足,token error,这里就需要配置上token
这里有报权限不足,那我们追踪一下checkToken这个函数,看一下
这里有一个genToken(),我们想获得token,追踪一下
就在他上面一行的方法,这里面的token值是再cookie里面的,所以后面我们加上一个cookie里面的token
我们加上token再看一下
3、emlog-CNVD-1Day-2次注入审计分析
https://www.cnvd.org.cn/flaw/show/CNVD-2023-65138
https://github.com/fupinglee/MySQLMonitor
https://github.com/cw1997/MySQL-Monitor
审计流程:
数据库监控->user.php无可控->nickname->添加不可控->data.php可控->导出修改导入->触发二次注入
/admin/data.php
导入文件时执行SQL文件中语句,带入Payload
INSERT INTO emlog_user VALUES('110','','$P$BnTaZnToynOoAVP6T/MiTsZc9ZAQNg.',(select version()),'writer','n','','123@qq.com ','','','0','1687261845','1687261845');
/admin/user.php
select查询nickname条件数据,访问触发二次注入
数据库监控
这样自动检查到我们搭建的靶场和数据库之间的交互来找sql注入
这里我们能找到这样一条命令,一条插入,这里插入7个值,所以我们后面二次注入也要构造7个值
就是我们把sql攻击语句写入数据库中查询再次执行
追踪一下这个new User_Model();
这里就是为什么我们打开用户页面会出现的数据,这里就查询数据库里的值,然后显示到页面中
这里我们更改nickname的原因就是$condition随之改动,sql语句也随之改动。
$res = $this->db->query("SELECT * FROM " . DB_PREFIX . "user where 1=1 $condition order by uid desc $limit");
这就是我们页面能获取到数据的sql语句,查询后显示到页面上,那我们改动这个sql语句就会造成注入
因此我们访问用户页面会执行条sql语法,我们用利用的就是这条语句
问题就在这里,我们可以导出数据库文件然后再插入sql攻击语法然后再导入备份
在这里我们插入sql语句
这里就将nickname写成一个查询语句。
查询成功