01.SSRF JSON Body SSRF
服务器端请求伪造(Server-Side Request Forgery,SSRF)是一种安全漏洞,攻击者可以在受害服务器上执行未经授权的请求,可能导致数据泄露、服务端攻击等问题。
SSRF 漏洞允许攻击者发送恶意请求,以服务器的身份向内部网络或外部资源发起请求。攻击者可以通过此漏洞访问内部服务、获取敏感数据,甚至攻击内部系统。
在该漏洞案例中,攻击者构造了一个 JSON 请求,其中包含一个名为 "ref" 的字段,其值为恶意的 URL(如 https://www.atacker.com
)。
当服务器解析该 JSON 请求时,会发起一个 GET 请求到指定的 URL。攻击者可以通过设置恶意 URL 来访问受限制的内部资源、绕过防火墙、探测内网服务等。
#
示例代码:{ DefaultQuery: "json={\"abc\": 123, \"ref\": \"http://www.baidu.com\"}", Path: "/json-in-get", Title: "SSRF JSON Body SSRF", Handler: func(writer http.ResponseWriter, request *http.Request) { raw := request.URL.Query().Get("json") if raw == "" { writer.Write([]byte(`No data available!`)) return } var m = make(map[string]interface{}) err := json.Unmarshal([]byte(raw), &m) if err != nil { writer.Write([]byte(`JSON Syntax Error: ` + err.Error())) return } ref, ok := m["ref"] if !ok { writer.Write([]byte(`No "ref" in JSON found!`)) return } var u = fmt.Sprint(ref) c := utils.NewDefaultHTTPClient() c.Timeout = 5 * 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,}
#
攻击示例:- 构造恶意 JSON 请求:{"abc": 123, "ref": "
http://127.0.0.1:8787/ssrf/flag
"} - 将该 JSON 请求作为请求体,发送到目标服务器的 /json-in-get 路径。
- 服务器解析 JSON 请求体,并尝试访问 "ref" 字段中指定的恶意 URL(
http://127.0.0.1:8787/ssrf/flag
) - 如果服务器没有适当的防御措施,可能会成功发起请求,攻击者可以获取响应,从而获得攻击目标内部的信息。
#
防御措施:- 仔细验证和过滤请求体中的数据,确保只允许访问受信任的 URL。
- 在服务器端进行白名单验证,只允许访问特定的 URL。
- 对于传入的 URL 参数,进行严格的验证和限制,避免访问内部资源。
- 将不受信任的输入数据进行编码,避免恶意构造的 URL。
- 针对内网访问,可以使用防火墙或网络隔离等措施限制出站访问。