代码安全系列(1) - Log的注入
2020-03-17 14:33 tonyniu8 阅读(234) 评论(0) 收藏 举报简介
我们编写了大量的程序,但程序总是出现莫名其妙的异常,因此我们使用日志模块,详细记录程序执行的步骤,以求追踪和定位问题。也许这是大多数程序员对日志的理解,跟踪和调试程序成了日志的主要职责。其实,日志的作用远非如此,当某天突然发现我们的系统被人非法入侵,删除了大量用户资料时,我们记录的日志成了最好的追踪骇客的工具。假如,我们的日志被骇客无情的篡改,后果将不堪设想。因此,日志模块虽小,安全性却尤为重要。
有人说,我们使用了Nlog,Log4net,就不会有安全问题了,真的是这样吗?那是不是我们使用了NHibernate就不会有SQL注入的问题呢。其实不是的,关键是看你是否正确的使用了这些第三方库。
下面我们就来学习一些Log注入的常用伎俩以及支招技巧吧。
1.New Line Injection
顾名思义:插入新行的注入方式。这种方法是最普遍的Log注入方法。我们先来看看如下一段C#日志记录的代码:
static void log_failed_login(string userName)
{
using (var sw = new StreamWriter("test.log", true, Encoding.Unicode))
{
sw.WriteLine("Failed logon for user " + userName);
}
}
{
using (var sw = new StreamWriter("test.log", true, Encoding.Unicode))
{
sw.WriteLine("Failed logon for user " + userName);
}
}
上面的代码似乎没有什么问题,正常情况下,当用户张三登陆系统失败时,将记录日志如下:
Failed logon for user 张三
假如张三不怀好意,在用户名一栏里输入了如下的字符:
张三\nFailed to delete all files for 李四\nFailed to remove user 李四 for 李四
日志将会这样记录:
Failed logon for user 张三
Failed to delete all files for 李四
Failed to remove user 李四 for 李四
Failed to delete all files for 李四
Failed to remove user 李四 for 李四
当管理员看到上面的日志时肯定会想:李四这家伙,想删掉所有文件,然后再销毁证据。
防御办法:删除换行符。

浙公网安备 33010602011771号