标签 - ssrf

? bypass ? ? ssrf ? ? DNS Rebinding Attack ?    2020-01-10 17:23:32    2902    0    0

前言

在这篇文章:谈一谈如何在 Python 开发中拒绝 SSRF 漏洞 里面提出:

title

这种处理流程真的能避免 SSRF 吗?

可以避免的有:

  1. 直接访问内网 IP
  2. 302 跳转
  3. xip.io/xip.name 及短链接变换等 URL 变形
  4. 畸形 URL
  5. iframe 攻击
  6. IP 进制转换

title
......

看起来似乎很完美,但是还有一种攻击可以绕过此种处理流程,就是 DNS Rebinding Attack。

DNS Rebinding Attack(DNS 重绑定攻击)

攻击原理:

一般进行 ssrf 防御的模式如下:

title

  1. 获取到输入的URL,从该URL中提取host
  2. 对该host进行DNS解析,获取到解析的IP
  3. 检测该IP是否是合法的,比如是否是私有IP等
  4. 如果IP检测为合法的,则进入curl的阶段发包

观察到,在这个流程中,一共进行了两次DNS解析:第一次是对URL的host进行DNS解析,第二次是使用CURL发包的时候进行解析。这两次DNS解析是有时间差的,我们可以使用这个时间差进行绕过。

事件差对应的DNS中的机制是TTL。TTL表示DNS里面域名和IP绑定关系的Cache在DNS上存活的最长时间。即请求了域名与iP的关系后,请求方会缓存这个关系,缓存保持的时间就是TTL。而缓存失效后就会删除,这时候如果重新访问域名指定的IP的话会重新建立匹配关系及cache。

在上面的流程中,如果在DNS第二次解析的时候,我们能够更换URL对应的IP,那么在TTL之后、缓存失效之后,重新访问此URL的话,就能获取被更换后的IP。如果我们把第一次解析的IP设为合法IP,就能绕过host合法性检查了;把第二次解析的IP设为内网IP,就达到了SSRF访问内网的目的。

在这个过程中,对于浏览器来说,整个过程访问的都是同一域名,所以认为是安全的。这就会导致绕过。

所以总结一下:

DNS 重绑定攻击的原理是:利用服务器两次解析同一域名的短暂间隙,更换域名背后的ip达到突破同源策略或过waf进行ssrf的目的。

时间窗口问题:

TTL 最理想的设置是0,即在第一次解析之后,立马换位我们想要访问的内网IP。

但是现实

? bypass ? ? ssrf ?    2020-01-10 17:23:24    780    0    0

前言

IP 变形主要是为了 bypass,在 SSRF 中,我们可以通过 IP 变形来避免命中黑名单。

方法1:省略 0

x.x = x.0.0.x

title

x.x.x = x.x.0.x

title

方法2:xip.io(xip.name)

title

方法3:短链接

通过短链接生成器生成url对应的短链接。

比如:https://tool.chinaz.com/tools/dwz.aspx

转换本机地址:

title

转换内网地址:

title

方法4:进制转换

通过 IPFuscator 这个工具可实现进制转换。进制转换包括八进制、十进制、十六进制、混合进制。进制转换后的结果跟原四位点分十进制IP完全等同。

title

方法5:畸形 URL

此种方法可以 bypass ssrf 的白名单过滤机制。

http://www.baidu.com@zhihu.com = http://zhihu.com

http://www.baidu.com@127.0.0.1/ = http://127.0.0.1

方法6:punycode

IDN(英语:Internationalized Domain Name,缩写:IDN)即为国际化域名,又称特殊字符域名,是指部分或完全使用特殊的文字或字母组成的互联网域名。包括法语、阿拉伯语、中文、斯拉夫语、泰米尔语、希伯来语或拉丁字母等非英文字母,这些文字经多字节万国码编译而成。在域名系统中,国际化域名使用Punycode转写并以美国信息交换标准代码(ASCII)字符串储存。

由于cURL也支持IDN,可以进行Punycode编码,所以我们也可以用来绕过日常的 ssrf 等漏洞的利用限制。

title

punycode解码:①②⑦ => 127

punycode 编码工具网站:https://tw.piliapp.com/symbol/


参考链接:

[1] 那些不为人知的ip
[2] Punycode,垃圾桶,LZ1Y,2018年7月18日