通过监控调试模式实现1.5万美元的远程代码执行漏洞挖掘
$15k RCE Through Monitoring Debug Mode
你是否遇到过这样的端点:直觉告诉你它存在漏洞,但却无法理解后端发生了什么或如何利用它?在本报告中,我将带你了解一个将我的黑盒测试转变为半白盒测试的技术。这种方法最终导致了多个漏洞的发现,并实现了系统的远程代码执行。
发现端点
在阅读某个JavaScript文件时,我发现了一个名为ExtraServices的端点。我立即在Burp Repeater中请求该端点,但返回了404状态码——不过这个404与主机通常返回的略有不同。我猜测可能是不同的主机,于是开始使用ffuf进行模糊测试:
ffuf -c -w <(cat customwordlist.txt) -u https://company.com/Extraserivce/FUZZ
这里的<()语法称为进程替换,允许程序从stdin读取输入。我经常在模糊测试时使用它,因为可以动态调整词表。
例如,如果你发现类似api/users/:user:id的端点,想转储所有用户ID,可以直接使用:
ffuf -c -w <(seq 1 1337) -u https://company.com/api/users/FUZZ
回到ExtraService端点,模糊测试没有结果。几小时后,我发现之前可用的端点现在都返回自定义404响应——这表明开发者实现了某些功能来屏蔽端点。通过在路径前添加反斜杠(如/\purl/test),我成功绕过了这个限制。
发现关键端点callAny
重新对ExtraService端点进行模糊测试后,我发现了一个名为callAny的有趣端点。基于名称和响应,我猜测这个端点可能接收参数并通过call_user_func或eval等函数执行代码。
我尝试了各种注入方式:
- GET/POST参数如
FUZZ=phpinfo - 直接POST请求体注入
<?php phpinfo(); ?> - SSRF/LFI测试
但都没有成功。
利用调试模式获取后端信息
几天后,我在测试其他功能时收到了错误提示——这表明开发者意外在生产环境开启了调试模式。虽然很快被关闭,但我决定监控这个端点,准备在下次调试模式开启时捕获错误详情。
通过设置监控,我在Discord频道收到了三个关键错误:
Warning: Undefined array key "Model"...
Warning: Undefined array key "Method"...
Warning: include_once(Models/): Failed to open stream...
现在漏洞很明显了:开发者使用Model参数包含特定模型文件,然后通过Method参数触发模型中的方法。这实际上是一个本地文件包含(LFI)漏洞!
从LFI升级到RCE
我最喜欢的LFI转RCE方法是通过PHP过滤器链,但由于无法控制文件开头部分,我不得不采用其他方法。尝试了日志污染、PHP会话注入、读取/proc/self/environ等方法无果后,我决定模糊测试web目录。
在测试中,我意外发现test.txt文件存储了X-ORIGINAL_URL端点的完整HTTP请求。于是我在请求头中注入webshell:
T: <?php system($_GET['cmd-old']); ?>
然后成功执行了ls命令作为概念验证。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码


浙公网安备 33010602011771号