当前位置:首页 > 电脑常识 > 正文

DNS Rebinding技术绕过SSRF/代办代理IP限制 8090安适门户

11-20 电脑常识

0x00 传统SSRF过滤

传统SSRF过滤器的方法大抵是以下几个法式:

获取到输入的URL,从该URL中提取host

对该host进行DNS解析,获取到解析的IP

检测该IP是否是合法的,好比是否是私有IP等

如果IP检测为合法的,则进入curl的阶段发包

乍一看,这种过滤方法似乎没有什么问题。

我们从DNS解析的角度看,该检测方法一共有两次,第一次是法式2中对该host进行DNS解析,第二次是使用CURL发包的时候进行解析。这两次DNS解析是有时间差的,我们可以使用这个时间差进行绕过。

0x01 DNS Rebinding绕过

DNS Rebinding不是啥新技术了,之前有人用这个技术来做SOP绕过,我们先来看一下具体流程。

打击者需要本身持有一个域名,然后将这个域名解析指向本身的DNS Server,在该server上写个解析处事,每次返回差此外解析功效。

好比:

DNS Rebinding技术绕过SSRF/代庖代办代理IP限制 8090安详门户

你可以看到,这个解析处事每次返回的功效差别,第一次请求DNS盘问,功效返回的是101.191.60.117,是一个合法的公网IP,但是第二次请求时,酿成了私有IP 10.36.5.215。注意到,这两笔记录的ttl都是0,这是为了防备有DNS处事器对解析功效进行缓存。

说到这里,根基就可以道出绕过道理了。从传统SSRF过滤思路来看,DNS解析一共分两次,此中第一次是至关重要的有效性检测,第二次则是具体倡议的请求。我们操作DNS Rebinding技术,在第一次校验IP的时候返回一个合法的IP,在真实倡议请求的时候,返回我们真正想要访谒的内网IP即可。

该脚本的代码片段如下:

DNS Rebinding技术绕过SSRF/代庖代办代理IP限制 8090安详门户

0x02 IP双重绑定绕过

深入探索一下,一般PHP在获取IP的时候凡是是使用gethostname或者dns_get_record这俩函数。

我在一个域名下,同时绑定两个IP,来看看这两个函数是怎么措置惩罚惩罚的。

DNS Rebinding技术绕过SSRF/代庖代办代理IP限制 8090安详门户

然后执行一下 dns_get_record看看:

DNS Rebinding技术绕过SSRF/代庖代办代理IP限制 8090安详门户

如果使用的是gethostname来获取IP,则只会返回一个,返回哪个IP是随机的。

但是Curl在访谒这种域名的时候,由于绑定的是两个IP,curl会测验考试访谒每一个IP,最终返回有效的阿谁。好比我一个域名绑定了两个IP,一个是1.1.1.1(80端口封锁),一个是2.2.2.2(80端口开放),在curl这个域名的时候,会返回2.2.2.2的请求功效。

如果SSRF过滤逻辑使用的是gethostname或者只获取了dns_get_record返回数组的第一个元素,那么就会存在被绕过的危害。

0x03 实战中的问题

事实上,基于DNS Rebinding的绕过方法在实战中可能会遇到一些问题。

问题一是DNS缓存的问题,即使我们在前面实现的时候设置了TTL为0,但是有些大众DNS处事器,好比114.114.114.114还是会把记录进行缓存,完全不凭据标准协议来,遇到这种情况是无解的。但是8.8.8.8是严格凭据DNS协议去打点缓存的,如果设置TTL为0,则不会进行缓存,从效果上来看,每次dig城市跑去我们的NS处事器上去盘问一遍。

问题二是DNS迭代盘问和递归盘问的问题,往往这边倡议打击,DNS处事器会收到很多差别IP的盘问请求,无法确定与受害处事器相关的来源IP是哪个。为此我一共实现了3版解析脚本,初版很容易想到,首先对来源IP进行搜集,生存在文件中,然后真实倡议请求的时候基于IP列表进行解析,但是后来发明还是很多莫名其妙的来源IP过来。但是仔细检察这些IP,发明都是某个B段或者C段的,很固定,因此第二版是基于IP段过滤,但是又有这种解析flag标识表记标帜位交替禁绝确的问题。

最终,我实现一个时间窗口,用这个时间窗口去返回解析内容,好比前5s返回功效1,后5s返回功效2,对付时间窗口的具体值,需要探测阶段进行统计和测验考试。

温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/12494.html

博客主人杰米WWW
杰米博客,为大家提供seo以及it方面技巧喜欢的朋友收藏哦!
  • 11365文章总数
  • 1378073访问次数
  • 建站天数
  •