SSRF服务端请求伪造

0x00 SSRF服务端请求伪造

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。与CSRF跨站请求伪造不同,它是利用服务端向其他内外网服务器发送请求。

0x01 原理

很多web应用都提供了从其他的服务器上获取数据的功能。使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等。如果应用程序对用户提供的URL和远端服务器返回的信息没有进行合适的验证和过滤,就可能存在服务端请求伪造的缺陷。这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器。

0x02 危害

  • 1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;

  • 2.攻击运行在内网或本地的应用程序(比如溢出);

  • 3.对内网web应用进行指纹识别,通过访问默认文件实现;

  • 4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);

  • 5.利用file协议读取本地文件等。

0x03 环境搭建

首先我们创建一个test.html,输入如下内容

1
2
3
4
5
6
7
8
<html>
<body>
<form name="ssrf" method="post" action="http://127.0.0.1/ssrf/test.php">
<input type="text" name="url" value="" style="width:500px">
<input type="submit" name="commit" value="submit">
</form>
</body>
</html>

ps:这里我修改css是为了截图时候能截取的全面点,可以不加。

然后写他对应的后台文件test.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php 
error_reporting(0);
if (isset($_POST['url']))
{
$link = $_POST['url'];
$filename = './curled/'.rand().'txt';
$curlobj = curl_init($link);
$fp = fopen($filename,"w");
curl_setopt($curlobj, CURLOPT_FILE, $fp);
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_exec($curlobj);
curl_close($curlobj);
fclose($fp);
$fp = fopen($filename,"r");
$result = fread($fp, filesize($filename));
fclose($fp);
echo $result;
}
?>

其中:

  • curl_init — 初始化一个cURL会话
  • curl_setopt — 设置一个cURL传输选项。
  • CURLOPT_FILE — 设置输出文件的位置,值是一个资源类型,默认为STDOUT (浏览器)。
  • CURLOPT_HEADER — 启用时会将头文件的信息作为数据流输出。
  • curl_exec — 执行一个cURL会话(在初始和设置选项完成后使用)

然后我们通过输入框输入想要访问的url,就会加载对应的url过来,比如我们输入百度主页:

就会返回:

至此我们环境搭建完成。

0x04 漏洞利用

我们上面提到了五种利用方式,我们拿其中的几种做一次实验。

首先是端口扫描,如果我们要对内网端口进行扫描,就可以在这里输入127.0.0.1和对应端口进行尝试。

如我们想查看mysql的banner信息,我们就可以输入127.0.0.1:3306

就可以看到一部分信息。

然后是访问web应用默认文件,比如我们尝试wamp默认界面。直接输入127.0.0.1,访问wamp的默认信息,可以搜集到很多有用的信息。

最后再来尝试一下利用file协议访问本地文件,file协议具体用法是

1
file///c:/abc/filename.txt

file后面与http不同,有三个斜杠,然后跟本地路径和文件,这里可以是任何格式的文件,虽然在网页上显示的时候会有部分无法显示。

我们尝试一个txt文件,发现可以读取。

再尝试一个存放ssh密钥的敏感目录,发现,配置文件和密钥内容其实都可以访问。

0x05 应对

  • 1.过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件,那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

  • 2.统一设置错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

  • 3.限制请求的端口仅为http常用的端口,比如,80,443,8080,8090。

  • 4.将内网ip加入黑名单。

  • 5.禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等。

0x06 总结

SSRF漏洞不如sql注入,xss,文件上传等漏洞有名,所以在很多地方疏于防范,其造成的危害不可小觑。

0x07 补充

php ssrf中的伪协议:

file;dict;sftp;ldap;tftp;gopher;http

Java ssrf 中的伪协议:

file;ftp;mailto;http;https;jar;netdoc;gopher

ssrf攻击负载生成工具:

https://github.com/tarunkant/Gopherus


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!