Skip to main content

03.SSRF POST 中 URL 参数

在这个示例中,我们将介绍一个 SSRF 漏洞案例,涉及将 URL 参数嵌入 POST 请求中,导致攻击者可以发起未经授权的请求。

示例代码:#

用户可以通过 POST 请求提交一个 URL,然后服务器将该 URL 作为目标发起 HTTP 请求,而没有充分的验证。

在提交表单时,攻击者可以将恶意 URL 作为参数,从而导致服务器发起未经授权的请求,从而触发 SSRF 漏洞。

{DefaultQuery: "",Path:         "/in-post",Title:        "SSRF POST 中 URL 参数",Handler: func(writer http.ResponseWriter, request *http.Request) {        if request.Method == "GET" {                writer.Header().Set("Content-Type", "text/html; charset=utf8")                writer.Write([]byte(`<form action="/ssrf/in-post" method="post">        <!-- ... 省略其他标签 ... -->                </form>`))        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"))        c := utils.NewDefaultHTTPClient()        c.Timeout = 10 * time.Second        rsp, err := c.Get(u)        if err != nil {                writer.Write([]byte(err.Error()))                return        }        rawResponse, err := utils.HttpDumpWithBody(rsp, true)        if err != nil {                writer.Write([]byte(err.Error()))                return        }        writer.Write(rawResponse)                        },                        RiskDetected: true,},

攻击示例:#

攻击者在"URL"字段中输入恶意 URL,例如:http://127.0.0.1:8787/ssrf``/flag

服务端接收到 POST 请求后,提取"URL"参数,并将其作为目标发起 HTTP 请求

防御措施:#

  • 白名单验证:限制允许请求的目标 URL,只允许特定的域名、IP 地址或 URL 路径。这将减少攻击者可以发起的恶意请求的范围。
  • 使用 URL 解析库:在解析用户输入的 URL 时,使用专门的 URL 解析库来确保正确解析和规范化 URL。这可以帮助识别和过滤恶意的 URL 结构。
  • 禁用不必要的协议:限制允许的协议,例如只允许 http 和 https,不允许 file、data 等危险协议。

靶场演示: 视频#