一般我們在開發網頁時,通常使用到的http method為POST、GET等,而網頁系統在被資安
工具作掃描時,如果掃出網頁竟然能夠使用PUT、DELETE等不安全的method時,該怎麼針
對它做disabled呢?
本文探討的劇情為tomcat下的http://localhost:8080頁面,即webapps下的ROOT被掃出允許使
用DELETE、PUT等http method,由於ROOT在這邊有被拿來改寫使用,可供大家在這個頁
面點選連結進其它web系統,因此也需要disabled掉相關不安全的方法。
後來發現一篇文章的最後一位發言者有提到,由於conf下的web.xml設定的
導致預設一般web都存在delete、put等方法沒被擋,如下:
因此建議我們可以自訂自己的<servlet-name>default</servlet-name>來複寫掉它。
後來我一樣在ROOT下撰寫VerySimpleServlet.java及設定web.xml,如下
不過,再重新啟用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改為
這樣一來,當執行http://localhost:8080/時,會只針對/welcome,相對地它會再綁定執行的
程式為VerySimpleServlet。
另VerySimpleServlet修改如下,改成繼承HttpServlet,並且在執行時重導向至index.jsp
也就是說,執行http://localhost:8080/會再次導向至http://localhost:8080/index.jsp,得到原本
正確的內容!
PS. 最後試出的方式及解釋純屬猜測,若有誤請不吝指教喔!
工具作掃描時,如果掃出網頁竟然能夠使用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>
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. 最後試出的方式及解釋純屬猜測,若有誤請不吝指教喔!
留言
張貼留言