2019年12月14日 星期六

使用WebScarab攔截並竄改參數


【小標】WebScarab簡介
WebScarab是一個用來分析「使用HTTPHTTPS傳輸協定的應用程式」的框架(framework)。它使用Java開發,因此可以適用於多種作業系統。WebScarab有多種作業模式,藉由多個plugin來完成實做。
在大部分的使用情境裡,WebScarab作用為「攔截代理程式(intercepting proxy)」,可以在使用者將請求(request)資料由瀏覽器送出至伺服器的過程中,予以攔截並修改;也可以攔截並修改伺服器對瀏覽器的回應(response)資料,藉此來測試網站的安全性設計。參考資料如下。
1.     WebScarabOWASP的子專案:https://www.owasp.org/index.php/Category:OWASP_WebScarab_Project
下載與安裝方式:
2.     下載「webscarab-installer-20070504-1631.jar」並點擊檔案,將可指定路徑進行解壓縮。
3.     點選解壓後路徑裡的「webscarab.jar」,即可執行。
7-05 webscarab-installer-20070504-1631.jar解壓縮後資料夾
【小標】使用WebScarab攔截並修改request
WebScarab功能強大,以下介紹攔截並修改request的步驟:
STEP01】預設使用「lite interface」,即簡易版的功能介面,只有2個功能頁籤;在「Intercept」頁籤可以勾選是否攔截requestresponse

7-06 簡易版的功能介面
STEP02】視需要切換為「full-featured interface」:
7-07 預備切換為完整版功能介面
STEP03】點選「Proxy」頁籤,再點選「Manual Edit」頁籤,可以勾選是否攔截requestresponse
7-08 完整版功能介面
STEP04】勾選攔截「Intercept request」,之後瀏覽器送出的request都將被WebScarab攔截:
7-09 設定攔截request/response對象
STEP05】同步調整瀏覽器Proxy設定,填入位址「localhost」與連接埠「8008」:

7-10 修改瀏覽器Proxy設定
STEP06】開啟IE,以WebGoat進行測試:http://localhost.:8080/WebGoat。注意在localhost後面加一個點「.」,讓IE使用設定的proxy
7-11 http://localhost.:8080/WebGoat
STEP07】瀏覽器送出的連結會被WebScarab攔截,並彈出以下視窗:
7-12 WebScarab攔截http://localhost.:8080/WebGoat
STEP08】在瀏覽器輸入帳號jim123、密碼jim123後送出,WebScarab將攔截其request。除非WebScarab放行,否則帳密無法傳送至主機:
7-13 WebScarab攔截送至網站的request中的參數usernamepassword
STEP09WebScarab攔截其request後,可以修改username後再點擊「Accept changes」送出:
7-14 WebScarab可修改請求參數
STEP10】因為帳號被修改而登入WebGoat失敗:
7-15 WebGoat登入失敗


【小標】修改關鍵參數

ToBuyPage.java
  1. @WebServlet("/ToBuyPage")
  2. public class ToBuyPage extends HttpServlet {
  3. private static final long serialVersionUID = 1L;
  4.  
  5. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  6. throws ServletException, IOException {
  7.  
  8. request.setAttribute("unitPrice", 10000);
  9.  
  10. RequestDispatcher rd = request.getRequestDispatcher("/webScarab/buy.jsp");
  11. rd.forward(request, response);
  12. }
  13. }
Buy.java
  1. @WebServlet("/Buy")
  2. public class Buy extends HttpServlet {
  3. private static final long serialVersionUID = 1L;
  4.  
  5. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  6. throws ServletException, IOException {
  7. int unitPrice = Integer.valueOf(request.getParameter("unitPrice"));
  8. int quantity = Integer.valueOf(request.getParameter("quantity"));
  9. response.getWriter().append("Total Price: " + unitPrice * quantity);
  10. }
  11.  
  12. }
buy.jsp
  1. <%@ page contentType="text/html;charset=UTF-8"%>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  3.  
  4. <html>
  5.  
  6. <head>
  7. <title>shopping</title>
  8. </head>
  9.  
  10. <body>
  11.  
  12. <form action='<c:url value="/Buy"/>' method='POST'>
  13. <input type='hidden' name='unitPrice' value='${unitPrice}' />
  14. Buy Computer: <br /><hr>
  15. Quantity: <input type='text' name='quantity' />
  16. <br /> <br /> <input type='submit' value='Buy' />
  17. </form>
  18.  
  19. </body>
  20. </html>

問題:
1. 如何竄改表單參數【unitPrice】?
2. 如何避免表單參數【unitPrice】被竄改?