ThinkPHP5.1.x SQL注入(orderby注入)

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

漏洞概要

  • 本次漏洞存在于 Builder 类的 parseOrder 方法中,由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL 注入漏洞的产生
  • 漏洞影响版本: 5.1.16<=ThinkPHP5<=5.1.22

初始配置

获取测试环境代码

composer create-project --prefer-dist topthink/think=5.1.22 tpdemo

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

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

然后执行 composer update

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

<?php
namespace app\index\controller;class Index
{public function index(){$orderby = request()->get('orderby');$result = db('users')->where(['username' => 'mochazz'])->order($orderby)->find();var_dump($result);return '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:) </h1><p> ThinkPHP V5.1<br/><span style="font-size:30px">12载初心不改(2006-2018) - 你值得信赖的PHP框架</span></p></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=64890268" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="eab4b9f840753f8e7"></think>';}
}

config/database.php 文件中配置数据库相关信息,并开启 config/app.php 中的 app_debugapp_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?orderby[id`|updatexml(1,concat(0x7,user(),0x7e),1)%23]=1

漏洞分析

首先数据都会进入到 Request 类中的 input 方法,并且经过 filterValue 方法的过滤和强制类型转换并返回 $data

这里 array_walk_recursive 函数对数组中的成员递归调用 filterValue 过滤函数,但是 filterValue 过滤函数,不过滤数组的 key , 只过滤了数组的 value,用户输入的数据会原样进入框架的 SQL 查询方法中,进入 Query

恶意Payload 未经过任何过滤直接传递给 options['order']

接着调用 find 方法,此处 $this->connectionthink/db/connectior/Mysql 类 ,继承于 Connection 类,于是此处继续调用该类的 find 方法


该方法继续调用了 $this->builder, 即 think/db/builder/Mysql 类的 select 方法,该方法通过 str_replace 函数,将数据填充到SQL语句中

然后调用了 parseOrder 方法,跟进该方法,$order 是输入的数据,然后经过了 parseKey 方法处理后返回给 $array,跟进查看该方法的实现

protected function parseOrder(Query $query, $order){if (empty($order)) {return '';}$array = [];foreach ($order as $key => $val) {if ($val instanceof Expression) {$array[] = $val->getValue();} elseif (is_array($val)) {$array[] = $this->parseOrderField($query, $key, $val);} elseif ('[rand]' == $val) {$array[] = $this->parseRand($query);} else {if (is_numeric($key)) {list($key, $sort) = explode(' ', strpos($val, ' ') ? $val : $val . ' ');} else {$sort = $val;}$sort    = strtoupper($sort);$sort    = in_array($sort, ['ASC', 'DESC'], true) ? ' ' . $sort : '';$array[] = $this->parseKey($query, $key, true) . $sort;}}return ' ORDER BY ' . implode(',', $array);}

跟进 thinkphp/library/think/db/builder/Mysql.php,该方法在变量 $key 的两端添加了反引号进行拼接并且没有任何过滤

最终返回了一个带有 ORDER BY 的 SQL 注入 payload 给要执行的SQL语句,实现 ORDER BY 注入

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

漏洞修复

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

攻击总结

参考Mochazz师傅的审计流程

ThinkPHP5.1.x SQL注入(orderby注入)相关推荐

  1. concat mysql sql注入_sql注入-mysql注入基础及常用注入语句

    最近在教学中,关于SQL注入,总发现学生理解起来有些难度,其实主要的原因是对各类数据库以及SQL语句不熟悉,今天先介绍mysql注入需要掌握的基础, Mysql内置information_schema ...

  2. php sql 二次注入,espcms 二次注入一枚

    Author:Yaseng 1:通过 $alias 二次注入来控制sql 用户昵称 $alias 从数据库查询出来 未过滤 interface/member.php [php] $db_sql = & ...

  3. SQL注入_1-6_user-agent注入

    SQL注入_1-6_user-agent注入 一.概念 User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本. ...

  4. sql注入查找注入点_基本的EJB参考,注入和查找

    sql注入查找注入点 在本系列的第一部分中 ,我们介绍了Enterprise JavaBeans v.3.0规范提供的机制,用于定义EJB组件,声明对EJB的引用并通过依赖项注入或程序化JNDI查找将 ...

  5. sql通用防注入程序php,sql通用防注入系统_PHP教程

    sql通用防注入系统 本文章提供这款防sql注入代码是一款php sql 双过滤非法字符的函数,他可以根据用户自定的防sql注入哦,先是过滤一些sql命令,再是就是把post get 过滤一次,最好验 ...

  6. sql 整改措施 注入_防止SQL注入的五种方法

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  7. php 框架 容器,thinkphp5.1框架容器与依赖注入实例分析

    本文实例讲述了thinkphp5.1框架容器与依赖注入.分享给大家供大家参考,具体如下: 容器----/thinkphp/library/think/Container.php 依赖注入:将对象类型的 ...

  8. 过滤SQL关键字 防注入

    /// <summary>/// 过滤SQL关键字 防注入/// </summary>/// <param name="sWord">来自用户输 ...

  9. sql注入pythonpoco_SQL注入原理与解决方法代码示例

    一.什么是sql注入? 1.什么是sql注入呢? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网 ...

最新文章

  1. mysql的binlog太多太大占用了空间的解决办法
  2. [导入]rep_daqjcrb
  3. C#中调用Windows系统服务exe程序的工具类与重启服务的流程
  4. 基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现(by 低端码农 2014.10.27)
  5. linux java程序启动脚本
  6. grep命令---Linux学习笔记
  7. LeetCode MySQL 1435. 制作会话柱状图
  8. 自己动手写cpu 光盘_自己动手写CPU配套源码
  9. Xshell连接VMware的linux系统
  10. rabbitMq多个队列多种任务同时监听
  11. ipad录屏软件_如何在 Mac 上优雅的截图和录屏
  12. 注册Google的步骤
  13. 【零基础学Python】Day9 Python推导式
  14. MFC对话框标题栏颜色自绘,标题栏由过渡色组成,自绘关闭按钮
  15. C#之十八 GUI用户界面编程
  16. 端到端的图像压缩----《Channel-wise Autoregressive Entropy Models For Learned Image Compression》论文笔记
  17. 超详细!K8s 面试知识点
  18. win10加装机械硬盘卡_以微软的技术实力,win10还会出现硬盘100%占用的问题,为什么呢...
  19. bzoj3265 志愿者招募加强版
  20. LevelDB 源码分析

热门文章

  1. 戴尔笔记本把计算机弄到桌面,刚买的dell笔记本桌面上怎么没有我的电脑,网上邻居等快捷方式,怎么设置显示在桌面...
  2. 通过kinectosc玩PC版水果忍者
  3. 登录鉴权、JWT、单点登录
  4. 东南大学计算机专硕缩招,被称大三本的985,曾扩招千人招调剂,如今2.2万人扎堆,不好考了...
  5. 国外python经典书籍_2019学习Python最值得看的七本书
  6. 解决Semantic-Segmentation-Suite套件预测结果为全黑
  7. MT6795详细芯片资料下载  MT6795规格说明简介
  8. airpods升系统_AirPods 系统更新,空间音频来了!
  9. 解决SQL设置主键时报错:ORA-02437无法验证-违反主键
  10. sqlserver新增主键自增_SQLserver 自增主键