Thinkphp 5.0.15 设计缺陷导致Insert/update-SQL注入 分析

分析

与上一个漏洞类似,这个也是前端可以传入一个数组变量,如['exp','123','123'],后端根据array[0]来将array[1]和array[2]直接拼接到SQL语句中。

由于TP只是框架,为了保证应用业务正常运行,不能为主应用做过多的安全防御(如转义、去除危险字符等)。

上一个漏洞点存在于处理where语句的parseWhere()处,而这个点则在处理insert和set的data的parseData()处。

本文以insert为例,首先payload如下:

http://127.0.0.1/thinkphp/thinkphp_5.0.15_full/public/index.php/index/index/sqli?username[0]=inc&username[1]=updatexml(1,concat(0x7e,user(),0x7e),1)&username[2]=1

1077935-20190731003404333-740161248.png

15行,以数组的格式获取$_GET中的username变量,然后作为参数传入insert(),跟进一下

1077935-20190731003412116-786307735.png

parseExpress在这里主要就是把表名放到$options['table']中,用于后面拼装SQL语句。$data在这里就是['name'=>$_GET['username']]。

到2085行,跟进insert函数,这个函数用来拼接整条SQL语句

1077935-20190731003428575-1855867173.png

首先调用parseData()来解析$data,跟进一下

1077935-20190731003433998-1991100588.png

这里经过101行的foreach,在119行将我们的payload拼接到了$result[$item]中,继续往下看

1077935-20190731003438629-219278030.png

这里直接返回了$result。回到insert(),在728行将parseData()返回的$data拼接到整条SQL语句中,最后返回完整的SQL语句。

1077935-20190731003442682-306502820.png

回到最外层的insert()

1077935-20190731003449271-914702527.png

2094行直接执行了insert()返回的SQL语句。

转载于:https://www.cnblogs.com/litlife/p/11273652.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值