ThinkPHP5 SQL注入(select方法)

ThinkPHP5 SQL注入(select方法)

  • 漏洞概要
  • 初始配置
  • 漏洞利用
  • 漏洞分析
  • 漏洞修复
  • 攻击总结

漏洞概要

  • 本次漏洞存在于 Mysql 类的 parseWhereItem 方法中,由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生
  • 漏洞影响版本: ThinkPHP5全版本

初始配置

  • 获取测试环境代码
composer create-project --prefer-dist topthink/think=5.1  tpH3rmesk1t

在这里插入图片描述

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

"require": {
    "php": ">=5.6.0",
    "topthink/framework": "5.1.7"
}

然后执行 composer update

在这里插入图片描述

  • 下载后的源码中,需要对application/index/controller/Index.php内容进行修改

namespace app\index\controller;

class Index
{
    public function index()
    {
        $username = request()->get('username');
        $result = db('users')->where('username','exp',$username)->select();
        var_dump($result);
        return '

:)Gyan师傅永远嘀神!!!

ThinkPHP V5.1
12载初心不改(2006-2018) - 你值得信赖的PHP框架

'
; } } ?>

config/database.php文件中配置数据库相关信息,并开启config/app.php中的app_debug和app_trace,创建数据库信息如下

create database thinkphp;
use thinkphp;
create table users(
	id int primary key auto_increment,
	username varchar(50) not null,
);
insert into users(id,username) values(1,'H3rmesk1t');

漏洞利用

Payload:

http://127.0.0.1/cms/public/index.php/?username=)%20union%20select%20updatexml(1,concat(0x7,user(),0x7e),1)%23

ThinkPHP5 SQL注入(select方法)_第1张图片

漏洞分析

程序默认调用 Request 类的 get 方法中会调用该类的 input 方法,然后进到thinkphp/helper.php中的db方法,再进到thinkphp/library/think/db/Query.phpwhere方法,通过其 parseWhereExp 方法分析查询表达式,调用select方法

ThinkPHP5 SQL注入(select方法)_第2张图片

再调用thinkphp/library/think/db/Connection.php中的select方法

ThinkPHP5 SQL注入(select方法)_第3张图片

此处调用$this->builderselect方法,而此处$this->builderthink/db/builder/Mysql类,继承于Builder类,因此调用的是Builder类的select方法

ThinkPHP5 SQL注入(select方法)_第4张图片

select 方法中,程序会对 SQL 语句模板用变量填充,其中用来填充 %WHERE% 的变量中存在用户输入的数据,跟进这个 where 分析函数,会发现其会调用生成查询条件 SQL 语句的 buildWhere 函数,此处 $where 经过 buildWhere 方法处理后返回 $whereStr,期间调用 parseWhereItem 方法

ThinkPHP5 SQL注入(select方法)_第5张图片
ThinkPHP5 SQL注入(select方法)_第6张图片

parseWhereItem 的 where 子单元函数方法调用,当操作符为 EXP 时,调用 parseExp 方法,经过拼接带入SQL查询,造成SQL注入

ThinkPHP5 SQL注入(select方法)_第7张图片

ThinkPHP5 SQL注入(select方法)_第8张图片

ThinkPHP5 SQL注入(select方法)_第9张图片

完整的方法调用,从下往上

ThinkPHP5 SQL注入(select方法)_第10张图片

漏洞修复

该漏洞未被官方修复

攻击总结

参考Mochazz师傅的审计流程

ThinkPHP5 SQL注入(select方法)_第11张图片

你可能感兴趣的:(php,thinkphp,代码审计,SQL注入)