DNS Rebinding 攻击

话说在django官网上浪的时候,发现在news上发现他们修复了DNS Rebinding漏洞,就顺手查了一下这是个什么东西.

效果

能够获取到http://localhost:*/*下的html,然后可以成功发送到黑客的服务器上.

流程

  1. 你访问黑客网站www.A.com
  2. 黑客老早之前就设置好了DNS过期时间为60秒
  3. 黑客的网站很吸引你,你成功逗留了60秒
  4. 黑客通过ajax发起了一个请求A/info.php
  5. 浏览器和你都觉得觉得一切都很正常,然后黑客在你访问之后的第0秒就更换ip为127.0.0.1(或者内网ip,怎么拿到内网ip又是另一件事).所以实际访问的是127.0.0.1/info.php.
  6. 成功拿到信息.

仔细想想过程,在发起请求A/info.php的时候,浏览器判定为正常,非跨域.所以成功访问了.

防范

  1. 业内加大DNS过期最小值.(拖延战术没P用)
  2. 浏览器的可以制定个规则,跨域名不行,跨ip也不行.(不好,跨域名我就不喜欢了,再来个限制更差劲)
  3. 开发人员不要在local开启任何提权的措施,就当和直接暴露在公网上一样.(🙄)
  4. 通过判断host,每个请求都有一个host,表明自己想访问的那个域名,然后在localhost启动的服务都校验一下host,只允许localhost或者127.0.0.1等白名单来访问就好了.

又到了http神坑总结时间,现在的规则是: 1. 在http 1.0里,host可能不存在. 2. http 1.1里host必须存在客户端保证,不存在服务器必须返回400.但是可以为空(呵呵,在我看来又是垃圾协议,毁我青春,为什么会存在为空host?).

总结

没事别开启debug, debug了就会有风险.像这种漏洞完全想不到... 另外,设置ALLOW_HOSTS是个好习惯.