SSRF
定义
- SSRF(server-site request forery,服务端请求伪造)是一种构造请求,由服务端发起请求的安全漏洞。
- 一般情况下,SSRF的目标就是与外部隔离的内网资源。
- 很多web应用提供了从其他服务器上获取数据的功能。使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等。
SSRF漏洞原理
- 形成原因:服务端提供了从其他服务器获取数据的功能,但没有对内网目标地址做过滤和限制
- 只要方式:
- 对外网、服务器所在内网、本地进行端口扫描,获取Banner信息。
- 测试运行再内网或本地的应用程序。
- 利用file协议读取本低文件。
- 代码分析
SSRF漏洞利用
- 利用SSRF进行文件读取
产生SSRF的PHP函数
-
(ssrf攻击可能存在任何语言编写的应用,接下来我们将展示php中可能存在SSRF漏洞的函数。)
-
file_get_content() :
- 以下代码使用file_get_contents函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。
<?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; ?>
-
fsockopen()
- 实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。
<?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; } } ?>
-
curl_exec()
- 使用curl发送请求获取数据
<?php if (isset($_POST['url'])) { $link = $_POST['url']; $curlobj = curl_init(); curl_setopt($curlobj, CURLOPT_POST, 0); curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, TRUE); TRUE将curl_exec()获取的信息以字符串返回,而不是直接输出。 $result=curl_exec($curlobj); curl_close($curlobj); $filename = './curled/'.rand().'.txt'; file_put_contents($filename, $result); echo $result; } ?>
利用SSRF进行内网资源访问
-
一般情况下讲Web应用程序暴露再互联网可以通过Web浏览器进行访问。但是会将内网资源封闭起来,避免与外部交互。那么如果网站存在SSRF漏洞,可以利用SSRF进行内网资源访问
-
利用SSRF进行端口扫描
eg:http://127.0.0.1/ssrf/ssrf.php?url=http://127.0.0.1:3306