搜索了很长时间后,我找不到关于Serilog如何处理日志提要清理的信息。又称对抗";对数注入";或";原木锻造";(参见https://owasp.org/www-community/attacks/Log_Injection)。所有的搜索都指向";依赖性注入";这是一个完全不同的话题:(
我假设通过将Serilog与字符串参数一起使用(https://github.com/serilog/serilog/wiki/Writing-Log-Events)对可能的危险内容进行消毒。但是,是吗?
有人知道这样做了吗?我应该担心吗?
如果有人在没有字符串参数的情况下使用Serilog,而使用带有字符串串联的Serilog(违反指令(,该怎么办?
如果配置得当,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"}
想象";坏家伙;场景:
如果攻击者提交字符串"21th%0a%0aINFO:+User+logged+out%3dbadgoy"。。。
Serilog将生成一个结构化事件,如:
{"@t":"...","@mt":"Failed to parse val {Val}","Val":"twenty-onennINFO: User logged out=badguy"}
注意,注入的";事件";完全在CCD_ 1字段内;真实的";事件
即使注入的事件看起来像JSON,这也是有效的,因为Serilog的JSON格式化程序正确地转义了JSON值,因此假事件仍然完全在";Val";领域
即使误用了Serilog API,并且没有将Val
正确记录为结构化数据,注入的内容仍然只会出现在消息字段或其所在的任何字段中,并且不能伪装成完全独立的事件。
为了再次强调这一点,您需要检查格式化程序和接收器的行为。我说的是Serilog中的格式化程序。格式化。此处压缩。