简介
SSRF:服务器请求伪造,是一种攻击者构造形成由服务端发起请求 的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
个人理解:服务器接收了你构造的代码,然后去执行,执行后将结果返回给你
SSRF原理
大都是因为服务端提供从其他服务器获取数据功能,并且没有对目标地址做过滤和限制造成的、比如从指定URL获取网页加载图片下载等等。
php下面函数的使用不当可能会导致SSRF
curl()
file_get_contents()
fsockopen()
例子
观察URL,发现服务端提供了URL查询
尝试访问百度及本机3306端口
访问成功获取信息,确定存在ssrf漏洞
下面我们来查看一下源码到底为什么会导致这个漏洞
<?php
if (isset($_GET["url"])) {
if (!empty($_GET["url"])) {$url = $_GET['url'];
}
$ch = curl_init();//初始化curl会话
curl_setopt($ch, CURLOPT_URL, $url);//指定请求的url
curl_setopt($ch, CURLOPT_HEADER, 0);// 启用时会将头文件的信息作为数据流输出。参数为1表示输出信息头,为0表示不输出
curl_exec($ch);
curl_close($ch);
}
可以看到采用了curl函数请求URL资源回显在前端,并且没做任何过滤或限制。从而导致了用户可能可以通过这个漏洞进行一些内网服务探测等等。非常危险!
file_get_contents造成的SSRF
$url = $_GET['url'];
echo file_get_contents($url);
利用php://input伪协议
file_get_content如果访问一个不存在的地址,会爆出绝对路径
ssrf危害
1. 扫内网
2. 向内部任意主机的任意端口发送精心构造的Payload
3. DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
4. 攻击内网的web应用,主要是使用GET参数就可以实现的攻击(比如struts2,sqli等)
5. 利用file协议读取本地文件等(file_get_content函数,利用伪协议读取)
ssrf验证方式和常见的地方
1.因为SSRF漏洞是构造服务器发送请求的安全漏洞,所以我们就可以通过抓包分析发送的请求是否是由服务器的发送的来判断是否存在SSRF漏洞
2.在页面源码中查找访问的资源地址 ,如果该资源地址类型为 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞
排除法1
你可以直接右键图片,在新窗口打开图片,如果是浏览器上URL地址栏是http://www.baidu.com/img/bd_logo1.png,说明不存在SSRF漏洞。
排除法2
你可以使用burpsuite等抓包工具来判断是否不是SSRF,首先SSRF是由服务端发起的请求,因此在加载图片的时候,是由服务端发起的,所以在我们本地浏览器的请求中就不应该存在图片的请求.(host www.baidu.com就不是)
ssrf修复方式
可以采取白名单,限制内网Ip。
对返回内容进行识别
禁用一些不必要的协议
统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态