SSRF漏洞

SSRF漏洞

SSRF概念

服务端请求伪造(Server-Side Request Forgery),指的是攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。

SSRF原理

很多web应用都提供了从其他的服务器上获取数据的功能。使用指定的URL,web应用便可以获取图片,下载文件,读取文件内容等。SSRF的实质是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。

SSRF漏洞可能出现的地方

直接输入1次#,并按下space后,将生成1级标题。输入2次#,并按下space后,将生成2级标题。以此类推,我们支持6级标题。有助于使用语法后生成一个完美的目录。

图解

在这里插入图片描述

SSRF漏洞危害

1.可以对外网服务器所在的内网、本地进行端口扫描,获取一些服务的banner息 。
2.对内网web应用进行指纹识别,通过访问默认文件实现 。
3.利用file协议读取本地文件等。
4.攻击运行在内网或者本地的应用程序。
在这里插入图片描述

代码分析

PHP中下面函数的使用不当会导致SSRF:
curl_exec() :执行一个curl会话
file_get_contents() :把整个文件读入一个字符串中。
fsockopen() :打开一个网络连接或者一个Unix套接字连接

漏洞示例代码(curl_exec()函数):

<?php if(isset($_GET['url'])) { $link=$_GET['url']; $filename='./'.rand().'.txt'; $curlobj=curl_init($link); curl_setopt($curlobj,CURLOPT_FILE,$link); curl_setopt($curlobj,CURLOPT_HEADER,0); $result=curl_exec($curlobj); curl_exec($curlobj); curl_close($curlobj); fclose($link); file_put_contents($filename, $result); echo $result; } ?>

漏洞示例代码(file_get_contents()函数):

<?php //内网请求:http://x.x.x.x/xx.index if(isset($_GET['file']) && $_GET['file'] !=null){ $filename = $_GET['file']; $str = file_get_contents($filename); echo $str; } ?>

SSRF防御方式

1.过滤返回的信息,如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。 2、统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态。 3、限制请求的端口,比如80,443,8080,8090。 4、禁止不常用的协议,仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp://等引起的问题。 5、使用DNS缓存或者Host白名单的方式。