注:本文仅提供参考学习
SSRF定义
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
个人理解:就是接受了客户端输入的URL,然后服务器端拿你的URL去请求并返回给你。
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漏洞
排除法一:
你可以直接右键图片,在新窗口打开图片,如果是浏览器上URL地址栏是http://www.baidu.com/img/bd_logo1.png,说明不存在SSRF漏洞。
排除法二:
你可以使用burpsuite等抓包工具来判断是否不是SSRF,首先SSRF是由服务端发起的请求,因此在加载图片的时候,是由服务端发起的,所以在我们本地浏览器的请求中就不应该存在图片的请求.(host www.baidu.com就不是)
1分享:通过URL地址分享网页内容
2转码服务
3在线翻译(通过URL地址翻译对应文本的内容。提供此功能的国内公司有百度、有道等)
4图片加载与下载:通过URL地址加载或下载图片
图片加载远程图片地址此功能用到的地方很多,但大多都是比较隐秘,比如在有些公司中的加载自家图片服务器上的图片用于展示。(此处可能会有人有疑问,为什么加载图片服务器上的图片也会有问题,直接使用img标签不就好了? ,没错是这样,但是开发者为了有更好的用户体验通常对图片做些微小调整例如加水印、压缩等,所以就可能造成SSRF问题)
5图片、文章收藏功能
此处的图片、文章收藏中的文章收藏就类似于功能一、分享功能中获取URL地址中title以及文本的内容作为显示,目的还是为了更好的用户体验,而图片收藏就类似于功能四、图片加载。
6未公开的api实现以及其他调用URL的功能
7从URL关键字中寻找
ssrf修复方式
可以采取白名单,限制内网Ip。
对返回内容进行识别
禁用一些不必要的协议
统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态
SSRF暂时总结到这里,继续加油!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。