WEB安全新玩法 [3] 防護交易資料篡改

天存資訊發表於2021-06-24

在任何涉及交易的系統中,客戶與商家之間的交易資料具有核心作用,如購買商品的價格、數量、型號和優惠券等。在客戶挑選商品的過程中,這些交易資料逐漸形成;待客戶提交訂單時,交易資料被商家接收,形成雙方認可的訂單。交易資料在形成過程中必須要有可靠的臨時儲存,而不可靠的儲存會允許攻擊者提交偽造的交易資料,使商家利益受損。

iFlow 業務安全加固平臺 可以將交易過程中產生的資料動態儲存在後端,這樣攻擊者僅僅依靠篡改前端資料,是無法通過後端的資料檢查的。


以某個購物網站為例,在接收客戶提交訂單時,網站直接使用了之前產生的資料,而這些資料是能夠被攻擊者篡改的。使用 iFlow 可以在不修改網站原始碼的前提下,實現交易資料在後端的自動儲存和校驗。

一、依賴前端資料的原始網站

原始網站在使用者提交訂單時直接使用之前的金額資料,攻擊者能夠使用專用工具提交任意的金額資料。

1.1 正常使用者訪問

在客戶選好商品進入結算頁面時,頁面上顯示了金額 (實付款) 資料,在表單的隱藏域中也包含了這個資料。

圖1

客戶點選提交訂單按鈕後,包括金額在內所有交易資料被傳到後端並寫入到訂單記錄中。

圖2

反映在 HTTP 協議層面,是如下互動的:

sequenceDiagram participant 正常使用者 participant 瀏覽器 participant Web伺服器 正常使用者->>瀏覽器: 點選:結算 瀏覽器->>Web伺服器: 請求:結算 Web伺服器->>瀏覽器: 返回:結算資訊 Note over 瀏覽器: 表單中包含金額資料 瀏覽器->>正常使用者: 顯示:結算頁面 正常使用者->>瀏覽器: 點選:提交訂單 Note over 瀏覽器: 提交中包含金額資料 瀏覽器->>Web伺服器: 請求:提交訂單 Web伺服器->>瀏覽器: 返回:訂單確認 瀏覽器->>正常使用者: 顯示:訂單確認頁面

1.2 攻擊者訪問

攻擊者使用 Burpsuite 工具來作為瀏覽器和網站之間的代理,Burpsuite 可以攔截報文並修改其中內容後再發出。

攻擊者挑選商品的步驟和正常使用者一樣,在進入結算頁面點選提交訂單之前,開啟 Burpsuite 的攔截按鈕。

圖3

點選提交訂單之後,Burpsuite 攔截並顯示出請求報文的內容,可以看到其中包含有金額資料。攻擊者將這個資料修改後,向伺服器端發出報文。

圖4

電商網站產生了這條訂單記錄,可以看到:它的金額為攻擊者篡改過的值。

圖5

HTTP 協議層面互動如下:

sequenceDiagram participant 攻擊者 participant 瀏覽器 participant Web伺服器 攻擊者->>瀏覽器: 點選:結算 瀏覽器->>Web伺服器: 請求:結算 Web伺服器->>瀏覽器: 返回:結算資訊 Note over 瀏覽器: 表單中包含金額資料 瀏覽器->>攻擊者: 顯示:結算頁面 攻擊者->>瀏覽器: 點選:提交訂單 Note over 瀏覽器: 提交中包含金額資料 rect rgb(250, 128, 128) Note over 瀏覽器: 修改報文中的金額資料 end 瀏覽器->>Web伺服器: 請求:提交訂單 Web伺服器->>瀏覽器: 返回:訂單確認 瀏覽器->>攻擊者: 顯示:訂單確認頁面

二、iFlow虛擬補丁後的網站

我們在 Web 伺服器前部署 iFlow 業務安全加固平臺,它有能力攔截、計算和修改雙向 HTTP 報文並具備儲存能力,成為 Web 應用的虛擬補丁。本例中,iFlow 通過在伺服器端儲存前面步驟所產生的資料,使得應用不再依賴於前端發出的資訊。

2.1 正常使用者訪問

使用者在進行結算時,iFlow 獲得 Web 伺服器發出的結算頁面,從中提取出金額資料並將其儲存在伺服器端快取中。正常使用者在提交訂單時,提交中的金額值應該與快取中的金額值一致。

正常使用者的 HTTP 協議互動過程如下:

sequenceDiagram participant 正常使用者 participant 瀏覽器 participant iFlow participant Web伺服器 正常使用者->>瀏覽器: 點選:結算 瀏覽器->>Web伺服器: 請求:結算 Web伺服器->>iFlow: 返回:結算資訊 rect rgb(160, 250, 160) Note over iFlow: 記錄金額資料 end iFlow->>瀏覽器: 返回:結算資訊 Note over 瀏覽器: 表單中包含金額資料 瀏覽器->>正常使用者: 顯示:結算頁面 正常使用者->>瀏覽器: 點選:提交訂單 Note over 瀏覽器: 提交中包含金額資料 瀏覽器->>iFlow: 請求:提交訂單 rect rgb(160, 250, 160) Note over iFlow: 檢驗金額資料:一致 end iFlow->>Web伺服器: 請求:提交訂單 Web伺服器->>瀏覽器: 返回:訂單確認 瀏覽器->>正常使用者: 顯示:訂單確認頁面

2.2 攻擊者訪問

如前所示,攻擊者在提交訂單時,會使用工具強行修改請求報文中金額資料的值。這個提交到達 iFlow 時,iFlow 會發現提交中的金額值與快取中的金額值不一致,於是終止交易。

攻擊者的 HTTP 協議互動過程如下:

sequenceDiagram participant 攻擊者 participant 瀏覽器 participant iFlow participant Web伺服器 攻擊者->>瀏覽器: 點選:結算 瀏覽器->>Web伺服器: 請求:結算 Web伺服器->>iFlow: 返回:結算資訊 rect rgb(160, 250, 160) Note over iFlow: 記錄金額資料 end iFlow->>瀏覽器: 返回:結算資訊 Note over 瀏覽器: 表單中包含金額資料 瀏覽器->>攻擊者: 顯示:結算頁面 攻擊者->>瀏覽器: 點選:提交訂單 Note over 瀏覽器: 提交中包含金額資料 rect rgb(250, 128, 128) Note over 瀏覽器: 修改報文中的金額資料 end 瀏覽器->>iFlow: 請求:提交訂單 rect rgb(160, 250, 160) Note over iFlow: 檢驗金額資料:不一致 end iFlow->>瀏覽器: 返回:終止交易 rect rgb(250, 128, 128) 瀏覽器->>攻擊者: 返回:終止交易 end

2.3 程式碼

iFlow 內建的 W2 語言是一種專門用於實現 Web 應用安全加固的類程式語言。它介於配置和通用語言之間,具備程式設計的基本要素和針對 HTTP 協議的特有擴充套件,能為業務系統編寫涉及複雜判斷和動態修改的邏輯。

考慮到安全產品的使用者通常為非程式設計師,他們習慣面對配置檔案而非一段程式碼。因此,W2 語言雖包含語言要素,仍以規則檔案方式呈現,並採用可以體現層次結構和方便詞法校驗的 JSON 格式。

用 W2 語言實現上述虛擬補丁的程式碼如下:

[
	{
		"if": [
			"REQUEST_FILENAME == '/shopxo-1.6.0/index.php'",
			"@ARGS.s == '/index/buy/index'"
	    ],
		"then": {
			"execution": { 
				"directive": "setVariable", 
				"variable": "SESSION.payment_amount", 
				"value": "match(RESPONSE_BODY, 'class=\"nav-total-price\">(.*)</em>', 0, 1)"
			} 
		}
	},
	{
		"if": [ 
			"REQUEST_FILENAME == '/shopxo-1.6.0/index.php'",
			"@ARGS.s == '/index/buy/add.html'",
			"SESSION.payment_amount != @ARGS.price"
		],
		"then": { 
			"verdict": { 
				"action": "deny", 
				"log": "Price tampered: ${SESSION.payment_amount} => ${ARGS.price}" 
			} 
		} 
	}
]

示例程式碼中有兩條規則,分別作用如下:

第一條規則

伺服器返回結算頁面時,iFlow 在響應報文中提取金額數值,並存放在此會話 (SESSION)的儲存變數 payment_amount 中。

第二條規則

當瀏覽器請求提交訂單時,iFlow 檢查請求引數 price 的值與會話 (SESSION) 的儲存變數 payment_amount 的值是否相等,如果不相等則阻止該使用者的繼續操作。

注意:上述會話中的 payment_amount 標誌是儲存在伺服器端的 iFlow 儲存中的,在瀏覽器端是看不到資料,更無法篡改的。

三、總結

iFlow 使用兩條規則在不修改伺服器端程式碼的前提下,透明地實現了在後端的金額驗證邏輯。

通過這個例子可以看出,iFlow 與一般 WAF 的一個重要區別——iFlow 的規則是根據應用的實際情況和對安全功能的特定需求量身定製的,它不具備開箱即用的特點但卻適合構造複雜的防護邏輯。(張戈 | 天存資訊)

相關文章