thinkphp5 两个控制器传参数_Thinkphp 5.1.7 parseData缺陷导致insert/update注入 分析

该博客详细分析了ThinkPHP 5.1.7版本的一个SQL注入漏洞,通过环境搭建和代码调试,展示了如何在`parseData`方法中利用用户可控的$data变量构造SQL语句。作者通过修改$username参数,利用`parseArrayData`方法的删除部分,实现了SQL注入。最后给出了报错注入payload,揭示了删除的代码块对安全的影响。
摘要由CSDN通过智能技术生成

环境搭建

$ composer create-project topthink/think thinkphp-5.1.7

修改composer.json 5.1.* => 5.1.7

$ composer update

分析

这个注入点与5.0.15的注入点位置都在parseData里,都是在解析set-data时直接将用户完全控制的data拼接到SQL语句中。

下面来看漏洞点,首先根据Github的commit记录进行定位

4acafbf9913ec8a4312850864c767aeb.png

7aac7edc99e98c061ba6550fbc1c3fdd.png

可以看到这里直接删除了default语句块,并直接删除了parseArrayData方法。

我们下面通过搭建5.1.7环境,来看一下被删掉的语句在原版本中会有怎样的影响。首先看一下控制器

f01ee7317e7abc8e9d15c611e4777aa5.png

这里获取一个username数组get变量,传给$username,然后作为字段'name'的值,插入test表。

我们先请求一条测试url:

127.0.0.1/thinkphp/thinkphp_5.1.7/public/index.php/index/index/sqli?username[0]=aaa&username[1]=bbb

3a20b146f8541eb26c56eb1f98877a14.png

可以看到此时$username的值为{"aaa","bbb"}。

下面在commit删除的部分下个断点,由于这个断点位于parseData()处,所以我们先从parseData开始跟。

d7a1da12a61f64a1bcf0c82ec9e27044.png

可以看到,这里将$data解析成键值对,由于$val是数组且不为空,进入了switch-default语句块,然后以用户可控的$val作为参数传入parseArrayData方法中。然后将获得的返回值放到$result数组中,最终返回$result数组。我们先跟进一下parseArrayData

f2c2f8cd6a16545b1bd1335e4e3925e1.png

这里先把$data的前两个元素赋值给$type和$value。不过由于我们这个的第一个元素是aaa,因此没有进入第一个case。通过分析第一个case可以发现,这里直接将$value(即$data[1])、$data[2]、$data[3]拼接到了返回值$result中,因此我们把我们的username[0]的值改为point,然后再加一个username[2]。

测试url:

127.0.0.1/thinkphp/thinkphp_5.1.7/public/index.php/index/index/sqli?username[0]=point&username[1]=bbb&username[2]=ccc

调试一下:

30e001f400742bea44111a166e3a0580.png

可以看到这里直接将参数拼接进来。继续调试,看看最终形成的sql语句:

de7c20d89d722f46859ca502376dfb7c.png

返回页面:

f1f430fa5e1d3f2e84bfd7e978e292c2.png

试一下报错注入payload:

http://127.0.0.1/thinkphp/thinkphp_5.1.7/public/index.php/index/index/sqli?username[0]=point&username[1]=bbbb&username[2]=updatexml(1,concat(0x7e,user (),0x7e),1))--%20

014917b24c0a24f7fa29c67eae9d9f03.png

参考

https://mochazz.github.io/2019/03/21/ThinkPHP5%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%E4%B9%8BSQL%E6%B3%A8%E5%85%A52/#%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90

2cdb4f063c3fdd0e1167ad4085796b3e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值