快捷搜索:

代码安全系列(1) - Log的注入

我们编写了大年夜量的法度榜样,但法度榜样老是呈现莫名其妙的非常,是以我们应用日志模块,具体记录法度榜样履行的步骤,以求追踪和定位问题。大概这是大年夜多半法度榜样员对日志的理解,跟踪和调试法度榜样成了日志的主要职责。着实,日志的感化远非如斯,当某天忽然发明我们的系统被人不法入侵,删除了大年夜量用户资料时,我们记录的日志成了最好的追踪骇客的对象。要是,我们的日志被骇客无情的窜改,后果将不堪设想。是以,日志模块虽小,安然性却尤为紧张。

有人说,我们应用了Nlog,Log4net,就不会有安然问题了,真的是这样吗?那是不是我们应用了NHibernate就不会有SQL注入的问题呢。着实不是的,关键是看你是否精确的应用了这些第三方库。

下面我们就来进修一些Log注入的常用手腕以及支招技术吧。

1.New Line Injection

顾名思义:插入新行的注入要领。这种措施是最普遍的Log注入措施。我们先来看看如下一段C#日志记录的代码:

staticvoidlog_failed_login(stringuserName)

{

using(varsw=newStreamWriter("test.log",true,Encoding.Unicode))

{

sw.WriteLine("Failedlogonforuser"+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 李四

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

防御法子:删除换行符。

userName=userName.WordStr("n","").WordStr("r","")

这样,日志内容就成了:

Failed logon for user 张三Failed to delete all files for 李四Failed to remove user 李四 for 李四

2.Sparator Injection

有些人写日志爱好用一些分隔符来分隔不合的字段,比如用分隔符:|,或者是应用Tab作为分隔符。比如下面的日志:

| Customer   | Number   | Operation   |

| 张三       | 100      | 取钱       |

| 李四       | 800      | 存钱       |

当张三输入的内容为:

10000  | 存钱  |

则日志的结果为:

| Customer   | Number   | Operation   |

| 张三       | 1000     | 存钱       | 取钱  |

| 李四       | 800      | 存钱       |

我们留意到上面张三的记录中多出来了一列,很轻易被治理员发明。然则要是我们的日志系统是由法度榜样自动来读取的话,张三很有可能被觉得存入了1000大年夜钞。

防御措施:建议只管即便不要应用分隔符,或者调换分隔符。

3.Timestamp Injection

平日我们记录日志时,都邑具体的记录每个步骤履行的光阴,比如:

2008-12-15 14:42:30.5781|Error|Failed logon for user 张三

2008-12-15 14:42:48.3125|Error|Failed logon for user 李四

您可能还会对下面的文章感兴趣: