(OWASP汉化)攻击系列大全(四十): 日志注入

最新版本(mm / dd / yy):06/6/2016
翻译至Log Injection

概述

日志注入(Log Injection)是将未经验证的用户输入写到日志文件中,可以允许攻击者伪造日志条目或将恶意内容注入到日志中。

日志伪造漏洞发生在:

  • 数据从不受信任的来源进入应用程序。
  • 数据被写入到应用程序或系统日志文件中。

应用程序通常使用日志文件来存储事件或事务的历史记录,以供以后查看,统计信息收集或调试。根据应用程序的性质,审查日志文件的任务可以根据需要手动执行,也可以使用自动选择重要事件或有趋向性的信息日志的工具自动执行。

如果攻击者可以将数据提供给后来逐字记录的应用程序,则日志文件的解释可能会受到阻碍或误导。在最温和的情况下,攻击者可以通过向应用程序提供包含适当字符的输入来将错误条目插入到日志文件中。如果日志文件被自动处理,攻击者可以通过破坏文件格式或注入意外字符来渲染文件不可用。更微妙的攻击可能涉及歪曲日志文件统计信息。伪造或其他方式,损坏的日志文件可以用来掩盖攻击者的踪迹,甚至可以将另一方与恶意行为联系起来[1]。在最坏的情况下,攻击者可能会向日志文件注入代码或其他命令,并利用日志处理实用程序中的漏洞[2]。

实例

以下Web应用程序代码尝试从请求对象读取整数值。如果该值无法解析为整数,那么输入将记录一条错误消息,指示发生了什么。

...
String val = request.getParameter("val");
try {
    int value = Integer.parseInt(val);
}
catch (NumberFormatException) {
    log.info("Failed to parse val = " + val);
}
...

如果用户提交val的字符串“twenty-one”,则会记录以下条目:

    INFO: Failed to parse val=twenty-one

然而,如果攻击者提交字符串”twenty-one%0a%0aINFO:+User+logged+out%3dbadguy”,会记录一下条目:

    INFO: Failed to parse val=twenty-one

    INFO: User logged out=badguy

显然,攻击者可以使用相同的机制插入任意日志条目。

参考文献