跳到主要内容

04.SSRF POST 中 URL 参数 (DNS Rebinding)

DNS Rebinding 攻击是一种通过在恶意网站和受害者之间建立一个恶意的 DNS 记录来绕过同源策略的攻击。攻击者可以利用这种漏洞来访问本地网络、绕过防火墙访问内部服务、窃取敏感信息等。

示例代码:

以下是一个简单的示例代码,演示了一个在 POST 请求中存在 SSRF 漏洞的情况,攻击者可以利用这个漏洞进行 DNS Rebinding 攻击。

{
DefaultQuery: "",
Path: "/rebinding/in-post",
Title: "SSRF POST 中 URL 参数 (DNS Rebinding)",
Handler: func(writer http.ResponseWriter, request *http.Request) {
if request.Method == "GET" {
// ...省略表单HTML代码...
return
}

raw, err := ioutil.ReadAll(request.Body)
if err != nil {
writer.Write([]byte(err.Error()))
return
}
values, err := url.ParseQuery(string(raw))
if err != nil {
writer.Write([]byte(err.Error()))
return
}
var u = fmt.Sprint(values.Get("url"))

if u == "" || !check(u) {
writer.Write([]byte("check url failed"))
writer.WriteHeader(http.StatusInternalServerError)
return
}

// 发起HTTP请求到恶意的URL
c := utils.NewDefaultHTTPClient()
timeoutSec, err := strconv.Atoi(values.Get("timeout"))
if err != nil {
writer.Write([]byte("Invalid timeout value"))
return
}

c.Timeout = time.Duration(timeoutSec) * time.Second
rsp, err := c.Get(u)
if err != nil {
writer.Write([]byte(err.Error()))
writer.WriteHeader(http.StatusInternalServerError)
return
}

// 返回HTTP响应
rawResponse, err := utils.HttpDumpWithBody(rsp, true)
if err != nil {
writer.Write([]byte(err.Error()))
return
}
writer.Write(rawResponse)
},
RiskDetected: true,
}

攻击示例:

  1. 修改 ceye.io 的 DNS Rebinding,一个是 vps 地址,另一个是题目的 docker.ip(110.110.2.1)
  2. vps 建立 index.php 内容为<?php header("Location:``http://127.0.0.1:8787/ssrf/flag``"); ?>
  3. 启用 PHP 内置的 Web 服务器监听除 80 和 8080 的任意端口php -S 0.0.0.0:7777
  4. url 填写为http://r.xxxx.ceye.io:7777,爆破数据包至出现 flag

参考地址:https://xz.aliyun.com/t/8707

防御措施:

  • 白名单验证:仅允许请求特定的受信任域名或 IP 地址。
  • 限制超时时间:限制服务器发起请求的超时时间,减少攻击窗口。
  • 检查 URL 格式:验证 URL 参数是否合法,避免构造恶意的 URL。
  • 安全配置:配置服务器和网络设备以限制出站连接,防止与恶意域名建立连接。
  • 使用随机 Token:为每个请求生成随机的 token,并在响应中验证该 token,防止请求被滥用。

靶场演示: 视频