如果配置得当,Serilog完全可以克服这个问题。
然而,这取决于格式化程序/汇聚器,并且依赖于将Serilog用作结构化记录器(写入非结构化输出流肯定会阻止此操作)。
如果您采用OWASP文章中的示例:
var val = request["val"];
try {
int value = Int32.Parse(val);
}
catch (Exception ex) {
log.Information("Failed to parse val {Val}");
}
然后,转换成 CLEF 格式的 Serilog 事件将如下所示:
{"@t":"...","@mt":"Failed to parse val {Val}","Val":"twenty-one"}
想象“坏人”情景:
如果攻击者提交字符串“twenty-one%0a%0aINFO:+User+logged+out%3dbadguy”...
Serilog会生成一个结构化事件,如下所示:
{"@t":"...","@mt":"Failed to parse val {Val}","Val":"twenty-one\n\nINFO: User logged out=badguy"}
请注意,注入的 "event" 完全位于 Val
字段内,不会被误认为是一个 "真实" 事件。
即使注入的事件被制造成 JSON 的样式,由于 Serilog 的 JSON 格式化程序正确地转义 JSON 值,因此虚假事件仍将完全位于 "Val" 字段内。
即使滥用 Serilog API 并未将 Val
记录为结构化数据,注入的内容仍只会出现在消息字段中或其所放置的任何字段中,不能伪装成完全独立的事件。
再次强调,您需要检查您的格式化程序和接收器的行为,以确保一切顺利。我在这里指的是 Serilog.Formatting.Compact 中的格式化程序。