Security 为什么ApacheTomcat将编码的斜杠(%2F)作为路径分隔符处理?

Security 为什么ApacheTomcat将编码的斜杠(%2F)作为路径分隔符处理?,security,tomcat,servlets,uri,percent-encoding,Security,Tomcat,Servlets,Uri,Percent Encoding,Apache Tomcat(至少在Tomcat 6之前,请参见脚注)将URI路径中的百分比编码斜杠(%2F)与常规斜杠(即作为路径分隔符)一样处理 例如,Tomcat的servlets示例页面可以在 http://localhost:8080/examples/servlets/和 http://localhost:8080/examples%2Fservlets/ 这对我来说没有意义。对保留字符(如“/”进行百分比编码)的全部目的是避免将其视为保留字符(在本例中为路径分隔符)。除此之外,这

Apache Tomcat(至少在Tomcat 6之前,请参见脚注)将URI路径中的百分比编码斜杠(%2F)与常规斜杠(即作为路径分隔符)一样处理

例如,Tomcat的servlets示例页面可以在

  • http://localhost:8080/examples/servlets/
  • http://localhost:8080/examples%2Fservlets/
这对我来说没有意义。对保留字符(如“/”进行百分比编码)的全部目的是避免将其视为保留字符(在本例中为路径分隔符)。除此之外,这种行为是漏洞的(一)原因。然而,我想这一定是有原因的

  • Tomcat将(ok,用于将)%2F视为路径分隔符有什么技术原因吗

  • 在某些情况下,这种行为是否有帮助



脚注:我意识到,由于CVE-2007-0450,Tomcat的默认行为被更改为拒绝路径中百分比编码的斜杠。但是,如果禁用此检查(允许使用斜杠编码),则旧的行为将保留。

它与Tomcat在httpd反向代理之后的时间有关。在某些情况下,URI是部分编码的,因此必须进行%2F处理才能撤消该编码

它产生了许多安全问题,这些问题在CVE-2007-0450修复的同时得到了修复。作为背景,请查看mod_jk docs中的ForwardURIxxx选项:这涵盖了一些您可能仍然需要此功能的情况(但由于可能存在的安全问题,如果可能的话,我会尽量避免)


默认行为现在是httpd,将URI原封不动地传递给Tomcat,并让Tomcat将编码字符完全按此方式处理。

Mark,有没有办法告诉Tomcat不要将%2F作为路径分隔符?我意识到除非设置了这里提到的道具,否则它会完全拒绝请求,但在此之后,我希望“../foo%2Fbar/…”被视为一个值为“foo/bar”的路径元素,而不是“../foo/bar/…”恐怕不是解码发生得相当早,一旦解码发生,Tomcat就无法分辨原始/和从%2F解码的一次之间的区别。您可能可以使用双重编码,即%252F,但我不建议使用这种编码,因为这种编码在过去会导致安全问题。我对Tomcat 7进行了一些测试,发现它不接受URL路径中的%2F:它返回HTTP状态代码400“坏请求”。如果我在参数中通过%2F,则可以正常工作。如果我在URI中使用%2C,则会被转换为“,”,因此Tomcat确实以一种特殊的方式处理%2F。