偶尔走失,从未离开

好久没有更blog了,惭愧惭愧,这两个月也思考了很多东西,有机会写出来。

文章目录:

双ip绑定绕过

在SSRF漏洞的绕过中,巧妙利用dns往往可以起到很好的效果,大家最常提到的是dns rebinding。

本文提到的是另一种绕过方法 双ip绑定绕过

0x01 验证逻辑

在防御SSRF的代码中,一般会使用如下逻辑: (以php为例)

1.解析目标URL,获取其Host
2.解析Host,获取Host指向的IP地址
3.检查IP地址是否为内网IP

1是比较好解决的,问题大多都出在2,3上,dns rebinding针对的就是2,3过程。

0x02 验证函数

在php中,获取域名对应的ip地址有如下方法:

1.使用gethostbyname()获取域名的ip,检查其是否为内网ip

2.使用dns_get_record()获取其dns的第一条记录,

3.也见过使用ping来获取指向ip,然后用正则匹配出来,这种在某些程度上可以防御dns rebinding。

0x03 绑定双ip

为我们的同一个域名绑定多个A记录

第2个ip是一个不存在的主机。

0x04 绕过原理

  • gethostbyname()

gethostbyname函数可以返回给定域名的ip地址。

但是当我们绑定了2个ip时,它就有点不正常了,会随机返回其中一个ip。

有时候返回:

2.png

有时候返回:

3.png

只要验证时返回第二个,就可以通过验证,进入发包阶段

  • dns_get_record()

本函数可以获取给定url的dns A记录,并以数组的形式返回,所以开发者需要获取其第一条记录。

但是我们绑定了2个ip之后,将会返回如下结果:
4.png

也就是说,依然可以通过验证,进入发包阶段。不过这里需要注意下A记录的添加顺序,

0x05 如何利用

第一个函数是利用其返回结果的不确定性进行绕过,第二个函数是利用其返回值有多个进行绕过,但是这只是绕过了验证,能正常进行发包吗?

服务器代码如下(过滤部分略):

<?php                                                                                                                                                
function curl($url){                                                         
    $ch = curl_init();                                                       
    curl_setopt($ch, CURLOPT_URL, $url);                                     
    curl_setopt($ch, CURLOPT_HEADER, 0);                                     
    curl_exec($ch);                                                          
    curl_close($ch);                                                         
}                                                                            
$url = $_GET['url'];
print $url;                                                                  
curl($url);

成功返回结果:

这是因为当域名绑定了多个ip时,curl会逐个访问,直到返回正常为止~

198.181.40.183主机不存在http服务,所以会接着访问127.0.0.1,成功绕过验证利用~

0x06 实战意义,适用场景

可能有人会有这样的疑问,验证ip之后,如果程序直接使用的是验证后的'合法'ip,比如上文中的198.181.40.183,那该怎么办呢?

这种情况在实际环境中几乎不会出现,比如网站获取远程图片的功能

http://www.xxx.com/upload/img/xxxx.jpg

正常人的思维更倾向于验证合法之后直接使用,而不是将原有url各种拆分和拼接,而且有些网站并不支持直接用ip访问~

此外,在很多dns rebinding失效的场景中,该方法都可以起到奇效。

比如验证代码是连续多次获取ip来验证,这时rebinding就可能失效了,但是该方法将依然有效。

 标签: none

作者  :  watcher


添加新评论