Thinkphp5-insert注入
跟着mochazz大佬的文章来的,原项目地址在这里:ThinkPHP-Vuln
漏洞介绍
漏洞成因:Build类中的parseData函数对用户的数据没有做任何的过滤,导致用户可直接构造sql语句造成注入
影响范围:5.0.13<=ThinkPHP<=5.0.15 、 5.1.0<=ThinkPHP<=5.1.5
环境搭建
这里搞了好久,说一下流程
先要有mysql+php的环境(phpstudy或者linux下apt-get)
安装composer1
sudo apt-get install composer
然后获取我们的源码
1 | composer create-project --prefer-dist topthink/think=5.0.15 tpdemo |
获取的目录就在当前的文件夹下,然后开始配置
将 composer.json 文件的 require 字段设置成如下:1
2
3
4"require": {
"php": ">=5.4.0",
"topthink/framework": "5.0.15"
}
执行 composer update ,并将 application/index/controller/Index.php 文件代码设置如下:1
2
3
4
5
6
7
8
9
10
11
12<?php
namespace app\index\controller;
class Index
{
public function index()
{
$username = request()->get('username/a');
db('users')->insert(['username' => $username]);
return 'Update success';
}
}
在 application/database.php 文件中配置数据库相关信息,并开启 application/config.php 中的 app_debug 和 app_trace 。创建数据库信息如下:
1 | create database tpdemo; |
访问成这样,说明搭建成功啦~
漏洞分析
这里我使用了phpstorm来跟踪函数
首先我们来到 \application\index\controller\index.php1
2
3
4
5
6
7
8
9
10
11
12<?php
namespace app\index\controller;
class Index
{
public function index()
{
$username = request()->get('username/a');
db('users')->insert(['username' => $username]);
return 'Update success';
}
}
这里函数的大概意思是插入username,然后返回成功,这里我们跟踪insert函数
来到了 \thinkphp\library\think\db\Query.php
看到2085这行代码:1
$sql = $this->builder->insert($data, $options, $replace);
调用了builder中的insert函数,这里的 $this->builder类在 \thinkphplibrary\think\db\Builder.php,然后我们找到这个类中的insert函数。
继续跟踪parseData这个函数
这里的$data参数为数组,这里赋值给了数组$val,但我们$val[0]的值为 inc 的时候,$result[$item]的值为
parseKey($val[1]) . ‘+’ . floatval($val[2]);
我们继续跟踪这个parseKey函数,发现没有任何的过滤
然后这个没有过滤的参数值通过$result 变量最终还给了insert函数中的$data参数,最终insert函数返回了带有恶意代码的$sql
再然后给了我们最开始的insert方法带入去查询
总结
1、这里第一个参数不仅仅可以为inc,看代码里面dec也可以利用
2、数组值必须为三个,缺少一个都不行
大概就是总结这么多,明天再更新接下来的
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 sher10cksec@foxmail.com
文章标题:Thinkphp5-insert注入
本文作者:sher10ck
发布时间:2019-11-20, 20:10:35
最后更新:2020-04-18, 11:56:59
原始链接:http://sherlocz.github.io/2019/11/20/Thinkphp5-insert注入/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。