目录
使用版本
注:thinkphp版本:5.1.6<=ThinkPHP<=5.1.7 (非最新的 5.1.8 版本也可利用)。
环境搭建
文件下载安装
在github上面下载相应版本(下图中展示的5.0.15版本),下载think文件,下载framework文件,然后将framework文件修改名字为thinkphp,然后将修改后的framework放在think文件下,然后将think放在网站目录下,然后就可以打开了
配置文件修改
数据库修改
开启debug模式
配置你的控制器
public function index()
{
$username = request()->get('username/a');
db('users')->where(['id' => 1])->update(['username' => $username]);
return 'Update success';
//return '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:) </h1><p> ThinkPHP V5.1<br/><span style="font-size:30px">12载初心不改(2006-2018) - 你值得信赖的PHP框架</span></p></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=64890268" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="eab4b9f840753f8e7"></think>';
}
查看官方更新文档
在5.1.9有一个更新
在这里有一处修改
尝试注入
http://127.0.0.1:9999/thinkphp/think-5.1.6/public/?username[0]=point&username[1]=1&username[2]=updatexml(1,concat(0x7,user(),0x7e),1)^&username[3]=0
回显了你的用户名
漏洞分析
下面我们跟着这payload来追一下这个漏洞
http://127.0.0.1:9999/thinkphp/think-5.1.6/public/?username[0]=point&username[1]=1&username[2]=updatexml(1,concat(0x7,user(),0x7e),1)^&username[3]=0
在这里打断点
走到update这里
然后进入update
然后既然追update的builder
然后进入parseData这里
再然后进入parseArrayData里面上面的两个inc和dnc选项已经被修复了
进入parseArrayData,在这里
list就是将数组中的值赋给一个变量
parseArrayData拼接的值,这里是将你的注入语句用^与后面的('0(1)')进行拼接,或者使用|拼接也可以,这样的目的是为了mysql语法正确,这里对于后面的语句来说不重要,因为走到update的时候已经报错了
然后经过执行又回到update了,username变成如下图所示
然后在update中经过字符串的替换,sql语句就变成下面这样
"UPDATE `users` SET `username` = updatexml(1,concat(0x7,user(),0x7e),1)^('0(1)') WHERE `id` = :where_AND_id "
然后就会执行,报错出现注入