sky's blog

SSRF学习

字数统计: 801阅读时长: 3 min
2017/08/19 Share

SSRF概念

SSRF(Server-Side Request Forgery ,服务器端请求伪造)是一种由攻击者构造形成由服务器发起请求的一个安全漏洞,SSRF的主要攻击目标为外网无法访问的内部系统

产生原因

SSRF形成的原因是服务端提供了从其他服务器应用获取数据的功能,在用户可控的情况下,未对目标地址进行过滤与限制,导致此漏洞的产生。
比如从指定URL地址获取网页文本内容,加载指定地址的图片等,都是SSRF容易出现的点。图片地址这种较为常见,其它的发生点,需要具体情况具体判断。

危害

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

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

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

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

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

常用的php后端实现(注:代码来自freebuf)

file_get_contents

1
2
3
4
5
6
7
8
9
10
11
<?php
if (isset($_POST['url']))
{
$content = file_get_contents($_POST['url']);
$filename ='./images/'.rand().';img1.jpg';
file_put_contents($filename, $content);
echo $_POST['url'];
$img = "<img src=\"".$filename."\"/>";
}
echo $img;
?>

这段代码使用file_get_contents函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。

fsockopen()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php 
function GetFile($host,$port,$link)
{
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if (!$fp) {
echo "$errstr (error number $errno) \n";
} else {
$out = "GET $link HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= "\r\n";
fwrite($fp, $out);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
?>

这段代码使用fsockopen函数实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。

curl_exec()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php 
if (isset($_POST['url']))
{
$link = $_POST['url'];
$curlobj = curl_init();
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($curlobj);
curl_close($curlobj);

$filename = './curled/'.rand().'.txt';
file_put_contents($filename, $result);
echo $result;
}
?>

这是另外一个很常见的实现。使用curl获取数据。

如何防御

通常有以下5个思路:

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

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

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

4 黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。

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

点击赞赏二维码,您的支持将鼓励我继续创作!
CATALOG
  1. 1. SSRF概念
  2. 2. 产生原因
  3. 3. 危害
  4. 4. 常用的php后端实现(注:代码来自freebuf)
    1. 4.1. file_get_contents
    2. 4.2. fsockopen()
    3. 4.3. curl_exec()
  5. 5. 如何防御