最近遇到了一些有意思的ssrf漏洞,写一篇文章来记录一下bypass ssrf的一些思路。

0x00 ssrf

ssrf的全名为服务端请求伪造。通俗的理解就是你提供一个url或者ip,服务端帮你请求,然后将结果返回给你。

0x01 危害

危害主要有这么两点:
1.内网探测。
2.作为跳板攻击内网应用,如redis、fastcgi。

0x02 防御思路

对于一个大型企业来说ssrf显然是一个非常高危的漏洞,自然要进行防御。那么常见的防御思路有哪些呢?
一般ssrf的形式为http://www.baidu.com/index.php?url=xxx。url中的参数一般为一个url链接或者ip。在不影响业务功能的前提下正确防御ssrf的思路分为两步:

  1. 从url中正确提取出host。
  2. 分析host是否合法。一般的方法是设置ip黑名单。

0x03 bypass 思路

根据防御的思路,讲一下bypass的一些技巧。
针对第一步,思考如何构造url。整理了一下有以下几种构造方法:

  1. http://www.baidu.com@10.1.1.1
  2. http://10.1.1.1#www.baidu.com
  3. http://www.baidu.com.th1s.cn
  4. http://10.1.1.1%0a@www.baidu.com

针对第二步,思考如何构造ip。

  1. 利用八进制、十进制、十六进制的IP地址绕过。举个例子:012.0.0.1、0xa.0.0.1、167772161、10.1、0xA000001
  1. 利用301或者302跳转http://www.th1s.cn/test/ssrf.phpssrf.php里面的内容为:<?php header('Location:10.1.1.1');?>
  1. http://www.10.1.1.1.xip.io
  1. 利用dns将域名解析为内网ip。http://test.th1s.cn->10.1.1.1
  1. dns rebinding。来自rr菊苣的文章

dns rebinding

针对这样的防御ssrf流程:先提取域名进行解析,然后进行ip黑名单验证。
1.png
在图上标注了这个流程其实会有两次dns解析,如果在第一次dns解析的时候我们解析得到的ip不在黑名单范围内,然后在第二次真正发起请求时将域名解析为内网ip是否就能成功访问内网了呢?

搭建一个dns服务器(网上copy一段dns代码然后修改一下),将ttl设置成0。可以看到我们第一次dns请求和第二次dns请求的ip已经发生了变化。
2.png

在实际测试中利用该方法已经能够访问内网了。

其它参考资料

谈一谈如何在Python开发中拒绝SSRF漏洞