在网上有很多关于安全的文章,但是 OWASP 开发指导 涵 盖了几乎所有关于Web站点安全的东西。(注:OWASP(开放Web应用安全项目- Open Web Application Security Project)是一个开放的非营利性组织,目前全球有130个分会近万名会员,其主要目标是研议协助解决Web软体安全之标准、工具与技术文件,长期 致力于协助政府或企业了解并改善网页应用程式与网页服务的安全性。OWASP被视为Web应用安全领域的权威参考。2009年下列发布的美国国家和国际立 法、标准、准则、委员会和行业实务守则参考引用了OWASP。美国联邦贸易委员会(FTC)强烈建议所有企业需遵循OWASP十大WEB弱点防护守则)。

本文转载自 – http://blog.coderzh.com/2008/12/15/1355530/

简介

我们编写了大量的程序,但程序总是出现莫名其妙的异常,因此我们使用日志模块,详细记录程序执行的步骤,以求追踪和定位问题。也许这是大多数程序员 对日志的理解,跟踪和调试程序成了日志的主要职责。其实,日志的作用远非如此,当某天突然发现我们的系统被人非法入侵,删除了大量用户资料时,我们记录的 日志成了最好的追踪骇客的工具。假如,我们的日志被骇客无情的篡改,后果将不堪设想。因此,日志模块虽小,安全性却尤为重要。

有人说,我们使用了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 李四

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

防御办法:删除换行符。

userName = userName.Replace("\n", "").Replace("\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 李四

这样的格式虽然比前面的复杂了很多,但是,对于精细的骇客来说,一样可以使用前面的New Line Injection方式进行注入。那么,如何更加有效的防止骇客模拟新的日志项呢。比如:我们在每一个日志项中加入一个有序的数字,比如:

2008-12-15 16:22:50.4218|Error|1|Failed logon for user 张三

2008-12-15 16:22:50.4218|Error|2|Failed logon for user 李四

2008-12-15 16:22:50.4218|Error|3|Failed logon for user 王五

其实这样还不安全,因为张三很容易知道后面的数字是2,为了让张三猜不出后面的数字,我们使用伪随机数来做一个有序的序列,比如,使用同一个随机种子产生一系列的随机数。

static Random r = new Random(2008);

static void Nlog_Sequence_failed_login(string userName)

{

    var logger = NLog.LogManager.GetCurrentClassLogger();

    logger.Error(String.Format("{0}|Failed logon for user {1}" , r.Next(1024), userName));

}

这样的话,产生出来的序列的数字在外面看来非常随机,但其实内部是有序的,可以非常方便的通过工具对整个日志进行扫描,发现伪造的日志项。当然了,
还有很多 其他办法可以应付此类的注入,比如,使用两个日志文件,第一个日志文件记录日志内容,第二个日志文件记录日志中每一项的字符长度。

4.Abusing Word Wrap

当换行注入被拒绝的时候,还有一种投机的办法,就是不主动换行,使用一些空格或其他符号,导致文字自动换行。这很容易理解,当然,要真正实施起来并且完美无缺确实是很困难的。比如下面被注入的日志:

Failed logon for user 张三 __________________(自动换行)

Failed to delete all files for 李四_____________(自动换行)

Failed to remove user 李四 for 李四

这样的做法可能会觉得很可笑,但确实会很容易迷惑管理员的眼睛。那,有什么办法呢?

  1. 假如是在Windows平台下,使用编辑器打开的话,记得关闭自动换行功能。2.
    假如在Linux下面呢,在终端显示内容的话,对日志内容进行处理,加上一些自动换行的分隔符号,比如:[CR]。(这样做的话其实也不好,假如用户输入
    的数据原本就包含了[CR]字符,将很难区分用户输入的数据和分隔符号。对于这个问题,大家支点招吧!)

5.HTML Injection

很多情况下,日志内容被读取后,会在一个网页中进行显示。这样,就给骇客很大的空间,可以非常容易的对HTML进行篡改,这看上去非常类似XSS(跨站式脚本攻击,可参考之前的
[](http://www.cnblogs.com/coderzh/archive/2008/09/06/1285500.html)
),比如下面被注入的日志:

<table>

<tr><td>Failed logon for user</td></tr>

<tr><td>Failed to delete all files for 李四</td></tr>< /table><script>alert('hacked!');</script><!--</td></tr>

<tr><td></td></tr>

</table>

解决的办法类似XSS的解决方法,替换危险字符,如:引号(‘,“),角括号(<>)等等。

转载自 – http://coderzh.cnblogs.com

 

 

web 安全相关(一):Log注入(转)的更多相关文章

  1. WEB 安全之 SQL注入 < 三 > 提权

    SQL注入是一个比较“古老”的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果能清楚了解 攻击的全 ...

  2. WEB服务端安全---注入攻击

    注入攻击是web领域最为常见的攻击方式,其本质是把用户输入的数据当做代码执行,主要原因是违背了数据与代码分离原则,其发生的两个条件:用户可以控制数据输入:代码拼接了用户输入的数据,把数据当做代码执行了 ...

  3. Servlet规范简介——web框架是如何注入到Servlet中的

    Servlet规范简介--web框架是如何注入到Servlet中的 引言 Web框架一般是通过一个Servlet提供统一的请求入口,将指定的资源映射到这个servlet,在这个servlet中进行框架 ...

  4. WEB 安全之 SQL注入 < 二 > 暴库

    SQL注入是一个比较"古老"的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果 ...

  5. web安全-接入层注入

    web安全-接入层注入 1.关系型数据库 mysql 存放结构化数据 高效操作大量数据 方便处理数据之间的关联关系 2.SQL注入 select * from table where id=${id} ...

  6. .net mvc web api Autofac依赖注入框架-戈多编程

    今天自己搭了一套基于三层的依赖注入mvc web api 的依赖注入框架,在此总结下相关配置 1.设置应用程序的.net Framework版本为 4.5 2.通过Nuget 安装autofac包 I ...

  7. web安全学习(sql注入1)

    web安全学习(sql注入1) 一.简介 sql语句就是数据库语句,而sql注入就是用户将自己构造的恶意sql语句提交,然后服务器执行提交的危险语句.sql注入可能造成信息泄露以及服务器被控制等危害. ...

  8. Web安全相关(五):SQL注入(SQL Injection)

    简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...

  9. Web安全相关(五):SQL注入(SQL Injection)

    简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...

随机推荐

  1. pyenv常用命令

    pyenv使用教程 安装 Mac brew install pyenv brew install pyenv-virtualenv 配置 echo 'eval "$(pyenv init - ...

  2. Educational Codeforces Round 54 (Rated for Div. 2) Solution

    A - Minimizing the String solved 题意:给出一个字符串,可以移掉最多一个字符,在所有可能性中选取一个字典序最小的. 思路:显然,一定可以移掉一个字符,如果移掉的字符的后 ...

  3. Linux内核参数之arp_ignore和arp_announce

    一.arp_ignore和arp_announce介绍 arp_ignore和arp_announce参数都和ARP协议相关,主要用于控制系统返回arp响应和发送arp请求时的动作.这两个参数很重要, ...

  4. php面向对象多继承实现

    在PHP面向对象概念编程中,一个子类只能继承一个父类,但是从php5.4后新增traits实现代码复用机制变向达到多继承.Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立 ...

  5. 安装tensorflow报ImportError: libcublas.so.9.0: cannot open shared object file的解决方法【转】

    本文转载自:https://blog.csdn.net/qq_37274615/article/details/81099738 转载自:https://blog.csdn.net/qysh123/a ...

  6. Scikit-learn 库的使用

    1. 与文本处理相关的库 1. 对语料库提取特征词集合 from sklearn.feature_extraction.text import TfidfVectorizer, CountVector ...

  7. 2016湘潭邀请赛—Heartstone

    http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1246 题意: 有n只怪,每只怪有指定的HP.现在1和2两种攻击方式,前者扣 ...

  8. redis的过期策略以及内存淘汰机制

    redis采用的是定期删除+惰性删除策略. 为什么不用定时删除策略? 定时删除,用一个定时器来负责监视key,过期则自动删除.虽然内存及时释放,但是十分消耗CPU资源.在大并发请求下,CPU要将时间应 ...

  9. 在多节点上运行分布式Intel Caffe

    一般有2种并行模式:数据并行(Data parallelism)和模型并行(model parallelism). 在模型并行化( model parallelism )方法里,分布式系统中的不同机器 ...

  10. Eclipse开发Android应用 找不到平板

    1.驱动安装正确2.平板的连接方式正确,不要用大容量存储/sd卡模式这个设置在4.3上很难找呀.设置->存储->点右上角的菜单 3.打开USB调试.4.上述问题都检查后,在eclipse里 ...