【实战复盘】通过监控调试模式获取15,000美元的远程代码执行收益

admin 2026-02-08 00:43:05 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 安全研究员通过监控目标网站的调试模式,成功将本地文件包含漏洞升级为远程代码执行。首先在JavaScript中发现ExtraServices端点,经模糊测试找到callAny接口。利用调试模式暴露的错误信息,确认存在Model和Method参数导致的LFI漏洞。通过读取.gitignore发现日志目录,结合X-ORIGINAL_URL请求头日志实现日志投毒,最终写入webshell获取RCE,获得15000美元漏洞赏金。 综合评分: 85 文章分类: 渗透测试,漏洞分析,实战经验,WEB安全,漏洞POC


cover_image

【实战复盘】通过监控调试模式获取 15,000 美元的远程代码执行收益

原创

Pwn1 Pwn1

漏洞集萃

2026年2月7日 10:05 山东

免责声明 本公众号所发布的文章内容仅供学习与交流使用,禁止用于任何非法用途。

你是否曾经遇到过这样的情况:你直觉上知道某个端点存在漏洞,但却无法理解其后端运行机制或如何利用它?本文将介绍一种将黑盒测试转变为半白盒测试的技术。这种方法最终发现了多个漏洞,并最终实现了对系统的远程代码执行。

发现接口

在阅读一个 JavaScript 文件时,我发现了一个名为 ExtraServices 的端点,于是我打开 Burp 并使用 Burp Repeater 请求了该端点。

然而…… e 端点返回了 404 状态码,但与主机通常返回的 404 状态码略有不同,所以我怀疑可能是不同的主机,于是开始使用 ffuf 对该端点进行模糊测试。

使用以下命令

ffuf -c -w <(cat&nbsp;customwordlist.txt ) -uhttps://company.com/Extraserivce/FUZZ

<() 语法,也称为进程替换,用作程序从标准输入读取数据的输入。我经常在模糊测试目标时使用它,因为它允许我动态调整或修改我的字典。

例如,如果您找到一个类似 api/users/:user:id 端点,并且想要导出所有用户 ID,与其创建一个新文件来保存所有用户 ID 然后进行模糊测试,不如直接使用以下方法:

ffuf -c -w <(seq 1 1337) -u https://company.com/ api/users/FUZZ

回到 Extraservice 端点,模糊测试没有得到任何结果,所以我决定暂时搁置。几个小时后,我发现之前可以正常工作的一些端点现在几乎都返回了自定义的 404 响应。我知道开发者实现了一个功能,使得某些端点返回 404 响应。

我之所以知道这一点,是因为这个 404 响应与上面的截图不同。所以我抓取了一个之前可以正常工作的端点,并在路径开头添加了一个反斜杠,例如 /\purl/test,结果返回了 200 OK。于是我抓取了Extraservice端点,并在路径开头添加了一个反斜杠,然后再次开始模糊测试。

不久之后,我收到了一个非常有趣的端点,它的名字也很有趣, 叫做 callAny

根据端点名称和响应,我推测该端点会接收一个参数,然后在 call_user_func 或 eval 或任何类似的执行代码的函数中执行该参数。因此,我开始使用一些参数值对该端点进行模糊测试,包括 GET 和 POST 请求参数,例如:

FUZZ=phpinfo

FUZZ=phpinfo()

FUZZ=phpinfo();

还有许多人认为,也许它可以直接从 POST 请求中获取数据,而无需请求参数,例如使用类似 php://input wrapper 的东西。

所以我开始尝试注入类似 phpinfo 之类的东西<?php phpinfo(); ?>body中的 ls 等

但是所有方法都不管用,我还尝试了 ssrf/lfi之类的方法,但我实在搞不清楚后端发生了什么,所以就放弃了。

监控调试模式

几天后,我在浏览网站并测试其他功能时收到了以下错误。这表明开发人员在生产环境中启用了调试模式。由于启用了调试模式,如果导航到任何返回错误的端点,它将显示错误详细信息,因此我能够知道哪里出了问题。所以我迅速再次导航到 Extraservice/callany端点,但是为时已晚,开发人员在几秒钟后关闭了调试模式。

我突然想到,为什么不监控这个端点,并在开发者再次开启调试模式时抓取响应呢?于是我决定监控这个端点,检查响应大小是否不同,如果不同,就把响应详情发送到我的 Discord 频道。如果你想学习如何监控目标,我推荐观看下面的视频。

不久之后,我的 Discord 上收到了以下 3 个错误信息。

警告:第 10 行(已编辑)中未定义数组键“Model”。

警告:第 10 行(已编辑)中未定义数组键“Method”。

警告:include_once(Models/): 打开流失败:没有该文件或目录(位于已编辑的第 1 行)

你现在可能已经明白发生了什么:开发者使用了一个名为 Model 的参数来引入一个特定的模型,然后使用method 参数来触发该模型上的一个特定函数。

你发现漏洞了吗?这是一个本地文件包含漏洞 (LFI)!你可能会想,好吧,你可以引入任何文件,但仍然会报错,因为你需要一个有效的文件和一个有效的方法,否则服务器会再次返回 500 状态码。

除了代码会在包含文件之后而不是之前触发该方法之外,这一点目前并不重要,因为我们已经实现了本地包含 (lfi)。

将本地文件包含攻击升级为远程代码执行

我最喜欢/最快捷的将本地文件包含攻击 (LFI) 升级到远程代码执行 (RCE) 的方法之一是使用 PHP 过滤器链,详情请见 https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html 。

但由于我们无法控制文件的第一部分,因此无法使用 PHP 包装器,所以我们需要更进一步。

使用诸如日志投毒、PHP 会话注入、读取proc/self/environ 等传统方法并没有取得任何成果,所以我决定模糊测试 Web 目录,寻找可能指向写入主机的方法的线索。

然后我得到了 3 个结果。读取 .gitignore文件后发现了一些有趣的文件。

特别是 log 和LOG_Path 目录,因为它可能会记录一些用户可以控制的内容,例如标头/参数/路径等。

所以我决定对这两个目录进行模糊测试,但幸运的是,在模糊测试过程中我忘记包含日志目录,所以并没有……

Model=../log/FUZZ.txt

我执行了 Model= ../FUZZ.txt

当我查看响应时,发现 test.txt 的内容存储了 X-ORIGINAL_URL 端点的整个 HTTP 请求。

所以我请求了 test.txt 文件中的路径,并在请求头中添加了一个 webshell。

T:<?php system($_GET[‘cmd-old’]); ?> 然后执行 ls 命令作为poc验证。

来源:https://medium.com/@0xold/15k-rce-through-monitoring-debug-mode-4f474d8549d5

觉得本文内容对您有启发或帮助? 点个关注➕,获取更多深度分析与前沿资讯!

👉 往期精选

注册功能漏洞检查清单

一种利用 HTTP 重定向循环的新型 SSRF 技术

API 渗透实战:从 JSON 响应倒推隐藏的高危路由

使用 Frida 在运行时拦截 OkHttp – 实用指南

一种利用 HTTP 重定向循环的新型 SSRF 技术


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:漏洞集萃 Pwn1 Pwn1《【实战复盘】通过监控调试模式获取 15,000 美元的远程代码执行收益》

评论:0   参与:  0