JSON 中表达式注入参数
模板注入(Template Injection)在 JSON 中也是一种常见的安全漏洞。它发生在应用程序在处理 JSON 数据时,没有正确地对用户输入进行处理和过滤。攻击者可以构造恶意的 JSON 数据,使得应用程序在解析 JSON 时执行恶意代码。
#
示例代码:示例代码接收一个名为b
的 GET 参数,并将其解析为 JSON 数据。在 JSON 数据中,字段a
的值被用作模板引擎的输入来渲染模板。攻击者可以构造恶意的 JSON 数据,将模板注入代码注入到a
字段中。
for _, paramName := range []string{"a", "b", "c"} { expr1 := request.URL.Query().Get(paramName) buf.WriteString(paramName + "[" + expr1 + "]: ") sanbox := httptpl.NewNucleiDSLYakSandbox() if paramName == "b" { var mapRaw = make(map[string]interface{}) err := json.Unmarshal([]byte(expr1), &mapRaw) if err != nil { buf.WriteString("\n\nb params is should be JSON!!!!!!!!!!!!!!!!!\n\n") log.Errorf("json unmarshal failed: %v", err) continue } expr1 = utils.MapGetString(mapRaw, "a") } aResult, err := sanbox.Execute(expr1, nil) if err != nil { buf.WriteString(err.Error()) } else { buf.WriteString(utils.InterfaceToString(aResult)) } buf.WriteByte('\n') buf.WriteByte('\n') }
#
攻击示例:在这个例子中,攻击者将{"a":"{{7*5-3}}"}
作为b
参数的值。在 JSON 数据中,a
字段的值是一个模板表达式{{7*5-3}}
,计算出的结果为32
。
http://127.0.0.1:8787/expr/injection?b={"a":"{{7*5-3}}"}
#
防御措施:这是一个典型的 JSON 模板注入漏洞示例,强调了验证和过滤用户输入的重要性。修复该漏洞的方法是使用合适的 JSON 解析器配置和输入验证来保护应用程序免受模板注入攻击。