正文部分
漏洞总结
i. 当遇到当前没有办法打入的资产,在国内有可能是(404,nignx默认页面等等),这时候不妨编写一个工具,去进行页面变化的监控,有可能会有大收获,例如:有新的业务上线。
ii. 当遇到404的时候可以尝试一下对路径进行fuzz,当fuzz的时候都是404的时候,有可能并不是目录不存在,而是对方服务器进行了限制,有可能是权限等问题,这时候可以使用一些方法尝试绕过,例如url编码/;,/等
iii. 当页面存在debug模式的时候,我们可以利用改模式去进行fuzz,去判断我们缺少的参数!
漏洞复现
原文链接:https://medium.com/@0xold
您是否遇到过一个端点,您本能地知道它很脆弱,但您不太了解后端发生了什么或如何利用它?在这篇文章中,我将指导您了解一种将我的黑盒测试转换为半白盒测试的技术。这种方法导致发现了多个漏洞,并最终导致在系统上实现远程代码执行。
通过js获取接口
通过js代码,我发现了一个名为 ExtraServices 的终端节点,但是,终端节点返回了 404 状态代码,但是和服务器直接返回404有一些不同,我使用 ffuf 对路径进行fuzz
使用以下命令
ffuf -c -w <(cat customwordlist.txt ) -u https://company.com/Extraserivce/FUZZ
该语法称为进程替换,充当程序可以从 stdin 读取的输入。我经常在模糊测试目标时使用它,因为它允许我即时调整或修改我的单词列表。<()
例如,如果您找到一个终端节点,并且想要转储所有用户 ID,而不是创建一个新文件来保存所有用户 ID,然后对其进行模糊测试,您只需使用api/users/:user:id
ffuf -c -w <(seq 1 1337) -u https://company.com/ api/users/FUZZ
回到 Extraserivce[1] 端点,模糊测试这个端点没有产生任何结果,所以我决定暂时保留它
发现非常规404页面
然后几个小时后,我再次对这个站点进行测试,我发现一些之前可以返回数据的路径的现在几乎都返回自定义的 404 响应,也就证明了这个404并不是服务器进行返回的,而是后端处理自定义的,开发人员实现了一个功能,可以为某些端点返回 404 响应,
于是我对一个之前可以返回数据路径进行测试,尝试绕过,在路径 的开头之前添加了一个反斜杠,例如 /purl/test,它返回了 200 OK。
以此类推,我重新尝试 Extraserivce[2] 端点,并在它前面添加了一个反斜杠,然后再次开始对其进行模糊测试
ffuf -c -w <(cat customwordlist.txt ) -u https://company.com/Extraserivce/FUZZ
不久之后,我收到了一个新的路径:/CallAny
根据端点名称和响应,我认为这个端点正在接受一个参数,然后在 call_user_func 或 eval 或任何执行代码的类似函数中执行它,所以我开始对 GET、POST 请求参数的端点进行模糊测试,其中包含几个值,例如
FUZZ=phpinfo
FUZZ=phpinfo()
FUZZ=phpinfo();
还有更多人认为它直接从 POST 请求中获取,而无需使用类似 php://input 包装器的请求参数
所以我开始尝试在正文中注入 phpinfo <?php phpinfo();?> ls 等内容
但没有任何真正有效的方法,我还尝试了 SSRF/LFI 之类的东西,但我无法真正弄清楚后端发生了什么,所以我放弃了它。
发现调试页面
几天后,在浏览网站和测试其他功能时,我收到了下面的错误,这是一个PHP的调试页面,表明开发人员在生产中开启了调试模式,因为启用了调试模式,如果导航到任何返回错误的端点,它将显示错误详细信息,因此我将能够知道出了什么问题,所以我再次快速导航到 Extraserivce/callany 端点,但是我为时已晚,开发人员几秒钟后关闭调试模式。
一个想法在我脑海中闪过:如果开发人员再次打开调试模式,我为什么不监控此终端节点并获取响应呢?所以我决定监控端点并检查响应大小是否不同,然后对其断点进行判断
通过监控获取到debug出现时机,获取到隐藏参数,成功任意文件读取
不久之后,我在我的 discord 上收到了以下 3 个错误
_Warning: Undefined array key “Model” in redacted on line
__Warning: Undefined array key “Method” in redacted on line
_Warning: include_once(Models/): Failed to open stream: No such file or directory in redacted on line
通过debug的报错,获取到了Model参数,同时发现了一个关键函数:_include_once_,直接尝试使用include_once去进行敏感文件的读取!!
有关于 include_once 函数的利用可以看一下这篇文章:
✔__PHP文件包含漏洞全面总结 - Zeker62 - 博客园 (cnblogs.com)
利用include_once实现任意文件包含rce
使用经典方法,读取 proc/self/environ 等敏感文件,并没有真正返回任何结果,因此我决定对 Web 目录进行模糊测试,寻找可能表明写入主机的方法的线索
Model=../.gitignore
然后我收到了 3 个结果。读取 .gitignore 发现了一些有趣的文件
特别是 log 和 LOG_Path 目录,因为它可能会记录一些用户可以控制的内容,例如 headers/params/path 等
所以我决定对这 2 个目录进行模糊测试,但幸运的是,在模糊测试时我忘记了包含日志目录,所以没有这样做
Model=../log/FUZZ.txt
我做了 Model= ../FUZZ.txt
当我查看响应时,我发现 test.txt 的内容存储了 X-ORIGINAL_URL 端点的整个 HTTP 请求
所以我请求了文件中的路径test.txt并在标题中添加了一个 webshell
T:<?php system($_GET['cmd-old']); ?> 然后执行 ls 命令作为概念验证
同时因为任意文件读取,导致test.txt被当成代码去执行了,成功实现rce!!
原文始发于微信公众号(fkalis):【海外SRC赏金挖掘】通过页面资产监控,拿下1500美刀!!
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论