最近公司的web项目需要过一个安全测评,用户通过burpsuite拦截请求,并修改URL以后,返回的错误信息会包含tomcat版本信息。
问题复现:
拦截正常请求,将请求修改为
然后拦截服务器响应信息可以看到,返回信息中包含tomcat版本信息(如果不知道怎么拦截响应信息的,请移步百度)
解决思路:
第一步想到的就是在框架中针对400的响应码进行拦截,然后替换成自己定义的错误返回页面,本人框架采用JFinal,在框架中添加拦截页面
然后,不生效,接着就想在项目的web.xml中添加错误页面拦截,以及在tomcat自带的web.xml中添加错误页面拦截,结果均不生效
项目中web.xml添加错误拦截
第二步,查看完整的报错信息为
<!doctype html><html ><head><title>HTTP Status 400 – Bad Request</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;}
h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a
{color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 400 – Bad Request</h1><hr class="line" />
<p><b>Type</b> Exception Report</p><p><b>Message</b> Invalid character found in the HTTP protocol [a]</p><p><b>Description</b>
The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax,
invalid request message framing, or deceptive request routing).</p><p><b>Exception</b></p><pre>java.lang.IllegalArgumentException:
Invalid character found in the HTTP protocol [a]
org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:573)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:503)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1634)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748)
</pre><p><b>Note</b> The full stack trace of the root cause is available in the server logs.</p><hr class="line" /><h3>Apache Tomcat/8.5.61</h3></body></html>
通过该信息可以看到请求URL中包含非法字符,根本没有进入web系统中,所以在系统中添加错误拦截页面根本没用。
治本方法:该问题可以通过在tomcat的server.xml中将非法字符支持,然后就不会产生错误,只不过会产生一个问题,不知道有多少非法字符,所以需要以一添加
relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%"
治标方法:将错误信息中的tomcat信息屏蔽掉
1、将tomcat lib目录下的catlina.jar通过unzip catalina.jar解压
2、修改org/apache/catalina/util/ServerInfo.properties 中的版本信息
修改为 :
server.info=
server.number=
server.built=Dec 3 2020 14:03:28 UTC
3、然后使用 jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties 将修改后的配置信息放到catalina.jar中,然后重启tomcat就行了
注意:修改改配置以后,使用version.sh 无法显示版本信息。
结论:如果是http出现非法字符是正常的业务需求,那可以采用第一种方法,治本,如果和我们一样为了应付安全渗透人员的测评,建议使用第二种方法,不会泄露tomcat版本信息。