简介
SSRF (server-site request forgery,服务端请求伪造) 是一种构造请求, 由服务端发起请求的安全漏洞。
一般情况下,攻击者无法直接访问到内网资源,但如果服务器存在SSRF漏洞,攻击者就可以利用SSRF攻击访问外网无法访问的内网资源。
SSRF漏洞形成的原因是服务端提供了从其他服务器获取数据的功能,比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等,但没有对内网目标地址做过滤与限制。
SSRF通常被用来进行端口扫描,所以这个漏洞也叫XSPA,全称cross site port attack,跨站点端口攻击。
正常用户:输入A网站URL --> A服务器接受请求(没有过滤),并处理 -->返回 攻击者:输入A网站URL(包含伪造请求B) --> A服务器接受请求并请求B服务 -->返回
漏洞危害
1、 读取或更新内部资源,造成本地文件泄露; 2、 扫描内网主机端口并获取服务器上运行的服务版本,攻击相应应用,如redis、JBoss、Weblogic、Zabbix、mongoDB、mysql、fastcgi、memcache、discuz…… 3、 将含有漏洞主机用作代理/跳板攻击内网主机,绕过防火墙
SSRF漏洞相关的函数和协议
Php中产生ssrf漏洞的函数
1、 file_get_contents() 函数从用户指定的url获取内容,然后指定一个文件名j进行保存,并展示给用户 2、 fsockopen() 函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据 3、 curl_exec() 执行指定的CURL会话 4、 fopen() 5、 readfile()
前三种比较多见,后续我们主要讨论第三种 curl_exec() 导致的漏洞
curl_exec漏洞代码示例
<?php
if (isset($_POST['url'])){
$link = $_POST['url'];
$curlobj = curl_init();// 创建新的 cURL 资源
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);// 设置 URL 和相应的选项
$result=curl_exec($curlobj);// 抓取 URL 并把它传递给浏览器
curl_close($curlobj);// 关闭 cURL 资源,并且释放系统资源
<span class="nv">$filename</span> <span class="o">=</span> <span class="s1">'./curled/'</span><span class="o">.</span><span class="nb">rand</span><span class="p">()</span><span class="o">.</span><span class="s1">'.txt'</span><span class="p">;</span>
<span class="nb">file_put_contents</span><span class="p">(</span><span class="nv">$filename</span><span class="p">,</span> <span class="nv">$result</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>
}
?>
Curl可利用协议与漏洞
- dict (操作 Redis)
- file (任意文件读取)
- ftp、ftps (FTP 爆破)
- tftp(UDP 协议扩展)
- gopher (操作 Redis、Memcached)
- imap/imaps/pop3/pop3s/smtp/smtps(爆破邮件用户名密码)
- rtsp
- smb/smbs (连接 SMB)
- telnet - 连接 SSH/Telnet
- http、https - 内网服务探测:
网络服务探测 ShellShock 命令执行 JBOSS 远程 Invoker war 命令执行 Java 调试接口命令执行 axis2-admin 部署 Server 命令执行 Jenkins Scripts 接口命令执行 Confluence SSRF Struts2 一堆命令执行 counchdb WEB API 远程命令执行 mongodb SSRF docker API 远程命令执行 php_fpm/fastcgi 命令执行 tomcat 命令执行 Elasticsearch 引擎 Groovy 脚本命令执行 WebDav PUT 上传任意文件 WebSphere Admin 可部署 war 间接命令执行 Apache Hadoop 远程命令执行 zentoPMS 远程命令执行 HFS 远程命令执行 glassfish 任意文件读取和 war 文件部署间接命令执行
这里面比较常用的协议有http、file、gopher、dict等
SSRF漏洞定位
判断漏洞存在的方法
判定目标网站的后端程序 是否可以被控制用于向外界发送请求 1. 页面回显(常见) 2. 延时: 对比访问不同 IP/域名的访问时长,比如对百度与 Google(国内访问受限)的访问时间,访问百度的时间通常比Google快,若是则可能存在漏洞 3. 伪造dns请求到外面的dns服务器,查日志: 利用我们手中的域名和dns服务器,让目标站点尝试向该域名发送请求,如果能发送请求,必然会先进行dns查询,将域名转化为ip,那么我们的dns服务器上就可以收到该dns查询请求。(可以利用ceye.io) 4. 伪造请求的到自己监听的公网服务,查日志 我们自己的主机上开放一个tcp端口(可以直接利用nc或者自己写一个服务端程序)让目标主机尝试向我们自己的主机发送请求,如果我们的tcp端口收到了连接请求,那么就证明目标主机存在ssrf漏洞。
容易出现SSRF的地方
凡是能够对外发起网络请求的地方,且地址可被用户可控的,都有可能存在 SSRF 漏洞。
- RSS 订阅
- 字幕下载
- 收取第三方邮箱邮件
- 转码服务
- 在线翻译
- 图片加载与下载(通过URL地址加载或下载图片)
- 图片、文章收藏功能
- 网站采集、网页抓取的地方
- 头像的地方(远程加载头像)
- 文件处理:处理音视频的 ffmpeg、图片的 ImageMagic、Office,PDF 文档解析、 XML 解析器
- 一切要你输入网址的地方和可以输入ip的地方
- 抓包分析:从URL关键字中寻找:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain、site
参考: https://blog.csdn.net/bylfsj/article/details/105083164 https://blog.csdn.net/Fly_hps/article/details/83046613 https://www.jianshu.com/p/c4dc22699a42 https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html https://www.jianshu.com/p/612c010e588e http://blog.leanote.com/post/snowming/e2c24cf057a4
|