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防护机制通常包含以下步骤:
- 获取输入的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题目)
漏洞代码分析:
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
}
攻击利用步骤:
-
使用Rebinder平台生成一个域名:
- 配置A记录1:指向攻击者VPS
- 配置A记录2:指向题目要求的docker.ip
- 设置极短TTL(如1秒)
-
在VPS上搭建Web服务(使用非80/8080端口):
<?php header("Location:http://127.0.0.1/flag"); ?> -
构造Payload:
http://xxxxxx.7925af9a.rbndr.us:9024/ -
反复发送请求,利用时间差:
- 检查时解析为docker.ip
- 实际请求时解析为VPS地址,然后重定向到127.0.0.1/flag
6. 防御措施
有效的防护方案:
-
域名白名单:
- 如果应用只接受固定或可控范围的域名,应创建白名单进行校验
-
沙箱环境:
- 对于不可控的域名,使用沙箱环境进行数据请求
- 实现内网分离
-
其他防护措施:
- 禁用DNS缓存或设置极短缓存时间
- 在应用程序中直接解析IP并锁定,避免多次解析
- 实施严格的网络层过滤
7. 关键点总结
- DNS Rebinding利用两次DNS解析的时间差
- 极短的TTL是攻击成功的关键
- 检查与实际请求分离是漏洞根源
- 通过重定向可以绕过部分关键字过滤
- 攻击需要多次尝试(因DNS解析不确定性)
通过深入理解DNS Rebinding原理和实际案例分析,安全人员可以更好地防御此类攻击,同时也能在授权测试中有效验证系统安全性。