ThinkPHP5.1.x SQL注入(orderby注入)
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_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?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->connection
是think/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注入)相关推荐
- concat mysql sql注入_sql注入-mysql注入基础及常用注入语句
最近在教学中,关于SQL注入,总发现学生理解起来有些难度,其实主要的原因是对各类数据库以及SQL语句不熟悉,今天先介绍mysql注入需要掌握的基础, Mysql内置information_schema ...
- php sql 二次注入,espcms 二次注入一枚
Author:Yaseng 1:通过 $alias 二次注入来控制sql 用户昵称 $alias 从数据库查询出来 未过滤 interface/member.php [php] $db_sql = & ...
- SQL注入_1-6_user-agent注入
SQL注入_1-6_user-agent注入 一.概念 User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本. ...
- sql注入查找注入点_基本的EJB参考,注入和查找
sql注入查找注入点 在本系列的第一部分中 ,我们介绍了Enterprise JavaBeans v.3.0规范提供的机制,用于定义EJB组件,声明对EJB的引用并通过依赖项注入或程序化JNDI查找将 ...
- sql通用防注入程序php,sql通用防注入系统_PHP教程
sql通用防注入系统 本文章提供这款防sql注入代码是一款php sql 双过滤非法字符的函数,他可以根据用户自定的防sql注入哦,先是过滤一些sql命令,再是就是把post get 过滤一次,最好验 ...
- sql 整改措施 注入_防止SQL注入的五种方法
一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...
- php 框架 容器,thinkphp5.1框架容器与依赖注入实例分析
本文实例讲述了thinkphp5.1框架容器与依赖注入.分享给大家供大家参考,具体如下: 容器----/thinkphp/library/think/Container.php 依赖注入:将对象类型的 ...
- 过滤SQL关键字 防注入
/// <summary>/// 过滤SQL关键字 防注入/// </summary>/// <param name="sWord">来自用户输 ...
- sql注入pythonpoco_SQL注入原理与解决方法代码示例
一.什么是sql注入? 1.什么是sql注入呢? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网 ...
最新文章
- mysql的binlog太多太大占用了空间的解决办法
- [导入]rep_daqjcrb
- C#中调用Windows系统服务exe程序的工具类与重启服务的流程
- 基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现(by 低端码农 2014.10.27)
- linux java程序启动脚本
- grep命令---Linux学习笔记
- LeetCode MySQL 1435. 制作会话柱状图
- 自己动手写cpu 光盘_自己动手写CPU配套源码
- Xshell连接VMware的linux系统
- rabbitMq多个队列多种任务同时监听
- ipad录屏软件_如何在 Mac 上优雅的截图和录屏
- 注册Google的步骤
- 【零基础学Python】Day9 Python推导式
- MFC对话框标题栏颜色自绘,标题栏由过渡色组成,自绘关闭按钮
- C#之十八 GUI用户界面编程
- 端到端的图像压缩----《Channel-wise Autoregressive Entropy Models For Learned Image Compression》论文笔记
- 超详细!K8s 面试知识点
- win10加装机械硬盘卡_以微软的技术实力,win10还会出现硬盘100%占用的问题,为什么呢...
- bzoj3265 志愿者招募加强版
- LevelDB 源码分析
热门文章
- 戴尔笔记本把计算机弄到桌面,刚买的dell笔记本桌面上怎么没有我的电脑,网上邻居等快捷方式,怎么设置显示在桌面...
- 通过kinectosc玩PC版水果忍者
- 登录鉴权、JWT、单点登录
- 东南大学计算机专硕缩招,被称大三本的985,曾扩招千人招调剂,如今2.2万人扎堆,不好考了...
- 国外python经典书籍_2019学习Python最值得看的七本书
- 解决Semantic-Segmentation-Suite套件预测结果为全黑
- MT6795详细芯片资料下载 MT6795规格说明简介
- airpods升系统_AirPods 系统更新,空间音频来了!
- 解决SQL设置主键时报错:ORA-02437无法验证-违反主键
- sqlserver新增主键自增_SQLserver 自增主键