玩得一手好注入之order by排序篇
看了之前Gr36_前辈在先知上的议题,其中有提到排序注入,这个在最近经常遇到这样的问题,所以先总结下order by 排序注入的知识。
0×00 背景
看了之前Gr36_前辈在先知上的议题,其中有提到排序注入,这个在最近经常遇到这样的问题,所以先总结下order by 排序注入的知识。
0×01 环境信息
测试环境:操作系统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;
}
?>
0×02 注入方法介绍
正常页面:

&amp;lt;img alt="页面.png" src="http://image.3001.net/images/20170830/15040564954516.png!small" width="440" height="437" /&amp;gt;&amp;lt;/p&amp;gt;
1.order by 与 报错注入:
当页面会展示出MYSQL的错误信息时,可以使用报错注入。
?evil=and(updatexml(1,concat(0x7e,(select user())),0))

&amp;lt;img alt="01.png" src="http://image.3001.net/images/20170830/15040565449721.png!small" width="690" height="217" /&amp;gt;&amp;lt;/p&amp;gt;
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后面的值进行异或,得到如下结果。
| 排序前 | 排序后 | |||||||
|---|---|---|---|---|---|---|---|---|
| user_id | user_id的二进制 | 正则(1)二进制 | user_id^1 | user_id | user_id的二进制 | 正则(1)二进制 | user_id^1 | |
| 1 | 00000001 | 00000001 | 00000000 | 1 | 00000001 | 00000001 | 00000000 | |
| 2 | 00000010 | 00000001 | 00000011 | 3 | 00000011 | 00000001 | 00000010 | |
| 3 | 00000011 | 00000001 | 00000010 | 2 | 00000010 | 00000001 | 00000011 | |
| 4 | 00000100 | 00000001 | 00000101 | 5 | 00000101 | 00000001 | 00000100 | |
| 5 | 00000101 | 00000001 | 00000100 | 4 | 00000100 | 00000001 | 00000101 | |
| 6 | 00000110 | 00000001 | 00000111 | 7 | 00000111 | 00000001 | 00000110 | |
| 7 | 00000111 | 00000001 | 00000110 | 6 | 00000110 | 00000001 | 00000111 |
因为order by 默认是升序排列的,所以页面显示的是如下的效果:

&amp;lt;img alt="效果.png" src="http://image.3001.net/images/20170830/15040566497427.png!small" width="641" height="441" /&amp;gt;&amp;lt;/p&amp;gt;
?evil=^(select (select version()) regexp ‘^aaaaaa’) 未能匹配到数据,因此返回0。
当正则未匹配到数据时候返回的结果是0, 0和任意数字异或的结果都是数字本身,所以排序是不变的。
| user_id | user_id的二进制 | 正则(0)二进制 | user_id^0 |
|---|---|---|---|
| 1 | 00000001 | 00000000 | 00000001 |
| 2 | 00000010 | 00000000 | 00000010 |
| 3 | 00000011 | 00000000 | 00000011 |
| 4 | 00000100 | 00000000 | 00000100 |
| 5 | 00000101 | 00000000 | 00000101 |
| 6 | 00000110 | 00000000 | 00000110 |
| 7 | 00000111 | 00000000 | 00000111 |

&amp;lt;img alt="2222.png" src="http://image.3001.net/images/20170830/15040567173649.png!small" width="690" height="434" /&amp;gt;&amp;lt;/p&amp;gt;
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放在前面也是可以执行的。当然这种情况不大常见。

&amp;lt;img alt="ruguo.png" src="http://image.3001.net/images/20170830/15040567914090.png!small" width="690" height="144" /&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;img alt="333.png" src="http://image.3001.net/images/20170830/15040568097713.png!small" width="690" height="479" /&amp;gt;&amp;lt;/p&amp;gt;
0×03 小小的总结
由于采用预编译执行SQL语句时传入的参数不能作为SQL语句,所以像order by xxx desc这里的排序规则还是只能用拼接,
因此order by后的注入或许能够成为后续漏洞挖掘重点关注的SQL注入点。
玩得一手好注入之order by排序篇的更多相关文章
- SQL注入攻击三部曲之进阶篇
SQL注入攻击三部曲之进阶篇 通过入门篇的学习,我们知道了SQL注入攻击的判断方法,但是如果想侵入网站,获取网站的机密内容,那么仅靠入门篇的知识是无法达到的.本篇文章我们将进一步的分析SQL注入攻击. ...
- 关于实现mybatis order by 排序传递参数实现 问题记录
一 问题场景:本人项目纯纯的后端系统 并且项目前端采用纯纯的原生js 实现 1)表格 通过查询列表数据放入到域中 前段采用 for循环的方式实现遍历生成列表 2)分页实现本人是公司内部自定 ...
- 去重 ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段) RN
关键字 ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段) RN 按照分组字段进行排序并标编号 ROW_NUMBER() OVER(PARTITIO ...
- SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。
top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 orde ...
- MySQL中order by排序时,数据存在null咋办
order by排序是最常用的功能,但是排序有时会遇到数据为空null的情况,这样排序就会乱了,这里以MySQL为例,记录我遇到的问题和解决思路. 问题: 网页要实现table的行鼠标拖拽排序,我用A ...
- SQL注入攻击三部曲之高级篇
SQL注入攻击三部曲之高级篇 经过了入门篇和进阶篇的学习,相信诸位想要破解一般的网站是没有什么问题了,但是先别得意.正所谓学海无涯,技术的进步也是没有止境的.SQL注入是一个看起来简单,但是变数很多的 ...
- SQL注入攻击三部曲之入门篇
SQL注入攻击三部曲之入门篇 服务器安全管理员和攻击者的战争仿佛永远没有停止的时候,针对国内网站的ASP架构的SQL注入攻击又开始大行其道.本篇文章通过SQL注入攻击原理引出SQL注入攻击的实施方法, ...
- hive:数据库“行专列”操作---使用collect_set/collect_list/collect_all & row_number()over(partition by 分组字段 [order by 排序字段])
方案一:请参考<数据库“行专列”操作---使用row_number()over(partition by 分组字段 [order by 排序字段])>,该方案是sqlserver,orac ...
- 带你开发一款给Apk中自动注入代码工具icodetools(完善篇)【申明:来源于网络】
带你开发一款给Apk中自动注入代码工具icodetools(完善篇)[申明:来源于网络] 带你开发一款给Apk中自动注入代码工具icodetools(完善篇):http://blog.csdn.net ...
随机推荐
- LeetCode记录之13——Roman to Integer
能力有限,这道题采用的就是暴力方法,也只超过了39%的用户.需要注意的就是罗马数字如果IXC的后一位比前一位大的采取的是减的方式. Given a roman numeral, convert it ...
- 把磁力下载站改为python系统
已经一年半载没有写博客了,搞得上来不知道写些什么. 索马里影视下载 WWW.IBMID.COM 现在用的是CENTOS 7 系统, 经历了多次点技术变更.开源版本使用了django网站框架重写,之 ...
- QDU_CEF(补)
C - Arthur and Table Arthur has bought a beautiful big table into his new flat. When he came home, A ...
- bzoj1087 互不侵犯King 状压dp+bitset
题目传送门 题目大意:中文题面. 思路:又是格子,n又只有9,所以肯定是状压dp,很明显上面一行的摆放位置会影响下一行,所以先预处理出怎样的二进制摆放法可以放在上下相邻的两行,这里推荐使用bitset ...
- 代理ip的使用以及多进程爬取
一.代理皮的简单使用 简单的看一二例子即可 import requests #代理ip 高频的ip容易被封,所以使用ip代理 #免费代理 ip:www.goubanjia.com 快代理 西祠代理 h ...
- 行业UI设计师总结UI设计8个趋势
纵观整个设计的历史可以发现,设计的历史演变都无一例外都是从复杂的装饰性设计逐步的演化为更加注重功能性的简洁化设计.并且设计师们还在不停的试图通过各种设计语言的创新追求极至设计的可能性.设计潮流变更的核 ...
- (转)Nginx静态服务配置---详解root和alias指令
Nginx静态服务配置---详解root和alias指令 原文:https://www.jianshu.com/p/4be0d5882ec5 静态文件 Nginx以其高性能著称,常用与做前端反向代理服 ...
- how to use Sqoop to import/ export data
Sqoop is a tool designed for efficiently transferring data between RDBMS and HDFS, we can import dat ...
- hibernate离线查询DetachedCriteria清除上次的查询条件
1 原例概述 别名重复问题之后,我们还需要解决的问题就是: 如何清除hibernate的上次查询条件,如果不清除,将会导致上次的查询条件和下次的查询条件合并到了一起. 上次的查询条件和本次的查询条件合 ...
- STL:set用法总结
一:介绍 set是STL的关联式容器,以红黑树(Red-Black Tree)作为底层数据结构.自动去重,保证每个元素唯一,并对数据进行排序. 命名空间为std,所属头文件为<set> 二 ...