Skip to main content

08.完全开放重定向

完全开放重定向漏洞是一种常见的安全漏洞,发生在应用程序中对外部用户提供的重定向功能上。攻击者可以通过构造恶意的重定向链接,将用户导向恶意网站或恶意内容,从而进行钓鱼攻击、会话劫持等恶意行为。这种漏洞通常发生在没有对用户提供的重定向目标进行充分验证的情况下。

示例代码:#

以下是一个示例漏洞代码,模拟了一个完全开放的重定向漏洞:

{    DefaultQuery: "destUrl=/redirect/main",    Path:         "/redirect/basic",    Title:        "完全开放重定向",    Handler: func(writer http.ResponseWriter, request *http.Request) {        var u = LoadFromGetParams(request, "destUrl")        if strings.Contains(u, `redirect/basic`) {            DefaultRender("<p>forbidden to " + strconv.Quote(u) + "</p>", writer, request)            return        }        writer.Header().Set("Location", u)        writer.WriteHeader(302)    },    RiskDetected: true,}

攻击示例:#

攻击者可以构造恶意链接,利用这个完全开放的重定向漏洞,将用户重定向到恶意网站:

http://127.0.0.1:8787/ssrf/redirect/basic?destUrl=http://127.0.0.1:8787/ssrf/flag

防御措施:#

  • 验证目标 URL: 在进行重定向之前,始终验证目标 URL 是否合法和安全。只允许重定向到受信任的域名或 URL。
  • 白名单验证: 维护一个白名单,只允许重定向到事先定义的合法 URL 列表。
  • 避免用户输入: 尽量避免使用用户提供的输入来构造重定向 URL。如果必须使用用户输入,对输入进行严格的过滤和验证。
  • 参数编码: 在构造重定向 URL 时,对参数进行编码,以防止攻击者在参数中插入恶意内容。
  • 不使用用户提供的 URL: 如果可能的话,避免直接使用用户提供的 URL 进行重定向,而是使用内部的标识符,然后在后端进行转换。

靶场演示: 视频#