玩得一手好注入之order by排序篇
看了之前Gr36_前辈在先知上的议题,其中有提到排序注入,最近经常遇到这样的问题,所以先总结下order by 排序注入的知识。
环境信息
测试环境:操作系统ubuntu0.14.04.1 MYSQL:5.5.55-0
测试代码:
<?php
$mysql_server="10.10.10.136";
$mysql_username="root";
$mysql_userpass="xxxxx";
$mysql_select_db="test";
$config=mysql_connect($mysql_server,$mysql_username,$mysql_userpass)or die (mysql_error());
$db=mysql_select_db($mysql_select_db)or die (mysql_error());
if( isset( $_REQUEST[ 'evil' ]) ) {
$evil = $_REQUEST[ 'evil' ];
$query = "select * from test order by user_id $evil;";
//$query = "(select * from test order by user_id $evil);";
$result = mysql_query( $query,$config) or die( $query.'<pre>' . mysql_error() . '</pre>');
$num = mysql_numrows( $result );
$i = 0;
while( $i < $num ) {
$user_id = mysql_result( $result, $i, "user_id" );
$user = mysql_result( $result, $i, "user" );
$password = mysql_result( $result, $i, "password" );
$html .= "<pre>user_id: {$user_id} user: {$user} password: {$password}</pre>";
$i++;
}
mysql_close();
echo $query;
echo $html;
}
?>
注入方法介绍
正常页面:
1. order by 与 报错注入:
当页面会展示出MYSQL的错误信息时,可以使用报错注入。
?evil=and(updatexml(1,concat(0x7e,(select user())),0))
2. order by 与 盲注:
当页面并没有展示MYSQL的错误信息时,且只能根据页面的回显数据的状态进行判断时,可使用布尔盲注。
“当然雨师傅也提到了可以使用时间盲注 select * from test order by user_id,(select 1 from (select sleep(3))a)。”
这里使用位运算符的^(位异或),当然MySQL还有|(位或),&(位与),~(位取反),>>(位右移),<<(位左移)操作符号,位符号感觉有很多妙用目前还没想好:-)。^(位异或会将前后的数字转换成2进制然后进行异或。
因为正则进行匹配时,匹配到数据返回1(00000001)的时候,此时返回的1会和user_id中的数据的二进制进行异或,然后按照异或的结果升序排列,所以显示的排列会发生变化。
当正则进行匹配时,未匹配到数据返回0(00000000)的时候,任意数字和0异或的结果还是本身,所以user_id中的数据和0进行异或后排序是不变的。
因此,当页面排序紊乱时候则说明正则匹配到正确数据,页面排序未发生紊乱时则说明正则没有匹配到数据。
通过排列顺序的变化来判断返回的结果是否正确,这里的MYSQL版本是:5.5.55-0, 所以使用如下语句可以匹配到数据,因此排序发生变化了,这里'^5'也可以转换成^5的16进制,这样语句中就没了引号。
?evil=^(select (select version()) regexp '^5'), 正则返回结果为1,然后与user_id后面的值进行异或,得到如下结果。
因为order by 默认是升序排列的,所以页面显示的是如下的效果:
?evil=^(select (select version()) regexp '^aaaaaa') 未能匹配到数据,因此返回0。
当正则未匹配到数据时候返回的结果是0, 0和任意数字异或的结果都是数字本身,所以排序是不变的。
3.order by 与union 查询:
当$query = "select * from test order by user_id $evil;";没有使用括号包裹的时候,是无法直接使用union查询的。
当 $query = "(select * from test order by user_id $evil);";使用括号进行包裹的时候,此时是可以进行union查询的。
这个在MySQL的官方文档上也有进行说明<来自 MySQL 5.5参考手册>,文档中说道并把ORDER BY或LIMIT放到最后一个的后面,经过测试MYSQL:5.5.55-0放在前面也是可以执行的。当然这种情况不大常见。
小总结
由于采用预编译执行SQL语句时传入的参数不能作为SQL语句,所以像order by xxx desc这里的排序规则还是只能用拼接,因此order by后的注入或许能够成为后续漏洞挖掘重点关注的SQL注入点。
- 【死磕Java并发】—- J.U.C之并发工具类:CyclicBarrier
- Android Studio快捷键
- go 切片使用小结
- 分布式事务 TCC-Transaction 源码分析 —— 项目实战
- 分布式事务 TCC-Transaction 源码分析 —— 事务恢复
- Go的语言特性总结
- 注册中心 Eureka 源码解析 —— Eureka-Client 初始化(三)之 EurekaClient
- 从一次 Snowflake 异常说起
- 分布式事务 TCC-Transaction 源码分析 —— Dubbo 支持
- 2016 腾讯软件开发面试题(部分)
- 分布式事务 TCC-Transaction 源码分析 —— 运维平台
- 2016美团面试经历
- 2016年百度面试经历
- 注册中心 Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- VMware安装CentOS7 3.1 主机名修改3.2 网卡名修改3.3 ifconfig安装
- VMware网络设置
- Destoon 6.0 guestbook.php 通用SQL注入漏洞
- Hadoop2.7.6_01_部署
- Hadoop2.7.6_02_HDFS常用操作
- Bottle HTTP 头注入漏洞探究
- Hadoop2.7.6_03_HDFS原理
- Hadoop2.7.6_04_HDFS的Shell操作与常见问题
- Hadoop2.7.6_05_mapreduce-Yarn
- Hadoop2.7.6_06_mapreduce参数优化
- NFS服务搭建与配置
- Hadoop2.7.6_07_HA高可用
- Hadoop2.7.6_08_Federation联邦机制 1.1. HDFS-federation图解2.1. 注意事项3.1. 部署3.2. 环境变量3.3. c
- ThinkPHP5 SQL注入漏洞 && PDO真/伪预处理分析
- Hive-1.2.1_01_安装部署