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設定的
<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

....

<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

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

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

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

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

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>com.foo.VerySimpleServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

....

<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </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改為
<welcome-file-list>
    <welcome-file>welcome</welcome-file>
  </welcome-file-list>
  <servlet>
        <servlet-name>default1</servlet-name>
        <servlet-class>com.foo.VerySimpleServlet</servlet-class>
    </servlet>
 <servlet-mapping>
        <servlet-name>default1</servlet-name>
        <url-pattern>/welcome</url-pattern>
    </servlet-mapping>

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

程式為VerySimpleServlet。

另VerySimpleServlet修改如下,改成繼承HttpServlet,並且在執行時重導向至index.jsp
public class VerySimpleServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public VerySimpleServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
 }
 
 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  String redirect = response.encodeRedirectURL(request.getContextPath()
    + "/index.jsp");
  response.sendRedirect(redirect);
 }
}

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

正確的內容!



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

留言