• ThinkPHP5全版本-select 方法SQL注入


    0x00 漏洞概述

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

    0x01 环境

    composer create-project topthink/think=5.0.10 tp5010
     composer.json文件:
     "require": {
            "php": ">=5.4.0",
            "topthink/framework": "5.0.10"
        },
        
        更新:执行composer update
    

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

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

    <?php
    namespace appindexcontroller;
    class Index
    {
        public function index()
        {
            $username = request()->get('username');
            $result = db('users')->where('username','exp',$username)->select();
            return 'select success';
        }
    }
    

    创建数据库信息如下:

    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/tp5010/public/index.php/index/index/?username=)%20union%20select%20updatexml(1,concat(0x7,user(),0x7e),1)%23
    

    这里的username接受了我们get传来的值,执行select方法。

    用户输入的数据会原样进入框架的 SQL 查询方法中。首先程序先调用 Query 类的 where 方法,通过其 parseWhereExp 方法分析查询表达式,然后再返回并继续调用 select 方法准备开始构建 select 语句。(这个点得记住,框架的sql查询方法先进入 Query 类)

    查看调用堆栈

    这里$this->builder 为  hinkdbuilderMysql 类,该类继承于 Builder 类,所以接着会调用 Builder 类的 select 方法。

    这里的options调用了parseExpress方法,作用就是获取表(也就是我们的users表)

    我们去 Builder 类去看看select 方法
    这里将他进行拼接返回$sql,
    ps:这里程序会对 SQL 语句模板用变量填充,其中用来填充 %WHERE% 的变量中存在用户输入的数据。

    我们跟进去看parsewhere看一下里面的值是怎么过来的

    跟进buildWhere
    就在当前页面:
    先放图再分析:

    我们的数据进入了buildWhere经过一个数组遍历赋值,又进入了parseWhereItem中的where子单元分析函数。

    最后当操作符等于 EXP 时,将来自用户的数据直接拼接进了 SQL 语句,执行查询语句最终导致了 SQL注入漏洞 。

    漏洞修复

    未修复

    总结

    七月火师傅的图:

    参考

    https://mochazz.github.io/2019/03/23/ThinkPHP5漏洞分析之SQL注入3/#攻击总结

  • 相关阅读:
    【整理】互联网服务端技术体系:存储基础之数据存储与索引结构
    python基础之enumerate() 函数+ Counter类计数器
    介绍几个好用的Java库
    【GIS】BlenderGIS应用配置之一
    使任意同步库快速变asyncio异步语法的方式 ,run_in_executor
    mysql查看表行数
    mysql8.0使用mysqldump报错:Unknown table ‘column_statistics‘ in information_schema (1109)
    sysbench安装使用,结果信息分析
    【1.6】shell使用 -p -f 之类的参数
    右键新建项中添加Typora新建Markdown文件快捷选项
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/12732557.html
Copyright © 2020-2023  润新知