问题描述:
项目web容器使用得是Tomcat8.45,项目上线前使用AWVS扫了一下,其中有一个Application error message中危安全漏洞,会暴露服务器版本等信息。原因是awvs发了个请求,请求项目得某个静态资源文件,如:/project/a.jpg,但是它传了个参数12345'"\'\");|]*%00{%0d%0a%bf%27'e???,完整的请求如下:
http://ip:port/project/a.jpg?12345'"\'\");|]*%00{%0d%0a%bf%27'e???,这个请求因为包含了{} []等字符导致400 bad request
网上查了查:这是因为Tomcat严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。传入的参数中有"{"不在RFC3986中的保留字段中,所以会报这个错。
解决思路:
案例来说这种错误信息在项目得web.xml或者tom猫得web.xml配置个<error-page>即可,但是无论我如何配置,其他得错误都可以跳转到配置好得错误页面,唯独这个请求不跳转错误页面,依然我行我素的使用tomcat默认的错误页面。
然后接着网上查资料,给出的解决办法如下:Tomcat 7.0.76, 8.0.42, 8.5.12 这些版本之后可以定义requestTargetAllow 属性来允许禁止的字符。在tomcat的 catalina.properties文件中添加这一句:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
出乎意料之外,依然不好使。。。。。。。。。。。。。我都要炸了。
最后天我绝人之路,查看官方文档的tomcat.util.http.parser.HttpParser.requestTargetAllow说明发现一段话This system property is deprecated. Use the relaxedPathChars and relaxedQueryChars attributes of the Connector instead
激动啊,然后修改server.xml文件,Connector属性增加relaxedQueryChars配置,修改为如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" relaxedQueryChars="[]|{}^\`"<>" redirectPort="8443" />
问题解决。
补充一句:在下现在还搞不清配置好的错误页面为什么不跳转,欢迎大家留言赐教,或者邮箱交流504788748@qq.com