2024金盾信安杯Web赛题深度解析:绕过技巧与实战应用
1. 绕过exit()函数的艺术从死亡函数到代码执行在Web安全竞赛中遇到exit()这类死亡函数时很多新手会直接放弃。但实际通过PHP的编码特性我们可以巧妙绕过这个限制。让我用一个真实案例来解释这个技术要点。去年我在某次渗透测试中就遇到过类似场景。目标系统使用file_put_contents()函数写入文件时自动在内容前拼接了?php exit(); ?。常规思路下这段代码会立即终止程序执行导致后续注入的恶意代码无法生效。但通过深入研究PHP的流过滤器机制我发现了一个绝妙的绕过方法。php://filter伪协议配合base64解码是关键。具体原理是当使用convert.base64-decode过滤器时PHP会忽略所有非base64字符即不在A-Z、a-z、0-9、、/这64个字符范围内的内容。原始代码中的?php exit(); ?经过这个过滤后只有phpexit这7个字符会被保留。而base64解码需要4字节对齐所以我们只需要补一个任意字符比如字母a就能凑齐8字节。实际操作时构造的payload形如file_put_contents(php://filter/convert.base64-decode/resourceshell.php, aPD9waHAgZXZhbCgkX1BPU1RbYV0pOw);这个技巧的精妙之处在于前置的字母a用于补齐字节后面跟着的是?php eval($_POST[a]);的base64编码解码后死亡函数被破坏而我们的木马保持完整2. php://filter的进阶玩法不只是base64很多选手只知道用base64解码绕过其实php://filter还有更多高阶用法。在最近一次CTF比赛中我就遇到了需要多层过滤器嵌套的情况。比如这个payload结构php://filter/convert.iconv.UTF-8.UTF-7|convert.base64-decode/resourcetest.php这里先用iconv将UTF-8转UTF-7改变了原始数据的编码格式再配合base64解码。这种组合拳能绕过某些特殊的过滤检测。实测中还发现几个实用技巧大小写转换用string.toupper或string.tolower过滤器可以干扰某些正则检测字符替换string.strip_tags可以去除特定标签压缩流zlib.deflate和zlib.inflate的组合能创造新的攻击面特别提醒不同PHP版本对过滤器的处理可能有差异。建议在本地用Docker搭建对应版本的环境进行测试我就在PHP5.6和PHP7.4上遇到过截然不同的行为。3. SSRF漏洞的花式绕过技巧去年给某企业做安全审计时发现他们的SSRF防护存在典型缺陷——只检测了file://这种完整协议字符串。通过简单的变形就能绕过file:\///etc/passwd file:////etc/passwd File:///etc/passwd大小写混淆更高级的绕过方式包括IP地址变形十进制IPhttp://2130706433 127.0.0.1八进制IPhttp://0177.0.0.1十六进制IPhttp://0x7f.0x0.0x0.0x1域名重定向 利用短网址服务或可控DNS记录将域名解析到127.0.0.1协议混淆使用非标准端口http://127.0.0.1:80evil.com利用URL解析差异http://127.1/省略后面的.0.1在实战中我发现127.0.0.2到127.255.255.254这个范围经常被开发者忽略。某次比赛中就是通过http://127.0.0.2/flag.php直接拿到了flag。4. 实战中的信息搜集与利用很多Web题目的突破点都藏在细节里。以hoverfly这道题为例我当时的解题思路是首先确认漏洞存在通过搜索引擎发现hoverfly有公开漏洞尝试常规payload文件读取发现都是假flag转换思路到命令执行发现页面信息与命令回显存在对应关系使用grep全局搜索grep -r flag{ /快速定位真实flag位置这里有个实用技巧当遇到需要猜测文件名的场景时不要盲目尝试。应该先用find / -type f -mtime -1这样的命令查找最近修改过的文件或者用grep -r 关键词 /进行内容搜索。在最近一次比赛中我还发现组合使用locate和stat命令能快速定位关键文件locate flag | xargs stat -c %n %y | sort -k2这个命令能按修改时间排序所有包含flag的文件极大提高了效率。5. 防御视角的思考与建议站在开发者的角度我总结了几点防御建议对于文件写入操作严格限制写入目录禁用危险协议php://、phar://等对内容进行严格校验针对SSRF防护使用白名单校验域名和IP禁用所有非必要协议检查重定向行为考虑使用DNS重绑定防护命令执行防护避免直接拼接用户输入使用参数化查询设置严格的权限控制在开发过程中我习惯用Docker搭建不同版本的测试环境用strace和tcpdump监控系统调用和网络流量这样能更直观地理解攻击者的操作路径。