• ThinkPHP5x-Mysql 聚合函数相关方法注入


    漏洞概述

    摘抄:

    https://mochazz.github.io/2019/04/02/ThinkPHP5漏洞分析之SQL注入6/#漏洞概要

    本次漏洞存在于所有 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 文件代码设置如下:

    
    <?php
    namespace appindexcontroller;
    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
    

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

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

    我们开始利用debug分析代码
    先补充前置知识:

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

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

    去看aggregate方法

    去connection类看这个方法

    看到这里经由parseKey方法处理,前面还有一个this->builder方法。
    这个根据前面的经验就是继承于builder类中的select方法来生成我们的查询语句。
    我们先看parseKey是怎么处理的我们的数据

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

    这样看可能不是很清晰,自己单步调试一下就很清楚了。
    可以看到最后返回了$key的值。
    然后下一步:

    回到$this->value方法
    我们去看看builder类中的select方法。

    在 select 方法中,程序会对 SQL 语句模板用变量填充,其中用来填充 %
    FIELD% 的变量中存在用户输入的数据。
    这里我们只看
    $this->parseField方法,因为这里面的数据我们可控

    这里只是把他用,拼接,返回了我们的payload。即使使用了parsekey处理数据,但是对我们的paylaod没有影响。
    最终直接替换进 SQL 语句模板里,导致 SQL注入漏洞 的发生

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

    漏洞修复

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

    总结

    七月火师傅的图:

    参考

    https://mochazz.github.io/2019/04/02/ThinkPHP5漏洞分析之SQL注入6/#攻击总结

  • 相关阅读:
    go并发和并行
    goroutine
    go并发
    wampserver配置问题
    获取字符串的长度
    mysql中事件失效如何解决
    Go语言中Goroutine与线程的区别
    Mosquitto服务器的日志分析
    phpexcel导出数据 出现Formula Error的解决方案
    Centos6.X 手动升级gcc
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/12746150.html
Copyright © 2020-2023  润新知