2021天翼杯(thinkphp5.0.15sql注入漏洞+)
前言:
主要是想练习一下如何在框架下挖漏洞
环境搭建
通过以下命令获取测试环境代码:
composer create-project --prefer-dist topthink/think=5.0.15 tpdemo |
将 composer.json 文件的 require 字段设置成如下:
"require": { |
然后执行 composer update ,并将 application/index/controller/Index.php 文件代码设置如下:
|
在 application/database.php 文件中配置数据库相关信息,并开启 application/config.php 中的 app_debug 和 app_trace 。创建数据库信息如下:
create database tpdemo; |
漏洞复现
insert()注入复现
这里直接就去调用insert函数,所以我直接把断点下在这里,往下看数据的变化
数据以数组的形式被传入parsedata进行数据解析

在此处直接对输入的数组数据先进行选择,后直接进行拼接
并且直接对结果进行了一个返回
后续直接将该输入拼接在insert语句的后半段造成报错注入:

select()注入复现
断点我直接搭载前面get这里,然后看他一个值的传入
首先从我们传入的数组中取值,并且值得注意的是,这个函数会递归到更深层次的数组中
接下来会进入一个过滤,很奇怪的是,在别人复现的源码里,notlike是合起来写的,所以当我们在这里写not like的时候,就可以绕过,但是不知道为什么这里的源码两个都有过滤

后面继续经过一系列拼接赋值操作,其中select函数中,where内容是可控的
有难度应该就是这段数组结果进行转化拼接的,这里介绍一下,我们传入的了一个username[0]那么他就会被拼接在最前面,接下来,我们再传入一个username[1][1\]=%和username\[1\]\[2\]=aaa那么他会被分别拼接到两个`username`后所接入的内容呢,也就是username not like '%' 然后username not like aaa 紧接着如果我们有username\[2\]的话,那么这个也就会被直接被先拼接到username\[1\]\[1\]的后面
wherestr的内容将被拼接为以下内容,通过$array的值进行分割后,再加上一个括号
eg: |

带回到原查询语句,可以发现这在
在mysql中测试
payload: |
https://blog.csdn.net/weixin_45669205/article/details/116464224
2021天翼杯(thinkphp5.0.15sql注入漏洞+)