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 等危险协议。