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
@WebServlet("/ToBuyPage")
public class ToBuyPage extends HttpServlet {
  private static final long serialVersionUID = 1L;

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    request.setAttribute("unitPrice", 10000);

    RequestDispatcher rd = request.getRequestDispatcher("/webScarab/buy.jsp");
    rd.forward(request, response);
  }
}
Buy.java
@WebServlet("/Buy")
public class Buy extends HttpServlet {
  private static final long serialVersionUID = 1L;

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    int unitPrice = Integer.valueOf(request.getParameter("unitPrice"));
    
    int quantity = Integer.valueOf(request.getParameter("quantity"));
    response.getWriter().append("Total Price: " + unitPrice * quantity);
  }

}
buy.jsp
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>

    <head>
        <title>shopping</title>
    </head>

    <body>

        <form action='<c:url value="/Buy"/>' method='POST'>
            <input type='hidden' name='unitPrice' value='${unitPrice}' /> 
            Buy Computer: <br /><hr>
            Quantity: <input type='text' name='quantity' />
            <br /> <br /> <input type='submit' value='Buy' />
        </form>

    </body>
</html>

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