代码改变世界

代码安全系列(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);
    }
}
复制代码

上面的代码似乎没有什么问题,正常情况下,当用户张三登陆系统失败时,将记录日志如下:

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 李四

当管理员看到上面的日志时肯定会想:李四这家伙,想删掉所有文件,然后再销毁证据。

防御办法:删除换行符。