为什么在URI中允许编码斜杠是一种安全风险?

时间:2011-05-09 21:37:52

标签: php apache mod-rewrite

我有一种情况,我希望在URI(%2F)中编码斜杠,但在我发出请求时会忽略我的.htaccess规则,而是将我发送到404页面。我很快找到了我打算开启的Apache指令AllowEncodedSlashes,但我仍然不明白为什么它首先是安全风险。如果他们试图邪恶的话,难道没有人能手动将编码的斜杠转换为真正的斜杠吗? (虽然我看不出他们能做什么伤害......)

我正在测试的应用程序是用PHP编写的,与它接口的mod_rewrite规则如下所示:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^test/(.*)$ /test.php?_escaped_fragment_=$1 [NE,QSA,L]

我只想确保在继续之前了解风险。


澄清一下:Apache不允许路径中的编码斜杠,但在查询字符串中允许使用它们。查询字符串与下面的Christian列出的漏洞一样容易受到攻击(“远程执行代码,本地文件访问和目录遍历”)。

那么ASF为什么要创建一个特殊的指令只是为了允许这种行为呢?我不是很难,我真的不明白。我认为不用说任何用户输入(包括URI)都需要在任何数据库或文件系统函数中使用之前进行验证。

2 个答案:

答案 0 :(得分:10)

我认为如果保证转义,可以在URL中的任何位置使用转义斜杠。例如,以下(相关)问题中引用的例子是非常合理的:

Is a slash ("/") equivalent to an encoded slash ("%2F") in the path portion of an HTTP URL

至于为什么它会在默认情况下被禁用...这篇2003年的博客文章表明它是“保护蹩脚的CGI脚本”:

http://ken.coar.org/burrow/Apache_2f_encoding_decoding_and_security

某些粗心的做法可能会让一些人发现自己在一个代码库中,但是他们不确定是否要进行转换。所以他们认为它“只是为了安全”。但这可能发生在假定没有路径字符的点之后......并且它被传递到一些可执行的上下文中,认为它已经完成了所需的所有检查。

因此,如果您使用大多数现代Web框架的推荐方法,我怀疑这是一个重要问题,您可以毫不费力地使用AllowEncodedSlashes。

答案 1 :(得分:0)

老实说,我没有看到任何安全问题,但我必须承认我没有在这个领域工作过多。也就是说,规则仍然不正确。

您应该重定向到处理程序文件(php脚本),该文件解析$_SERVER['REQUEST_URI']而不是通过$_GET传递它。这主要是为了避免您通常使用非编码内容时遇到的问题。

另一方面,您可能正在运行Web应用程序防火墙,其规则是不通过URI传递斜杠。这是因为此行为通常与远程执行代码本地文件访问目录遍历相关联。 然而,这是一种预防措施,首先你不应该依赖它。

PoC漏洞利用示例:

include 'languages/'.$_GET['lang']; // hacker may pass ../ to move around.