Thinkphp5-insert注入

  1. 漏洞介绍
  2. 环境搭建
  3. 漏洞分析
  4. 总结

跟着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)

安装composer

1
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
2
3
4
5
6
create database tpdemo;
use tpdemo;
create table users(
id int primary key auto_increment,
username varchar(50) not null
);

访问我们的
http://127.0.0.1/tpdemo/public/?username[0]=inc&username[1]=updatexml(1,concat(0x7e,database(),0x7e),1)&username[2]=1

访问成这样,说明搭建成功啦~

漏洞分析

这里我使用了phpstorm来跟踪函数

首先我们来到 \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';
}
}

这里函数的大概意思是插入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" 转载请保留原文链接及作者。

目录