玩得一手好注入之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 注入方法介绍

正常页面:

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后面的值进行异或,得到如下结果。

  排序前                        排序后                
  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 默认是升序排列的,所以页面显示的是如下的效果:

?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 

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放在前面也是可以执行的。当然这种情况不大常见。

0×03 小小的总结

由于采用预编译执行SQL语句时传入的参数不能作为SQL语句,所以像order by xxx desc这里的排序规则还是只能用拼接,

因此order by后的注入或许能够成为后续漏洞挖掘重点关注的SQL注入点。

原文地址:https://www.cnblogs.com/firstdream/p/8386037.html

时间: 2024-10-12 17:31:06

玩得一手好注入之order by排序篇的相关文章

UVALive 6467 Strahler Order 拓扑排序

这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ 以后能用CIN还是CIN吧 QAQ 贴代码了: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostre

MySQL中order by排序时,数据存在null咋办

order by排序是最常用的功能,但是排序有时会遇到数据为空null的情况,这样排序就会乱了,这里以MySQL为例,记录我遇到的问题和解决思路. 问题: 网页要实现table的行鼠标拖拽排序,我用AngularJs集成了一个TableDnD开源插件,可以实现,然后在数据库表中增加一个排序字段indexId,但是原来的大量数据是没有排序过的,所以该字段为null. 这样order by时,为null的数据就会排在最前边. 写个测试表模拟一下,如下效果: 解决办法: 最优办法:利用MySQL中的一

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all;  Select 列 into 新表;字符串函数;日期函数 SQL聚合函数 MAX(最大值).MIN(最小值).AVG(平均值).SUM(和).COUNT(数量:记录的条数) 聚合函数对null不计算.如果一行数据都是null,count(*)包含对空值行.重复行的统计. --聚合函数演示 selec

去重 ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段) RN

关键字  ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段) RN 按照分组字段进行排序并标编号 ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段) RN 语法 ROW_NUMBER() OVER(PARTITION BY XMJL_UID ORDER BY XMCREATETIME) RN 实例 SELECT XMJL_UID,XMJL,XMCREATETIME,ROW_NUMBER() OVE

带你开发一款给Apk中自动注入代码工具icodetools(开凿篇)

一.前言 从这篇开始咋们开始一个全新的静态方式逆向工具icodetools的实现过程,这个也是我自己第一次写的个人觉得比较有用的小工具,特别是在静态方式逆向apk找关键点的时候,后续会分为三篇来详细介绍这个工具实现: 第一篇:开凿篇,简单介绍实现原理以及简单的初次方案实现简单的apk注入代码功能 第二篇:填坑篇,这一篇是在前一篇的基础上对工具的优化,可以应对市面上大部分的apk代码注入功能实现 第三篇:生产篇,这一篇是在前两篇的基础上利用这个工具来实际操刀如何进行快速定位应用的关键方法功能 还记

SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。

top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 order by用在表名的后面 order by后面就填你要按它排序的字段,是升序排序(从小到大排序) percent:百分比 %=percent 比如要显示5%的数据处理,不能写top 5%,而是top 5 percent 提示:如果top 5 percent出来的数是3.1条数据的话,是取四条数据,而不

ORDER BY排序子句

10.ORDER BY排序子句 用于指定将查询结果排序的字段. //查询emp表所有记录,结果按ename升序排列 select empno,ename from emp order by ename asc;//asc可以省略,默认为asc //查询emp表所有记录,结果按sal降序排列 select empno,ename,sal from emp order by sal desc; //查询emp表所有记录,结果按入职日期排列, //近期入职在前,早期入职在后面 select empno

带你开发一款给Apk中自己主动注入代码工具icodetools(开凿篇)

一.前言 从这篇開始咋们開始一个全新的静态方式逆向工具icodetools的实现过程.这个也是我自己第一次写的个人认为比較实用的小工具,特别是在静态方式逆向apk找关键点的时候.兴许会分为三篇来具体介绍这个工具实现: 第一篇:开凿篇,简介实现原理以及简单的初次方案实现简单的apk注入代码功能 第二篇:填坑篇.这一篇是在前一篇的基础上对工具的优化,能够应对市面上大部分的apk代码注入功能实现 第三篇:生产篇.这一篇是在前两篇的基础上利用这个工具来实际操刀怎样进行高速定位应用的关键方法功能 还记得那

单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询

今日内容 表查询 单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询 单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) u