在任何涉及交易的系統中,客戶與商家之間的交易資料具有核心作用,如購買商品的價格、數量、型號和優惠券等。在客戶挑選商品的過程中,這些交易資料逐漸形成;待客戶提交訂單時,交易資料被商家接收,形成雙方認可的訂單。交易資料在形成過程中必須要有可靠的臨時儲存,而不可靠的儲存會允許攻擊者提交偽造的交易資料,使商家利益受損。
iFlow 業務安全加固平臺 可以將交易過程中產生的資料動態儲存在後端,這樣攻擊者僅僅依靠篡改前端資料,是無法通過後端的資料檢查的。
以某個購物網站為例,在接收客戶提交訂單時,網站直接使用了之前產生的資料,而這些資料是能夠被攻擊者篡改的。使用 iFlow 可以在不修改網站原始碼的前提下,實現交易資料在後端的自動儲存和校驗。
一、依賴前端資料的原始網站
原始網站在使用者提交訂單時直接使用之前的金額資料,攻擊者能夠使用專用工具提交任意的金額資料。
1.1 正常使用者訪問
在客戶選好商品進入結算頁面時,頁面上顯示了金額 (實付款) 資料,在表單的隱藏域中也包含了這個資料。
客戶點選提交訂單按鈕後,包括金額在內所有交易資料被傳到後端並寫入到訂單記錄中。
反映在 HTTP 協議層面,是如下互動的:
1.2 攻擊者訪問
攻擊者使用 Burpsuite 工具來作為瀏覽器和網站之間的代理,Burpsuite 可以攔截報文並修改其中內容後再發出。
攻擊者挑選商品的步驟和正常使用者一樣,在進入結算頁面點選提交訂單之前,開啟 Burpsuite 的攔截按鈕。
點選提交訂單之後,Burpsuite 攔截並顯示出請求報文的內容,可以看到其中包含有金額資料。攻擊者將這個資料修改後,向伺服器端發出報文。
電商網站產生了這條訂單記錄,可以看到:它的金額為攻擊者篡改過的值。
HTTP 協議層面互動如下:
二、iFlow虛擬補丁後的網站
我們在 Web 伺服器前部署 iFlow 業務安全加固平臺,它有能力攔截、計算和修改雙向 HTTP 報文並具備儲存能力,成為 Web 應用的虛擬補丁。本例中,iFlow 通過在伺服器端儲存前面步驟所產生的資料,使得應用不再依賴於前端發出的資訊。
2.1 正常使用者訪問
使用者在進行結算時,iFlow 獲得 Web 伺服器發出的結算頁面,從中提取出金額資料並將其儲存在伺服器端快取中。正常使用者在提交訂單時,提交中的金額值應該與快取中的金額值一致。
正常使用者的 HTTP 協議互動過程如下:
2.2 攻擊者訪問
如前所示,攻擊者在提交訂單時,會使用工具強行修改請求報文中金額資料的值。這個提交到達 iFlow 時,iFlow 會發現提交中的金額值與快取中的金額值不一致,於是終止交易。
攻擊者的 HTTP 協議互動過程如下:
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 的規則是根據應用的實際情況和對安全功能的特定需求量身定製的,它不具備開箱即用的特點但卻適合構造複雜的防護邏輯。(張戈 | 天存資訊)