Thinkphp 5.1.7 parseData缺陷导致insert/update注入 分析
目录
环境搭建
$ 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记录进行定位
可以看到这里直接删除了default语句块,并直接删除了parseArrayData方法。
我们下面通过搭建5.1.7环境,来看一下被删掉的语句在原版本中会有怎样的影响。首先看一下控制器
这里获取一个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
可以看到此时$username的值为{"aaa","bbb"}。
下面在commit删除的部分下个断点,由于这个断点位于parseData()处,所以我们先从parseData开始跟。
可以看到,这里将$data解析成键值对,由于$val是数组且不为空,进入了switch-default语句块,然后以用户可控的$val作为参数传入parseArrayData方法中。然后将获得的返回值放到$result数组中,最终返回$result数组。我们先跟进一下parseArrayData
这里先把$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
调试一下:
可以看到这里直接将参数拼接进来。继续调试,看看最终形成的sql语句:
返回页面:
试一下报错注入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
参考
- Thinkphp 3.2.3 parseWhere设计缺陷导致update/delete注入 分析
- Thinkphp 5.0.10 设计缺陷导致Insert/update-SQL注入 分析
- 黄教头第四周作业 基于insert update delete注入利用案
- Mysql查询语句使用select.. for update导致的数据库死锁分析
- MTK相机内核驱动缺陷导致的权限提升,poc原理分析
- insert,update和delete下的注入
- ThinkPHP内置jsonRPC的缺陷分析
- insert into on duplicate key update与update inner join使用效果对比分析
- [ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱
- Zabbix latest.php Insert注入分析与实践
- Binder Driver缺陷导致定屏的实战分析
- MySQL Insert语句单个批次数量过多导致的CPU性能问题分析
- 【MyBatis源码分析】insert方法、update方法、delete方法处理流程(下篇)
- 利用insert,update和delete注入获取数据
- 利用insert,update和delete注入获取数据
- 关于insert|update|delete注入中的tips
- MySQL因大事务导致的Insert慢实例分析
- hibernate配置文件中重复定义导致的错误:should be mapped with insert="false" update="false"
- 【MyBatis源码分析】insert方法、update方法、delete方法处理流程(上篇)
- Mysql 下 Insert、Update、Delete、Order By、Group By注入