SQL 注入系统学习(三):MySQL 函数与替代
本文仅用于 CTF、靶场、本机实验和明确授权环境。
面试中常见的问题是:“SUBSTRING() 被过滤怎么办?”真正稳妥的回答不是背另一个函数名,而是先说清楚原函数承担什么能力,再选择同义函数、等价表达式或另一条反馈通道。
1. 截取字符串
1 | SUBSTRING('abcdef',2,3) -- bcd |
SUBSTR()、MID() 是 SUBSTRING() 的同义形式。LEFT() 和 RIGHT() 适合从两端取值。
SUBSTRING 被过滤
1 | SUBSTR |
逗号同时被过滤
MySQL 支持标准语法:
1 | SUBSTRING('abcdef' FROM 2 FOR 3) |
只取某位置到结尾:
1 | SUBSTRING('abcdef' FROM 2) |
截取函数全部不可用
换成模式或整体比较:
1 | value LIKE 'a%' |
如果页面能直接回显完整值,就没有必要逐字符截取。
2. 字符串长度
1 | LENGTH(value) |
区别:
1 | LENGTH / OCTET_LENGTH 字节数 |
UTF-8 环境中:
1 | LENGTH('中') 常为 3 |
只处理 ASCII flag 时常得到相同字符长度,但遇到多字节内容不能混用。
3. 字符与数字转换
1 | ASCII('A') -- 65 |
替代路线:
1 | ASCII 被过滤 → ORD 或 HEX |
多字节字符、连接字符集和表达式类型都可能改变结果,需要在对应版本验证。
4. 十六进制字面量
1 | 0x61646d696e |
对应字符串是 admin。
用途:
1 | 避免直接出现字符串引号 |
十六进制值在不同上下文中可能作为二进制字符串或数字处理,不能脱离表达式判断。
5. 字符串拼接
1 | CONCAT('ab','cd') |
注意 NULL:
1 | CONCAT('a',NULL) -- NULL |
替代路线:
1 | CONCAT 被过滤 → CONCAT_WS |
6. 条件函数
1 | IF(1=1,'yes','no') |
等价能力:
1 | CASE WHEN 1=1 THEN 'yes' ELSE 'no' END |
如果表达式只放在 WHERE 中,往往可以直接使用条件:
1 | WHERE LENGTH(value) > 5 |
没有必要为了使用 IF() 而增加一层结构。
7. 空值处理
1 | value IS NULL |
不要混淆:
1 | IS NULL 判断是否为空 |
8. 比较与模式匹配
1 | value = 'admin' |
等号被过滤
候选:
1 | value LIKE 'admin' |
大于、小于被过滤
可研究:
1 | BETWEEN low AND high |
这些不是无条件等价。NULL、隐式类型转换和 collation 都可能改变语义。
9. 大小写与 collation
1 | LOWER(value) |
是否区分大小写主要受排序规则影响。调用 LOWER() 和改变比较所用 collation 是不同层次的处理。
10. 信息函数替代
| 目的 | 常用 | 替代 |
|---|---|---|
| 当前库 | DATABASE() |
SCHEMA() |
| 版本 | VERSION() |
@@version |
| 登录用户 | USER() |
SESSION_USER()、SYSTEM_USER() |
| 权限用户 | CURRENT_USER() |
语义独立,不宜直接等同 |
| SQL 模式 | @@sql_mode |
从语法行为侧面推测 |
11. 常用替代速查
| 所需能力 | 首选 | 候选替代 | 注意事项 |
|---|---|---|---|
| 截取 | SUBSTRING |
SUBSTR、MID、LEFT、RIGHT |
方向和参数不同 |
| 无逗号截取 | SUBSTRING(x,1,1) |
SUBSTRING(x FROM 1 FOR 1) |
MySQL 支持 |
| 长度 | LENGTH |
OCTET_LENGTH、CHAR_LENGTH、BIT_LENGTH |
单位不同 |
| 字符转数值 | ASCII |
ORD、HEX |
多字节需验证 |
| 数值转字符 | CHAR |
UNHEX、十六进制 |
字符集与类型 |
| 拼接 | CONCAT |
CONCAT_WS |
NULL 行为不同 |
| 条件 | IF |
CASE WHEN、直接逻辑 |
返回类型可能变化 |
| 空值替代 | IFNULL |
COALESCE |
参数数量不同 |
| 精确比较 | = |
LIKE、IN、BETWEEN、STRCMP |
NULL 与 collation |
| 多行合并 | GROUP_CONCAT |
LIMIT 逐行 |
长度与回显限制 |
12. 面试回答模板
遇到“这个函数不能用怎么办”:
1 | 1. 说明原函数承担的能力 |
下一篇进入盲注:怎样把未知数据拆成真假问题,以及如何稳定地使用布尔和时间反馈。
参考资料
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 DOUCUBE!
评论