如何允许换行符,但仍能防止CRLF攻击?

How to allow newline characters but still prevent CRLF attack?

提问人:now he who must not be named. 提问时间:2/14/2022 更新时间:2/14/2022 访问量:444

问:

我已经在我的服务器上运行了安全扫描,并收到了一些 CRLF 漏洞利用警告。

因此,按照建议,我已经清理了所有查询参数输入,如下所示。

var encodedStringSafeFromCRLF = Server.UrlDecode(Request.QueryString["address"])
                         .Replace("\r", string.Empty)
                         .Replace("%0d", string.Empty)
                         .Replace("%0D", string.Empty)
                         .Replace("\n", string.Empty)
                         .Replace("%0a", string.Empty)
                         .Replace("%0A", string.Empty);

比方说,一个真正的用户正在通过“address”查询参数向我发送一个地址。

例-

https://mywebsite.com/details?instId=151711&address=24%20House%20Road%0aSomePlace%0aCountry

由于“%0A”将从上述字符串中剥离,因此地址现在将变为 “24HouseRoadSomePlaceCountry”,这不是我的期望。

我应该如何处理这个问题? 如果我对 CRLF 进行代码更改,这将更改输入的集成方式。 如果输入字符串未经过审查,那么它将打开我的服务器进行 CRLF 攻击。

这里有什么建议吗?

C# asp.net HTML 编码 crlf 漏洞

评论

1赞 Jeroen Mostert 2/14/2022
如果你的字符串对换行符有合理的需求,那么显然它们不应该被替换——相反,你需要投入实际的工作来确保该值最终不会被用于攻击(因为没有换行符以这样一种方式输出的情况,它可能会破坏任何东西), 然后,由于已经验证了某些情况,因此需要将消毒剂配置为不在此特定实例上发出警告。
0赞 now he who must not be named. 2/15/2022
@JeroenMostert - 你能用例子解释一下吗?任何代码示例都可能有所帮助
1赞 Jeroen Mostert 2/15/2022
这就是重点——这与代码无关,“写这个,你就安全了”。您需要了解什么是 CRLF 攻击,以及攻击者可能如何进行攻击。只有这样,您才能确定应该编写哪种代码 - 这可能从在写入日志时更改某些输出到甚至根本不需要执行任何操作,因为您的设置中没有任何内容容易受到攻击。网上有很多材料,但只有你才能通过查看你的字符串的实际结束位置来确定哪些是相关的。ASP.NET 本身,您的代码在处理换行符时不会遇到任何固有的麻烦。

答:

1赞 Mikael Suokas 2/14/2022 #1

如果您确实需要用户提供带有 CRLF 序列的数据,那么我不会过滤这些序列。与往常一样,永远不要以任何方式信任用户提供的数据:不要使用它来生成 HTTP 标头、响应或写入日志文件。

一般来说,反之亦然的过滤更安全:指定所有你愿意接受的字符,并过滤掉其他所有字符。

如果需要将数据写入日志,例如,可以先对数据进行 URL 编码,这样就不会将“裸”CR LF 写入其中。

我可能会在内部指定仅使用 \n 作为换行符,并在内部将所有 \r、\n 和 \r\n 转换为一种表示形式 \n。因此,代码的其余部分不必处理所有版本。