[TOC]php
$ composer create-project topthink/think thinkphp-5.1.7html
修改composer.json 5.1.* => 5.1.7git
$ composer updategithub
这个注入点与5.0.15的注入点位置都在parseData里,都是在解析set-data时直接将用户彻底控制的data拼接到SQL语句中。sql
下面来看漏洞点,首先根据Github的commit记录进行定位thinkphp
能够看到这里直接删除了default语句块,并直接删除了parseArrayData方法。json
咱们下面经过搭建5.1.7环境,来看一下被删掉的语句在原版本中会有怎样的影响。首先看一下控制器数组
这里获取一个username数组get变量,传给$username,而后做为字段'name'的值,插入test表。composer
咱们先请求一条测试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:
原文出处:https://www.cnblogs.com/litlife/p/11280133.html