DNS Rebinding Bypass SSRF
字数 1296 2025-08-10 08:28:29

DNS Rebinding 绕过 SSRF 漏洞详解

1. DNS Rebinding 基本概念

DNS Rebinding(DNS 重新绑定)是一种计算机攻击技术,它通过滥用域名系统(DNS)来绕过同源策略(SOP)的保护。

攻击原理:

  • 恶意网页导致访问者运行客户端脚本
  • 脚本攻击网络上其他位置的计算机
  • 通过操纵DNS解析结果绕过同源策略

在SSRF中的特殊应用:

当SSRF检测机制通过DNS解析后的IP地址来判断是否为安全地址时,攻击者可以利用DNS Rebinding进行绕过。

2. 传统SSRF过滤流程分析

典型的SSRF防护机制通常包含以下步骤:

  1. 获取输入的URL,从中提取host
  2. 对该host进行DNS解析,获取解析的IP
  3. 检测该IP是否合法(如是否为私有IP等)
  4. 如果IP检测合法,则进入curl阶段发送请求

关键漏洞点:这个过程存在两次DNS解析(第一次检查时和实际请求时),两次请求之间存在时间差。

3. DNS Rebinding 攻击实施

攻击步骤:

  1. 攻击者注册一个域名(如attacker.com),并配置DNS服务器
  2. 服务器配置极短的TTL(生存时间)记录,防止响应被缓存
  3. 受害者访问恶意域时:
    • 第一次DNS响应返回合法IP地址
    • 第二次DNS响应返回恶意IP地址

TTL的重要性:

TTL(Time To Live)决定DNS记录在缓存中的存留时间。设置极小的TTL可以防止DNS解析结果被缓存,确保每次都能返回不同的解析结果。

4. 简化攻击的工具和平台

无需自建DNS服务器的替代方案:

  1. ceye.io:提供DNS解析服务
  2. Rebinder:在线DNS Rebinding工具(https://lock.cmpxchg8b.com/rebinder.html)

5. 实战案例分析(HuaweiCTF题目)

漏洞代码分析:

app.get('/flag', function(req, res){
    if(req.ip === '127.0.0.1') {
        res.status(200).send(env.parsed.flag)
    } else
        res.status(403).end('not so simple');
});

app.post('/admin', (req, res) => {
    if(!req.body.fileurl || !check(req.body.fileurl)) {
        res.end("Invalid file link")
        return
    }
    let file = req.body.fileurl;
    cp.execSync('sleep 5')
    let options = {
        url: file,
        timeout: 3000
    }
    request.get(options,(error, httpResponse, body) => {
        if(!error) {
            res.set({
                "Content-Type": "text/html; charset=utf-8"
            })
            res.end(body)
        } else {
            res.end(JSON.stringify({
                "code": "-1",
                "message": error.toString()
            }))
        }
    });
})

检查函数分析:

const check = function(s) {
    // 基础检查
    if(!typeof(s) == 'string' || !s.match(/^http\:\/\//)) return false
    
    let blacklist = ['wrong', '127.', 'local', '@', 'flag']
    let host, port, dns;
    host = url.parse(s).hostname
    port = url.parse(s).port
    if(host == null || port == null) return false
    
    // 关键点:DNS查询
    dns = dnslookup(host);
    
    // 检查条件
    if(ip.isPrivate(dns) || dns != docker.ip || ['80', '8080'].includes(port)) return false
    
    // 黑名单检查
    for(let i = 0; i < blacklist.length; i++) {
        let regex = new RegExp(blacklist[i], 'i');
        try {
            if(ip.fromLong(s.replace(/[^\d]/g, '').substr(0, 10)).match(regex)) return false
        } catch(e) {}
        if(s.match(regex)) return false
    }
    return true
}

攻击利用步骤:

  1. 使用Rebinder平台生成一个域名:

    • 配置A记录1:指向攻击者VPS
    • 配置A记录2:指向题目要求的docker.ip
    • 设置极短TTL(如1秒)
  2. 在VPS上搭建Web服务(使用非80/8080端口):

    <?php header("Location:http://127.0.0.1/flag"); ?>
    
  3. 构造Payload:

    http://xxxxxx.7925af9a.rbndr.us:9024/
    
  4. 反复发送请求,利用时间差:

    • 检查时解析为docker.ip
    • 实际请求时解析为VPS地址,然后重定向到127.0.0.1/flag

6. 防御措施

有效的防护方案:

  1. 域名白名单

    • 如果应用只接受固定或可控范围的域名,应创建白名单进行校验
  2. 沙箱环境

    • 对于不可控的域名,使用沙箱环境进行数据请求
    • 实现内网分离
  3. 其他防护措施

    • 禁用DNS缓存或设置极短缓存时间
    • 在应用程序中直接解析IP并锁定,避免多次解析
    • 实施严格的网络层过滤

7. 关键点总结

  1. DNS Rebinding利用两次DNS解析的时间差
  2. 极短的TTL是攻击成功的关键
  3. 检查与实际请求分离是漏洞根源
  4. 通过重定向可以绕过部分关键字过滤
  5. 攻击需要多次尝试(因DNS解析不确定性)

通过深入理解DNS Rebinding原理和实际案例分析,安全人员可以更好地防御此类攻击,同时也能在授权测试中有效验证系统安全性。

DNS Rebinding 绕过 SSRF 漏洞详解 1. DNS Rebinding 基本概念 DNS Rebinding(DNS 重新绑定)是一种计算机攻击技术,它通过滥用域名系统(DNS)来绕过同源策略(SOP)的保护。 攻击原理: 恶意网页导致访问者运行客户端脚本 脚本攻击网络上其他位置的计算机 通过操纵DNS解析结果绕过同源策略 在SSRF中的特殊应用: 当SSRF检测机制通过DNS解析后的IP地址来判断是否为安全地址时,攻击者可以利用DNS Rebinding进行绕过。 2. 传统SSRF过滤流程分析 典型的SSRF防护机制通常包含以下步骤: 获取输入的URL,从中提取host 对该host进行DNS解析,获取解析的IP 检测该IP是否合法(如是否为私有IP等) 如果IP检测合法,则进入curl阶段发送请求 关键漏洞点 :这个过程存在两次DNS解析(第一次检查时和实际请求时),两次请求之间存在时间差。 3. DNS Rebinding 攻击实施 攻击步骤: 攻击者注册一个域名(如attacker.com),并配置DNS服务器 服务器配置极短的TTL(生存时间)记录,防止响应被缓存 受害者访问恶意域时: 第一次DNS响应返回合法IP地址 第二次DNS响应返回恶意IP地址 TTL的重要性: TTL(Time To Live)决定DNS记录在缓存中的存留时间。设置极小的TTL可以防止DNS解析结果被缓存,确保每次都能返回不同的解析结果。 4. 简化攻击的工具和平台 无需自建DNS服务器的替代方案: ceye.io :提供DNS解析服务 Rebinder :在线DNS Rebinding工具(https://lock.cmpxchg8b.com/rebinder.html) 5. 实战案例分析(HuaweiCTF题目) 漏洞代码分析: 检查函数分析: 攻击利用步骤: 使用Rebinder平台生成一个域名: 配置A记录1:指向攻击者VPS 配置A记录2:指向题目要求的docker.ip 设置极短TTL(如1秒) 在VPS上搭建Web服务(使用非80/8080端口): 构造Payload: 反复发送请求,利用时间差: 检查时解析为docker.ip 实际请求时解析为VPS地址,然后重定向到127.0.0.1/flag 6. 防御措施 有效的防护方案: 域名白名单 : 如果应用只接受固定或可控范围的域名,应创建白名单进行校验 沙箱环境 : 对于不可控的域名,使用沙箱环境进行数据请求 实现内网分离 其他防护措施 : 禁用DNS缓存或设置极短缓存时间 在应用程序中直接解析IP并锁定,避免多次解析 实施严格的网络层过滤 7. 关键点总结 DNS Rebinding利用两次DNS解析的时间差 极短的TTL是攻击成功的关键 检查与实际请求分离是漏洞根源 通过重定向可以绕过部分关键字过滤 攻击需要多次尝试(因DNS解析不确定性) 通过深入理解DNS Rebinding原理和实际案例分析,安全人员可以更好地防御此类攻击,同时也能在授权测试中有效验证系统安全性。