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】被竄改?

2019年11月14日 星期四

Spring Boot情境式網站開發指南:使用Spring Data JPA、Spring Security、Spring Web Flow(出版中,2020/06上架)

書名(暫定,依實際出版為主) :

Spring Boot 情境式網站開發指南 

:使用Spring框架Data JPA、Security、Web Flow

--------------------------------------------------------------------------------------------------


書封文案:

如何讓網站使用者有更佳的體驗一直是歷久不衰的話題。使用Spring Web Flow框架讓使用者在預先定義好的情境裡,逐步被引導完成複雜操作,我們稱為情境式網站。
伴隨企業資料上雲,物聯網、智慧型手機的普及,資安事件也逐年攀升;網路攻擊的頻率不再屈指可數,已經成為企業營運的日常威脅。OWASP統計的TOP 10攻擊模式提供企業資安防禦的方向,使用Spring Security框架加上簡易設定就可以築起堅實城牆。
Spring框架是Java語言裡最熱門的框架。打造一個功能強大、資訊安全的網站,使用Spring MVCSpring SecuritySpring Data JPA,再搭配Spring Boot以簡化設定並快速布署幾乎已經是業界開發標準。
本書介紹Spring框架模組的運作機制,書末專案實作結合Spring Web Flow以提升使用者操作體驗,完整呈現新一代企業網站的建置策略。

--------------------------------------------------------------------------------------------------

內容(暫定,依實際出版為主) :

Part 1:Java專案管理


第1章 Maven入門 (約45頁,已完成)


1.1 認識Maven的專案管理思維與架構
1.1.1 Maven的安裝和設定
1.1.2 Maven Repository

1.2 認識Maven的基本操作
1.2.1 使用maven-archetype-quickstart模板建立Java SE專案
1.2.2 使用maven-archetype-webapp模板建立Java Web專案
1.2.3 Maven專案的生命週期

1.3 結合Maven與Eclipse
1.3.1 Eclipse內建Maven
1.3.2 使用Eclipse以Maven建立Java SE專案
1.3.3 使用Eclipse以Maven建立Java Web專案
1.3.4 使用Eclipse匯入Maven專案


Part 2:Spring Data JPA


第2章 JPA與資料庫 (約108頁,已完成)

2.1 JPA介紹

2.2 JPA基礎
2.2.1 Persistence Unit與persistence.xml
2.2.2 Persistent Context、EntityManager與Entity生命週期管理
2.2.3 第一級快取(L1 Cache)
2.2.4 EntityManager與Transaction

2.3 Entity的繼承(Inheritance)設計
2.3.1 使用SINGLE_TABLE策略
2.3.2 使用JOINED策略
2.3.3 使用TABLE_PER_CLASS策略
2.3.4 比較SINGLE_TABLE、JOINED、TABLE_PER_CLASS差異

2.4 Entity的關聯(Relationships)設計
2.4.1 使用OneToOne設計
2.4.2 使用OneToMany設計
2.4.3 使用ManyToMany設計與自定義的欄位型態
2.4.4 FetchType與CascadeType

2.5 指定主鍵(Primary Key)值
2.5.1 主鍵(Primary Key)使用單一欄位且內容為流水號
2.5.2 主鍵(Primary Key)使用複合欄位

第3章 使用JPQL查詢語言 (約105頁,已完成)


3.1 使用JPQL基本語法
3.1.1 WHERE敘述的條件值使用字面常量(Literal)
3.1.2 ORDER BY
3.1.3 DISTINCT
3.1.4 WHERE敘述的條件值使用繫結變量(Bind Variable)
3.1.5 使用建構子敘述封裝複數欄位查詢結果
3.1.6 使用TUPLE封裝複數欄位查詢結果

3.2 使用JOIN
3.2.1 INNER JOIN
3.2.2 LEFT OUTER JOIN
3.2.3 FETCH JOIN
3.2.4 欄位型態為Map的Join

3.3 在WHERE敘述使用比較關鍵字
3.3.1 BETWEEN
3.3.2 IN
3.3.3 LIKE
3.3.4 NULL
3.3.5 ENPTY
3.3.6 MEMBER OF

3.4 使用聚合(Aggregation)函式
3.4.1 AVG()、COUNT()、MAX()、MIN()、SUM()
3.4.2 GROUP BY 

3.5 使用子查詢(Subquery)
3.5.1 子查詢
3.5.2 EXISTS
3.5.3 ALL與ANY

3.6 使用JPQL函式
3.6.1 字串函式
3.6.2 數學函式
3.6.3 日期函式

3.7 其他
3.7.1 集合物件型態的欄位處理方式
3.7.2 CASE WHEN

3.8 使用UPDATE敘述

3.9 使用DELETE敘述 



第4章 Criteria API入門 (約15頁,已完成)


4.1 Criteria API簡介
4.1.1 Criteria API的使用方式
4.1.2 使用Metamodel API塑模Entity類別

4.2 使用Criteria API建立型態安全(Typesafe)的查詢
4.2.1 使用CriteriaQuery物件建立查詢
4.2.2 使用from()建立查詢基礎
4.2.3 使用join()查詢Entity間的關聯性
4.2.4 使用Expression/Path物件瀏覽查詢欄位
4.2.5 使用Expression/Predicate物件限制查詢條件
4.2.6 使用orderBy()與groupBy()管理查詢結果
4.2.7 使用TypedQuery物件執行查詢


第5章 使用Spring Data JPA讓ORM更聰明 (約35頁,已完成)

5.1 Spring與ORM

5.2 Spring與JPA
5.2.1 設定EntityManagerFactory
5.2.2 開發JPA基礎的Repository/DAO類別

5.3 使用Spring Data JPA自動建立Repository物件
5.3.1 定義查詢方法
5.3.2 定義客製查詢
5.3.3 混合客製與基礎查詢



Part 3:Spring Security


第6章 OWASP高風險資安漏洞介紹 (約105頁,已完成)


6.1 OWASP組織與OWASP TOP 10介紹

6.2 OWASP資安工具介紹

6.3 OWASP TOP 10介紹
6.3.1    注入攻擊(Injection)
6.3.2    不當的對話管理(Session Management)
6.3.3    不當的身分驗證(Broken Authentication)
6.3.4    跨站腳本攻擊(Cross-Site Scripting/XSS)
6.3.5     不當的存取控制(Broken Access Control)
6.3.6     不當的安全性設定(Security Misconfiguration)
6.3.7     暴露機敏資料(Sensitive Data Exposure)
6.3.8     對於攻擊自覺不足(Insufficient Attack Protection)
6.3.9     跨站請求偽造(Cross-Site Request Forgery, CSRF)
6.3.10  使用不安全的元件(Using Components with Known Vulnerabilities)
6.3.11  未受防護的APIs(Under-protected APIs)
6.3.12  XML外部解析器漏洞(XML External Entity, XXE)
6.3.13  不安全的反序列化漏洞(Insecure Deserialization)

6.3.14  記錄與監控不足風險(Insufficient Logging & Monitoring)




第7章 使用Spring Security建構安全的網站 (約47頁,已完成)

7.1  Spring Security入門
7.1.1      了解Spring Security模組
7.1.2      啟用Spring Security
7.1.3      建立簡單的安全設定

7.2  選擇使用者資訊儲存機制
7.2.1      使用IN-MEMORY儲存機制驗證身分
7.2.2      使用關聯式資料表進行身份驗證
7.2.3      使用客製方式驗證使用者身分

7.3  資源請求的攔截處理
7.3.1      使用Spring Expressions Language進行保護
7.3.2      使用HTTPS加密通道
7.3.3      防護跨站請求偽造(cross-site request forgery, CSRF)

7.4  客製登入表單頁面
7.4.1      指定登入頁面
7.4.2      啟用記憶使用者(remember-me)功能
7.4.3      登出(logout)機制

7.5 保護JSP呈現的資訊
7.5.1      使用Spring SecurityJSP標籤函式庫


Part 4:Spring Boot 


第8章 使用Spring Boot簡化Spring開發 (約45頁,已完成)


8.1 Spring Boot簡介

8.2 使用Spring Boot開發專案
8.2.1 以Spring Initializr建立Spring Boot的WAR專案
8.2.2 以啟動器(Starter)簡化專案關聯(Dependencies)
8.2.3 以自動化設定(Auto-configuration)簡化專案設定
8.2.4 啟動Spring Boot的WAR專案
8.2.5 以設定的日誌(Logging)參數輸出紀錄
8.2.6 建立Spring Boot的JAR專案並啟動
8.2.7 Spring Boot的JAR、WAR專案差別

8.3 使用Spring Boot執行器取得網站執行狀況
8.3.1 執行器(Actuator)簡介
8.3.2 啟用和設定Spring Boot執行器
8.3.3 使用Spring Boot執行器預設端點(Endpoints)
8.3.4 建構Spring Boot執行器客製端點(Endpoints)




Part 5:Spring Web Flow 


第9章 Spring Web Flow  實作 (約45頁, 已完成)

9.1   情境式系統設計

9.2   設定Spring Web Flow
9.2.1  設定流程建構者(Flow Builder)
9.2.2  設定流程登錄檔(Flow Registry)
9.2.3  設定流程執行器(Flow Executor)
9.2.4  處理流程請求

9.3   建構Spring Web Flow
9.3.1  狀態(States)
9.3.2  轉換(Transitions)
9.3.3  資料(Data)

9.4   綜合實做:蛋糕訂購流程
9.4.1  定義蛋糕(Cake)訂購的主流程
9.4.2  定義客戶(Customer)相關的子流程
9.4.3  定義訂單(Order)相關的子流程
9.4.4  定義付款(Payment)相關的子流程
9.4.5  以Spring Security實作存取管控