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

JKS*_*JKS 21 php apache mod-rewrite

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

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

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

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


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

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

Hos*_*ork 11

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

是斜杠("/")等效于HTTP URL的路径部分中的编码斜杠("%2F")

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

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

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

因此,如果您使用大多数现代Web框架的推荐方法,我怀疑这是一个重要问题,您可以使用AllowEncodedSlashes而不必担心.