为了账号安全,请及时绑定邮箱和手机立即绑定

15000美元漏洞:通过监控调试模式实现远程代码执行

你是否直觉上觉得某个端点可能存在漏洞,但却无法完全理解后端在做什么或者如何利用它?在这篇文章中,我将引导你了解一种方法,这种方法使我的黑盒测试转变为半白盒测试。这种方法让我们发现了多个漏洞,最终还实现了远程代码执行。

找到终点

在阅读其中一个 JavaScript 文件的过程中,我发现有一个名为 ExtraServices 的端点,所以我打开了 Burp 并在 Burp Repeater 中尝试访问该端点。然而,该端点返回了一个略有不同的 404 状态码。所以我猜测这可能是一个不同的主机,并开始使用 ffuf 对该端点进行模糊测试。

请使用下面的命令。

ffuf -c -w <(cat customwordlist.txt ) -u https://company.com/Extraserivce/FUZZ

注:此命令用于使用ffuf工具进行词汇模糊测试。-c 表示使用HTTP连接池,-w 后跟自定义词典路径,-u 指定要测试的URL。

<() 语法,称为进程替换,可以作为一个输入,让程序可以从标准输入读取。在进行 fuzzing 时,我经常使用它,因为它允许我实时调整或修改字典。

例如,如果你找到一个像 api/users/:user:id 这样的端点,并且你想获取所有用户 ID,你可以使用,而不需要先创建一个文件来保存所有用户 ID 再进行模糊测试(fuzzing)。

这是一个命令行工具,用于对指定URL进行模糊测试:来测试一下这个网址: > ffuf -c -w <(seq 1 1337) -u https://company.com/api/users/FUZZ (此处使用FUZZ作为模糊测试的占位符)。

回到Extraserivce端点进行 fuzz 测试,但这次没有得到任何结果,所以我暂时放弃了。几个小时后,我发现之前可以正常工作的许多端点现在几乎都返回了一个自定义的 404 响应,这表明开发人员已经实现了一个功能,使得某些端点会返回 404 响应。因为这个自定义的 404 响应与之前的截图不同,所以我拿了一个之前可以正常工作的端点,在路径前面加了一个反斜杠 \,例如 /\purl/test,返回了 200 OK。因此,我再次对 Extraserivce 端点进行 fuzz 测试,并在前面加上一个反斜杠,然后重新开始测试。

ffuf -c -w <(cat customwordlist.txt ) -u https://company.com/ExtraService/FUZZ

不久以后,我收到一个名叫 callAny 的非常有趣的端点。

根据端点名称和响应内容,我猜测这个端点会接受一个参数并在内部执行类似 call_user_funceval 的函数。于是,我开始对 GET 和 POST 请求参数进行模糊测试,尝试了几个值,例如,诸如。

FUZZ=phpinfo

FUZZ=phpinfo()

FUZZ=phpinfo();

还有很多人可能认为它直接从 POST 请求中获取,不使用请求参数,而是使用类似 php://input 的方式。

所以我开始试着在正文里注入一些代码,比如 <?php phpinfo(); ?>ls 等,

结果没一样真的有用,我也尝试了类似SSRF/LFI(服务器端请求伪造/本地文件包含)这样的方法,但实在搞不懂后台在干啥,所以就放弃了。

监控调试模式来弄清楚后端发生了什么

几天后,在浏览网站时,我收到了下面的错误信息。这表明开发者在生产环境中开启了调试模式,因为调试模式已开启,如果访问任何返回错误的端点,就会显示错误详情,因此我可以知道出了什么问题。于是我迅速访问了ExtraService/并再次调用任一端点,但为时已晚,几秒钟后,开发者关闭了调试模式。

突然想到,为什么我不监控这个端点,当开发人员再次开启调试模式时抓取响应呢?所以我决定监控这个端点,如果响应大小不同,就将响应内容发送到我的 Discord 频道。如果你想学怎么监控目标,下面有个推荐视频。

不久之后,我在discord收到了下面提到的这三个错误。

警告: 未定义的数组键值“Model”在 redacted 行号
警告: 未定义的数组键值“Method”在 redacted 行号
警告: include_once(Models/): 无法打开文件: 没有此文件或目录存在在 redacted 行号

你现在应该知道发生了什么:开发者接受了一个名为 Model 的参数,用来表示一个特定的模型,然后用该方法参数触发模型中的特定函数。你发现其中的漏洞了吗?这实际上是一个 LFI(本地文件包含)漏洞!你可能认为可以包含任何文件,但实际上,你需要一个有效的文件和方法,否则服务器会返回 500 错误。嗯……你只说对了一部分。

除了代码会在包含文件之后执行方法而不是在之前这一点之外,这一点目前其实并不重要,因为我们已经实现了LFI(文件包含漏洞)。

将 LFI 发展为远程代码执行

我最喜欢的方法之一是通过从https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html中的PHP过滤链将LFI提升为RCE,但因为我们不能控制文件的第一部分,所以不能真正使用PHP包装器,所以我们需要更努力地寻找其他方法。使用诸如日志中毒、PHP会话注入和读取proc/self/environ等经典方法,但并没有得到任何有用的成果,因此我决定对网络目录进行模糊测试,寻找可能表明可以写入主机的迹象。

参数=../FUZZ

我然后收到了3个结果,查看了.gitignore,发现了一些有意思的东西。

特别是 log 和 LOG_Path 这两个目录,因为可能记录用户可以控制的一些信息,比如头部信息、参数和 path 等。

所以我决定对这两个目录进行模糊测试(fuzzing),不过幸运的是,我忘记了包含日志目录,所以在进行模糊测试时,我并没有完成这个操作。

Model=../log/FUZZ.txt

设置 Model= ../FUZZ.txt

当我查看响应内容时,我发现 test.txt 中保存了整个对 X-ORIGINAL_URL 的完整 HTTP 请求。

所以我从 test.txt 文件中获取了路径,并在文件的头部嵌入了一个 webshell。

<?php system($_GET['cmd-old']); ?> 然后运行了 ls 命令以作概念验证演示

hackerone:进行安全测试和漏洞报告的平台:https://hackerone.com/0xold

twitter:分享生活和创意的社交平台:https://twitter.com/0x0ld

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消