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:// 等引起的问题。