2021天翼杯(thinkphp5.0.15sql注入漏洞+)

前言:

主要是想练习一下如何在框架下挖漏洞

环境搭建

通过以下命令获取测试环境代码:

composer create-project --prefer-dist topthink/think=5.0.15 tpdemo

composer.json 文件的 require 字段设置成如下:

"require": {
"php": ">=5.4.0",
"topthink/framework": "5.0.15"
}

然后执行 composer update ,并将 application/index/controller/Index.php 文件代码设置如下:

<?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_debugapp_trace 。创建数据库信息如下:

create database tpdemo;
use tpdemo;
create table users(
id int primary key auto_increment,
username varchar(50) not null
);

漏洞复现

insert()注入复现

这里直接就去调用insert函数,所以我直接把断点下在这里,往下看数据的变化
数据以数组的形式被传入parsedata进行数据解析

img
在此处直接对输入的数组数据先进行选择,后直接进行拼接
img

img

并且直接对结果进行了一个返回
img
后续直接将该输入拼接在insert语句的后半段造成报错注入:
img
img

select()注入复现

断点我直接搭载前面get这里,然后看他一个值的传入

img

首先从我们传入的数组中取值,并且值得注意的是,这个函数会递归到更深层次的数组中
img
接下来会进入一个过滤,很奇怪的是,在别人复现的源码里,notlike是合起来写的,所以当我们在这里写not like的时候,就可以绕过,但是不知道为什么这里的源码两个都有过滤
img
img
后面继续经过一系列拼接赋值操作,其中select函数中,where内容是可控的

img 有难度应该就是这段数组结果进行转化拼接的,这里介绍一下,我们传入的了一个username[0]那么他就会被拼接在最前面,接下来,我们再传入一个username[1][1\]=%和username\[1\]\[2\]=aaa那么他会被分别拼接到两个`username`后所接入的内容呢,也就是username not like '%' 然后username not like aaa 紧接着如果我们有username\[2\]的话,那么这个也就会被直接被先拼接到username\[1\]\[1\]的后面

imgwherestr的内容将被拼接为以下内容,通过$array的值进行分割后,再加上一个括号

eg:
array[1]=abc;
array[2]=bcd;
login=123;
(abc 123 bcd)

img

img 带回到原查询语句,可以发现这在 img 在mysql中测试 img
payload:
?password=2&username[0]=not like&username[1][0]=%25&username[1][1]=aaa&username[2][0]=) union select 1,2,3%23&username[2][1]=123

https://blog.csdn.net/weixin_45669205/article/details/116464224

2021天翼杯(thinkphp5.0.15sql注入漏洞+)

http://example.com/2021/09/27/2021天翼杯/

Author

vague huang

Posted on

2021-09-27

Updated on

2021-09-29

Licensed under

Comments