Java Web - Disable PUT DELETE TRACE OPTIONS on TOMCAT ROOT page

一般我們在開發網頁時,通常使用到的http method為POST、GET等,而網頁系統在被資安

工具作掃描時,如果掃出網頁竟然能夠使用PUT、DELETE等不安全的method時,該怎麼針

對它做disabled呢?

本文探討的劇情為tomcat下的http://localhost:8080頁面,即webapps下的ROOT被掃出允許使

用DELETE、PUT等http method,由於ROOT在這邊有被拿來改寫使用,可供大家在這個頁

面點選連結進其它web系統,因此也需要disabled掉相關不安全的方法。

後來發現一篇文章的最後一位發言者有提到,由於conf下的web.xml設定的
  1. <servlet>
  2. <servlet-name>default</servlet-name>
  3. <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  4. <init-param>
  5. <param-name>debug</param-name>
  6. <param-value>0</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>listings</param-name>
  10. <param-value>false</param-value>
  11. </init-param>
  12. <load-on-startup>1</load-on-startup>
  13. </servlet>
  14. ....
  15. <servlet-mapping>
  16. <servlet-name>default</servlet-name>
  17. <url-pattern>/</url-pattern>
  18. </servlet-mapping>

導致預設一般web都存在delete、put等方法沒被擋,如下:

小弟的同事告知此方法可做檢查

因此建議我們可以自訂自己的<servlet-name>default</servlet-name>來複寫掉它。

後來我一樣在ROOT下撰寫VerySimpleServlet.java及設定web.xml,如下

  1. <servlet>
  2. <servlet-name>default</servlet-name>
  3. <servlet-class>com.foo.VerySimpleServlet</servlet-class>
  4. <load-on-startup>1</load-on-startup>
  5. </servlet>
  6. ....
  7. <servlet-mapping>
  8. <servlet-name>default</servlet-name>
  9. <url-pattern>/</url-pattern>
  10. </servlet-mapping>

不過,再重新啟用tomcat時竟然出錯了,導致連http://localhost:8080頁面都掛掉了!!

PS. 自行定義的程式很簡單,只有doGet、doPost、service等method!

最後,小弟左思右想就將ROOT的web.xml該設定改個名字成default1避免跟系統預設的同名

。後來重啟tomcat後可以正常瀏覽頁面,並且重新curl後,得到不一樣的結果,如下


後來想想,可能後來的這個設定當我們連http://localhost:8080時,一樣會執行

VerySimpleServlet,但預設的DefaultServlet影響可能在VerySimpleServlet之前,導致curl掃出

的頁面已經為VerySimpleServlet了!


12/23修改如下:
不過,隔天再次瀏覽,發現網頁show出的為不正確的頁面,想想應為當下的cache導致頁

面沒有出錯!! 因為建立的VerySimpleServlet本身沒有撰寫任何內容,因此頁面一片空白!!

最後調整如下:

ROOT內的web.xml改為
  1. <welcome-file-list>
  2. <welcome-file>welcome</welcome-file>
  3. </welcome-file-list>
  4. <servlet>
  5. <servlet-name>default1</servlet-name>
  6. <servlet-class>com.foo.VerySimpleServlet</servlet-class>
  7. </servlet>
  8. <servlet-mapping>
  9. <servlet-name>default1</servlet-name>
  10. <url-pattern>/welcome</url-pattern>
  11. </servlet-mapping>

這樣一來,當執行http://localhost:8080/時,會只針對/welcome,相對地它會再綁定執行的

程式為VerySimpleServlet。

另VerySimpleServlet修改如下,改成繼承HttpServlet,並且在執行時重導向至index.jsp
  1. public class VerySimpleServlet extends HttpServlet {
  2. private static final long serialVersionUID = 1L;
  3. /**
  4. * @see HttpServlet#HttpServlet()
  5. */
  6. public VerySimpleServlet() {
  7. super();
  8. // TODO Auto-generated constructor stub
  9. }
  10. /**
  11. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  12. */
  13. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. // TODO Auto-generated method stub
  15. }
  16. /**
  17. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  18. */
  19. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. // TODO Auto-generated method stub
  21. String redirect = response.encodeRedirectURL(request.getContextPath()
  22. + "/index.jsp");
  23. response.sendRedirect(redirect);
  24. }
  25. }

也就是說,執行http://localhost:8080/會再次導向至http://localhost:8080/index.jsp,得到原本

正確的內容!



PS. 最後試出的方式及解釋純屬猜測,若有誤請不吝指教喔!

留言