Skip to main content

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,}

攻击示例:#

  1. 构造恶意 JSON 请求:{"abc": 123, "ref": "http://127.0.0.1:8787/ssrf/flag"}
  2. 将该 JSON 请求作为请求体,发送到目标服务器的 /json-in-get 路径。
  3. 服务器解析 JSON 请求体,并尝试访问 "ref" 字段中指定的恶意 URL(http://127.0.0.1:8787/ssrf/flag
  4. 如果服务器没有适当的防御措施,可能会成功发起请求,攻击者可以获取响应,从而获得攻击目标内部的信息。

防御措施:#

  • 仔细验证和过滤请求体中的数据,确保只允许访问受信任的 URL。
  • 在服务器端进行白名单验证,只允许访问特定的 URL。
  • 对于传入的 URL 参数,进行严格的验证和限制,避免访问内部资源。
  • 将不受信任的输入数据进行编码,避免恶意构造的 URL。
  • 针对内网访问,可以使用防火墙或网络隔离等措施限制出站访问。

靶场演示: 视频#