0x00 前言

​ 前几天我读了两篇非常棒的论文:第一篇是发表在blackhat.com上的“A New Era of SSRF ”,讲述的是不同编程语言的SSRF问题;第二篇是由Positive Technology发表的一篇名为“PHP Wrapper” 的论文,它主要讲述的是如何以多种不同的方式使用PHP Wrapper来绕过过滤器以及受过滤的输入(您可以在结尾处找到这两个链接)。

​ 在本文中,我将深入介绍一些SSRF技术,您可以使用这些技术攻击那些使用filter_var()或preg_match()等过滤器的PHP脚本,并且可以使用curl或file或file_get_contents()来获取HTTP内容。

对于抓娃娃机的一种典型的SSRF攻击

引用OWASP上的定义:

​ 在服务器端请求伪造(SSRF)攻击中,攻击者可以利用服务器上的功能来读取或更新内网资源。 攻击者可以配置或更改与服务器上运行的代码有关的URL链接来读取或提交数据,此外,通过精心构造的URL,攻击者可以读取服务器配置,例如AWS元数据,连接到启用http数据库的内部服务器中抑或是对内部的非公开服务发起post请求。

0x09 对URL解析函数进行SSRF

parse_url()是用于解析一个 URL 并返回一个包含在 URL 中出现的各种组成部分关联数组的PHP函数。这个函数并不是要验证给定的URL,它只是将它分解成上面列出的部分。 部分网址也可以作为parse_url()的输入并被尽可能的正确解析。

​ 在一个PHP脚本中去bypass一个用于将部分字符串转换为一个变量的的正则表达式是我们最喜欢研究的技术之一。这项工作是否成功最终将由Bash来认定。例如:

1
0://evil$google.com

使用“Bash中变量的语法”来绕过过滤器并利用SSRF

​ 使用这种方式,我让bash将$google分析为一个空变量,并且使用curl请求了evil .com。 这是不是很酷?:)

​ 然而这只发生在curl语法中。 实际上,正如上面的屏幕截图所示,由parse_url()解析的主机名仍然是 evil\$google.com。 \$ google变量并没有被解释。 只有当使用了exec()函数而且脚本又使用$r[‘host’]来创建一个curl HTTP请求时,Bash才会将其转换为一个空变量。

​ 显然,这个工作只是为了防止PHP脚本使用exec()或system()函数来调用像curl,wget之类的系统命令。

0x10 win环境中data://之于XSS

​ 另一个使用file_get_contents()代替PHP使用system()或exec()调用curl的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
echo "Argument: ".$argv[1]."\n";
// check if argument is a valid URL
if(filter_var($argv[1], FILTER_VALIDATE_URL)) {
// parse URL
$r = parse_url($argv[1]);
print_r($r);
// check if host ends with google.com
if(preg_match('/google\.com$/', $r['host'])) {
// get page from URL
$a = file_get_contents($argv[1]);
echo($a);
} else {
echo "Error: Host not allowed";
}
} else {
echo "Error: Invalid URL";
}
?>

​ 正如你所见,file_get_contents()在使用之前描述的相同技术验证之后使用了原始参数变量。 让我们尝试通过注入一些文本来修改响应主体,如“I Love PHP”:

1
data://text/plain;base64,SSBsb3ZlIFBIUAo=google.com

尝试控制响应主体

​ parse_url()不允许将文本设置为请求主机,并且它返回了“not allowed host”正确拒绝解析。不要绝望! 有一件事我们可以做,我们可以尝试将某些东西“注入”URI的MIME类型部分……因为在这种情况下,PHP不关心MIME类型…也是,又有谁在乎呢?

1
data://google.com/plain;base64,SSBsb3ZlIFBIUAo=

向响应体注入 “I love PHP”

接下来进行XSS攻击便是小菜一碟了…

1
data://text.google.com/plain;base64,<...b64...>

使用之前描述的技术进行简单的XSS

以上便是全部,感谢观看!

Positive Technologies: “PHP Wrappers” http://bit.ly/2lXk1e8
Orange Tsai: “A new era of SSRF” http://ubm.io/2FdUu9F