• ThinkPHP5.1.x-orderby方法注入


    漏洞概述

    本次漏洞存在于 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 appindexcontroller;
    class Index
    {
        public function index()
        {
            $orderby = request()->get('orderby');
            $result = db('users')->where(['username' => 'wtz'])->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 类)
    首先我们的入口是query类中的order方法

    这里将我们的数组变量直接存储
    我们先进入query类中的find方法:

    去到connection类中

    可以看到
    1:这里有执行查询操作
    2:还有就是这里$this->builder 为  hinkdbuilderMysql 类,该类继承于 Builder 类,所以接着会调用 Builder 类的 select 方法来生成 SQL 语句。
    我们直接去看Builder 类的 select 方法。

    在 select 方法中,程序会对 SQL 语句模板用变量填充,其中用来填充 %ORDER% 的变量中存在用户输入的数据。
    可以看到这里返回的就是我们预期的查询语句,那么他是怎么拼接过来的呢?
    我们去看parseOrde方法

    来到了我们此次的安全更新点

    这里order可控

    我们去看parseKey方法

    parseOrder 方法中,我们看到程序通过 parseKey 方法给变量两端都加上了反引号,然后直接拼接字符串返回,没有进行任何过滤、检测,这也是导致本次 SQL注入漏洞 的原因。

    漏洞修复

    官方的修复方法是:在拼接字符串前对变量进行检查,看是否存在 )、# 两个符号。

    总结

    七月火师傅的图

    参考

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

  • 相关阅读:
    网络数据处理
    进程间通信和网络
    附加的操作系统服务
    通用操作系统服务
    UIScrollView 子控件的自动布局经验
    UIImage 添加水印
    数据类型
    ios 获取手机的IP地址
    UILAbel 设置了attributedText 后省略号不显示
    swift
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/12741498.html
Copyright © 2020-2023  润新知