跳到主要内容

03.POST Body 传参案例

该案例演示了一种潜在的安全漏洞,当后端处理 POST 请求的请求体(Request Body)时,没有对其中的数据进行足够的验证和处理,可能导致安全问题。特别是在使用 Fastjson 或其他 JSON 解析器的情况下,攻击者可以构造恶意 JSON 请求体来触发 Java 反序列化漏洞。

示例代码:

{
Title: "POST Body传参案例案例",
Path: "/json-in-body",
Handler: func(writer http.ResponseWriter, request *http.Request) {
if request.Method == http.MethodPost {
body, err := io.ReadAll(request.Body)
if err != nil {
writer.WriteHeader(http.StatusBadRequest)
writer.Write([]byte("Invalid request"))
return
}
defer request.Body.Close()
response := mockController(generateFastjsonParser("1.2.43"), request, string(body))
writer.Write([]byte(response))
} else {
writer.Write([]byte(utils2.Format(string(fastjson_loginPage), map[string]string{
"script": `function load(){
name=$("#username").val();
password=$("#password").val();
auth = {"user":name,"password":password};
$.ajax({
type:"post",
url:"/fastjson/json-in-body",
data:JSON.stringify(auth),
dataType: "json",
success: function (data ,textStatus, jqXHR)
{
$("#response").text(JSON.stringify(data));
console.log(data);
},
error:function (XMLHttpRequest, textStatus, errorThrown) {
alert("请求出错");
},
})
}`,
})))
return
}
},
}

攻击示例:

攻击者可以构造 POST 请求,将恶意 JSON 数据作为请求体发送给目标服务器。例如,post payload {"@type":"``java.net``.Inet4Address","val":"dnslog"} 将触发 Fastjson 反序列化漏洞。

防御措施:

  • 验证请求体:后端应该对接收到的请求体进行验证和解析,确保其格式正确,数据类型合法。
  • 使用安全的 JSON 解析库:考虑使用安全的 JSON 解析库,这些库通常会提供防御反序列化攻击的功能。
  • 限制反序列化能力:在可能的情况下,禁用或限制应用程序的反序列化能力,只反序列化信任的数据。
警告

请注意,漏洞的防御措施可能因编程语言和框架而异,因此确保您的应用程序采取了适当的防御措施,以确保安全性。

靶场演示: 视频