日志注入是一种非常简单的针对Web应用程序的攻击。对于攻击者而言,执行攻击非常简单。但是,对于目标Web应用程序或其管理员,很难确定所执行攻击的范围及其影响。
Web应用程序或适用于此情况的任何应用程序都会在后端存储大量日志。他们可能是
- 崩溃日志:有关应用程序何时崩溃,崩溃原因,受影响的用户等的信息,
- 错误/异常日志日志:详细信息,例如从代码引发的异常,引发的异常的Stacktrace。
- 访问日志:访问日志包含有关系统中用户访问的不同端点的信息以及时间详细信息。
- GC日志:通常由Java存储,以跟踪垃圾收集。
- 监视日志:当用户尝试在您的站点上进行可疑活动时,它很有用,您可以检测到该日志并将其发送给自己,以得到通知或将其记录下来以备将来记录。
除此之外,还有许多类别的应用程序日志。这些日志非常有用,对于调试应用程序问题,审核和控制,应用程序性能监控,故障排除等绝对必要,
根据生成的日志数据的重要性和/或基于生成的日志数据的重要性,可以将这些生成的日志写入磁盘,作为警报邮件发出,推送到第三方存储服务或简单地写入一组文件。生成。
如果处理不当,甚至可以在Web应用程序中处理日志。假设您有一个如下所示的端点,
https://www.testsite.com/logDOSAttemptByUser?userName=user1
此API将记录正在您的站点中尝试DOS攻击的用户的用户名。
在后端,您有类似的东西,
List suspiciousAccountsLogged = new ArrayList(); suspiciousAccountsLogged = parseUserNamesFromLogs(); if(suspiciousAccountsLogged.size > 0) { for(String userName : suspiciousAccountsLogged) { doBlockUserForDOSAttempt(userName); } }
这样做的目的是阻止试图在您的站点上执行DOS攻击的用户。您可能会根据您的服务器在一段时间内收到的来自特定用户的请求数来找到此请求。像上面一样,可能会有一种自动的方式来处理一段时间后的日志并刷新数据。
由于端点/ logDOSAttemptByUser对外部世界可能是可见的,因此有可能被利用。攻击者可以修改请求的userName参数,如下所示,
https://www.testsite.com/logDOSAttemptByUser?userName=user2
并且系统可能会阻止尚未在您的站点上尝试任何DOS Attempt的可信用户(user2) ,但是由于已注入日志,因此系统将阻止该用户。
即使手动处理日志,将有效的日志与注入的日志区分开也是非常麻烦的,在某些情况下可能是不可能的。日志详细信息不可信将导致严重的问题。
也有可能使管理员对修改后的日志消息感到困惑,如下所示。
https://www.testsite.com/logUsageLimitReached?msg=UsageReached
可以修改为
https://www.testsite.com/logUsageLimitReached?msg=UsageReached+"\n INFO : Looks like problem with our calculation"
日志将生成为
INFO : UsageReached INFO : Looks like problem with our calculation.
解决方案
- 代替通过参数直接传递消息,可以传递日志代码。但是,它仍然可以被利用。
- 不要使用API调用来记录操作,因为那里的API在浏览器网络调用中是可见的。
- 如有需要,请将用户ID或公共不可识别的值作为参数传递到日志记录端点中。
- 使用正确的错误代码和可识别的错误消息。