SSRF中的Bypass
主要记录一下SSRF漏洞利用过程中的绕过手段。
在ssrf链接提交的地方屏蔽了内网地址127.0.0.1
可以使用其他的表达方式绕过,等价的绕过方法有
- 127.0.0.1.xip.io
xip.io将类似site.10.0.0.1.xio.io这样的域名解析成10.0.0.1
[::]代替127.0.0.1
十进制的ip地址,同理2进制16进制
使用
@
符号如果服务器使用的是PHP或者go对URL进行解析,使用的函数应该是
parse_url
。这个函数对于host的解析是以@
符号后面为基准的。
DNS Rebinding Attack
引用http://blog.leanote.com/post/snowming/e2c24cf057a4
- 获取到输入的URL,从该URL中提取host
- 对该host进行DNS解析,获取到解析的IP
- 检测该IP是否是合法的,比如是否是私有IP等
- 如果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的目的。
DNS服务器
1 | from twisted.internet import reactor, defer |
在SSRF漏洞点输入此伪造DNS服务器的地址。第一次请求的时候伪造DNS服务器返回的是合法的IP地址,受害网站验证通过,开始进行curl请求。此时伪造DNS服务器返回的是内网地址,实现攻击。
gopher协议注意事项
更新一下写gopher的时候的注意事项
gopher协议的格式为gopher://IP:port/_{TCP/IP数据流},协议前面的
_
不要忘记。URL编码后的%0A要替换为%0D%0A,表示换行
Content-Length长度一定要正确