目录
第46关 order by注入
第47关 '闭合的order by注入
第48关 无报错回显的数字型order by注入
第49关 无报错回显的'闭合型order by注入
第50关 基于order by的堆叠注入
第51关 '闭合的报错注入或堆叠注入
第52关 数字型盲注或堆叠注入
第53关 '闭合的盲注或堆叠注入
第46关 order by注入
输入?sort=1和?sort=2看一下页面显示。发现返回的数据相同,但是顺序不同,猜测可能是利用了order by排序语句。当sort=1时是根据第一列的字段id来排序,sort=2时根据username字段排序。
在参数后面加上单引号,回显了报错信息,那么使用报错注入试试吧。
第47关 '闭合的order by注入
和上关的区别是使用了单引号包裹,要注意的是,这会导致 SQL 语句将$id当作一个字符串常量来处理,而不是列名或排序索引。由于字符串常量没有实际的排序意义,MySQL 会忽略这个排序条件,通常会按照表中数据的默认顺序返回结果,也就是插入数据时的顺序或者存储引擎决定的物理顺序。所以,无论你输入什么值,返回的结果顺序都不会改变。
第48关 无报错回显的数字型order by注入
利用布尔盲注,构造表达式来影响排序结果。
#如果数据库名长度>5,则按第一列排序,否则按第二列排序;
order by if(length(database())>5,1,2)
这里数据库名长度是8,大于5会按第一列排序,写大于10也会按照第一列排序。因为MySQL 优化了常量表达式:当 IF 的两个分支都是常量时,MySQL 可能认为无论条件如何,排序规则都不变,因此忽略条件判断。所以应该避免使用常量作为排序键,改用与数据相关的表达式。
正确的语法构造是:
#如果条件为真,按 id 列排序,否则按 username 列排序;
order by if(length(database())>5,id,username)
第49关 无报错回显的'闭合型order by注入
这关可以利用时间盲注,但是注意点较多。
?sort=1' and if(length(database())<10,sleep(0),sleep(5)) --+
1.将IF判断设置为,true马上响应,false延迟响应。因为order by是对结果集进行排序,每一行都会计算一次,所以会导致多次延迟(行数次延迟),而且MySQL在排序时可能会优化,利用sleep函数时页面会一直处于长时间加载状态,最终会超过服务器允许的最大响应时间,而被强制终止,返回 500 错误。
2.order by 后面不能直接跟and,它的语法结构只接受列名、表达式或数字位置。不过可以在排序表达式里使用包含and的逻辑条件来实现更复杂的排序规则。
3.这条注入语句破坏了原本正常的order by逻辑。原本order by期望的是列名,注入后变成了一个布尔表达式和 sleep 函数的组合,数据库无法按此进行有效的排序,所以结果可能会是乱序。
第50关 基于order by的堆叠注入
本关使用了mysqli_multi_query函数,那么直接堆叠注入。
第51关 '闭合的报错注入或堆叠注入
第52关 数字型盲注或堆叠注入
第53关 '闭合的盲注或堆叠注入
这三关就是把前面的几关结合在一起,使其有多种解题方法。