CRLF的含义是“carriage return/line feed”,意思就是回车。这是两个ASCII字符,分别排在第十三和第十位。CR和LF是在计算机终端还是电传打印机的时候遗留下来的东西。电传打字机就像普通打字机一样工作。在每一行的末端,CR命令让打印头回到左边。LF命令让纸前进一行。虽然使用卷纸的终端时代已经过去了,但是,CR和LF命令依然存在,许多应用程序和网络协议仍使用这些命令作为分隔符。
攻击者在搜索安全漏洞的时候没有忽略很少使用的CRLF。攻击者可以通过在一段数据中加入CRLF命令来改变接受这个数据的应用程序处理这个数据的方式,从而执行CFRL注入攻击。
CRLF攻击最基本的例子包括向记录文件中增加伪造的记录。也就是说,有安全漏洞的应用程序把一个用户输入的内容写到系统记录文件中。攻击者可以提供如下输入内容:
|
当系统管理员在早上查看他的纪录时,他可能会用很多时间排除一个根本就不存在的故障。狡猾的攻击者在攻击系统的另一部分时,可以使用这种特洛伊木马分散管理员的注意力。
想像一下,一个应用程序收到用户输入的一个文件名,然后对那个文件执行一个指令,如“ls -a .”。如果这个应用程序存在CRLF安全漏洞,攻击者就可以输入这样的内容:
|
这个有安全漏洞的应用程序就会执行这个命令“ls -a File.txt”,然后再执行这个命令“rm -rf /”。如果这个应用程序是一个根程序,这可能就是它执行的最后一个命令,因为在根分区的全部文件都被删除了。
考虑使用一种CRFL注入攻击暴露使用一种基于网络的匿名电子邮件系统的某个人的电子邮件地址。那个电子邮件系统的工作方式可能是这样的:电子邮件的发送者用他们的电子邮件地址、信息主题和信息本身填写一个表格。当这个表格递交到网络服务器上的时候,网络服务器把这个表格转换为一个SMTP电子邮件,并且发送给收件人。发送者永远不会看到收件人的电子邮件地址。这个地址只有服务器知道。
如果这个应用程序存在CRLF攻击安全漏洞,电子邮件的发件人可以通过创建下面这样的一行主题来破坏收件人的匿名性:
|
当有安全漏洞的应用程序得到这个数据的时候,它向这个邮件的文件头增加一个不需要的行,创建一个发送到发件人邮件地址的这封邮件的盲送副本。在这个副本中,“To:”地址是看不到的,因此把收件人的邮件地址暴露给发送者。
使用良好的编程技术能够避免包括CRLF攻击在内的注入攻击。要使你的应用程序不受CRFL注入攻击,需要你保持与防御SQL注入攻击等其它类型的注入攻击一样的警惕性:永远不要相信输入的内容!在你控制范围以外的任何来源的输入内容都必须要进行检查,在你的应用程序对数据执行操作之前,任何不符合预期的数据类型的字符都要删除。例如,如果你期待着一个电子邮件主题行,这个数据中的所有的字符都应该是字母、数字和标点符号。如果你的应用程序期待着一个文件名,这个数据中只能包含合法地在文件名中使用的字符。如果程序员在这两个例子的情况下简单地过滤掉CR和LF字符,这个攻击就失败了。
用户输入是“坏字符”的一个来源。但是,你不要忘记检查你从来没有编写过的其它程序输入的内容。在许多情况下,攻击者可以把一个注入攻击从一个有漏洞的应用程序转移到一个基本的例行程序中。程序员不会检查基本的例行程序中的数据,因为那里的数据不是直接来自于用户。你要把任何你不能跟踪到可信赖的来源的数据都当作被感染的数据。这样,你就安全了。
责任编辑 赵毅 zhaoyi#51cto.com TEL:(010)68476636-8001