水平越權是指系統中的用戶在未經授權的情況下,查看到另一個同級別用戶所擁有的資源,水平越權會導致資訊泄露,其產生原因是軟體業務設計或編碼上的缺陷,iFlow 業務安全加固平臺可以緩解部分場景下的水平越權問題,
以某電商網站為例,其查看訂單功能存在漏洞:僅依靠修改 URL 引數,任意登錄用戶不僅可以查看自己的訂單資訊,也可以查看到其他用戶的訂單資訊,我們看看在網站自身存在缺陷的情況下,如何利用 iFlow 阻止水平越權的訂單資訊訪問,
一、原始網站
1.1 正常用戶訪問
正常用戶登錄成功之后,進入個人中心的訂單管理頁面顯示自己的訂單串列,

從訂單串列中點擊其中一個訂單的訂單詳情,則可以看到訂單的具體資訊,

HTTP 互動流程如下:
sequenceDiagram participant 正常用戶 participant 瀏覽器 participant Web服務器 正常用戶->>瀏覽器: 點擊【訂單管理】 瀏覽器->>Web服務器: 請求:訂單管理 Web服務器->>瀏覽器: 回傳:訂單串列 瀏覽器->>正常用戶: 顯示:訂單串列頁面 正常用戶->>瀏覽器: 點擊其中一項【訂單詳情】 瀏覽器->>Web服務器: 請求:訂單詳情 Web服務器->>瀏覽器: 回傳:訂單詳情 瀏覽器->>正常用戶: 顯示:訂單詳情頁面1.2 攻擊者訪問
電商網站在處理訂單詳情業務時有個漏洞:它使用提交引數中的訂單 ID 在資料庫中獲取到了訂單資訊,但沒有去檢查訂單所有者是否與已登錄用戶為同一用戶,而是直接將訂單資訊回傳給了瀏覽器,
這樣,攻擊者與正常用戶經過同樣的操作 (即在訂單串列查看自己的訂單詳情) 后,可以手工修改 URL 中的訂單 ID 從而獲取到任意用戶的訂單資訊,這個程序可以連續地進行,
下圖中,攻擊者訪問了 ID 為 8 的訂單詳情,而這個訂單本應屬于「test01」用戶,

HTTP 互動流程如下:
sequenceDiagram participant 攻擊者 participant 瀏覽器 participant Web服務器 攻擊者->>瀏覽器: 點擊【訂單管理】 瀏覽器->>Web服務器: 請求:訂單管理 Web服務器->>瀏覽器: 回傳:訂單串列 瀏覽器->>攻擊者: 顯示:訂單串列頁面 攻擊者->>瀏覽器: 點擊其中一項【訂單詳情】 瀏覽器->>Web服務器: 請求:訂單詳情 Web服務器->>瀏覽器: 回傳:訂單詳情 瀏覽器->>攻擊者: 顯示:自己的訂單詳情頁面 rect rgb(250, 128, 128) 攻擊者->>瀏覽器: 請求引數id修改為任意值 end 瀏覽器->>Web服務器: 請求:訂單詳情 Web服務器->>瀏覽器: 回傳:訂單詳情 rect rgb(250, 128, 128) 瀏覽器->>攻擊者: 顯示:他人的訂單詳情頁面 end二、iFlow虛擬補丁后的網站
我們在 Web 服務器前部署 iFlow 業務安全加固平臺,它有能力攔截、計算和修改雙向 HTTP 報文并具備存盤能力,成為 Web 應用的虛擬補丁,在本例中,iFlow 記錄訂單串列中的所有訂單 ID,在用戶訪問訂單詳情時進行檢查,
2.1 正常用戶訪問
服務器在回傳用戶訂單串列時,iFlow 決議出每一訂單專案的訂單 ID 形成用戶的 合法id記錄,用戶在訪問訂單詳情時,iFlow 檢查要訪問的訂單 ID 是否包含在 合法id記錄 中,
正常用戶的 HTTP 互動流程如下:
sequenceDiagram participant 正常用戶 participant 瀏覽器 participant iFlow participant Web服務器 正常用戶->>瀏覽器: 點擊【訂單管理】 瀏覽器->>Web服務器: 請求:訂單管理 Web服務器->>iFlow: 回傳:訂單串列 rect rgb(160, 250, 160) Note over iFlow: 所有訂單id形成合法id記錄 end iFlow->>瀏覽器: 回傳:訂單串列 瀏覽器->>正常用戶: 顯示:訂單串列頁面 正常用戶->>瀏覽器: 點擊其中一項【訂單詳情】 瀏覽器->>iFlow: 請求:訂單詳情 rect rgb(160, 250, 160) Note over iFlow: 訂單id在合法id記錄中 end iFlow->>Web服務器: 請求:訂單詳情 Web服務器->>瀏覽器: 回傳:訂單詳情 瀏覽器->>正常用戶: 顯示:訂單詳情頁面2.2 攻擊者訪問
如前所示,攻擊者自行修改訂單 ID 發出請求,iFlow 攔截此請求,發現請求的 ID 不在 合法id記錄 中,即終止此程序,
攻擊者的 HTTP 協議互動程序如下:
sequenceDiagram participant 攻擊者 participant 瀏覽器 participant iFlow participant Web服務器 攻擊者->>瀏覽器: 點擊【訂單管理】 瀏覽器->>Web服務器: 請求:訂單管理 Web服務器->>iFlow: 回傳:訂單串列 rect rgb(160, 250, 160) Note over iFlow: 所有訂單id形成合法id記錄 end iFlow->>瀏覽器: 回傳:訂單串列 瀏覽器->>攻擊者: 顯示:訂單串列頁面 攻擊者->>瀏覽器: 點擊其中一項【訂單詳情】 瀏覽器->>iFlow: 請求:訂單詳情 rect rgb(160, 250, 160) Note over iFlow: 訂單id在合法id記錄中 end iFlow->>Web服務器: 請求:訂單詳情 Web服務器->>瀏覽器: 回傳:訂單詳情 瀏覽器->>攻擊者: 顯示:訂單詳情頁面 rect rgb(250, 128, 128) 攻擊者->>瀏覽器: 請求引數id修改為任意值 end 瀏覽器->>iFlow: 請求:訂單詳情 rect rgb(160, 250, 160) Note over iFlow: 訂單id不在合法id記錄中 end iFlow->>瀏覽器: 回傳:終止訪問 rect rgb(250, 128, 128) 瀏覽器->>攻擊者: 終止訪問 end2.3 代碼
iFlow 內置的 W2 語言是一種專門用于實作 Web 應用安全加固的類編程語言,它介于配置和通用語言之間,具備編程的基本要素和針對 HTTP 協議的特有擴展,能為業務系統撰寫涉及復雜判斷和動態修改的邏輯,
考慮到安全產品的使用者通常為非程式員,他們習慣面對組態檔而非一段代碼,因此,W2 語言雖包含語言要素,仍以規則檔案方式呈現,并采用可以體現層次結構和方便詞法校驗的 JSON 格式,
用 W2 語言實作上述虛擬補丁的代碼如下:
[
{
"if": [
"streq(REQUEST_FILENAME, '/shopx/index.php')",
"streq(@ARGS.s, '/index/order/index.html')"
],
"then": {
"execution": {
"directive": "setVariable",
"variable": "SESSION.valid_ids",
"value": "rxMatch(RESPONSE_BODY, '<a[^>]+href=https://www.cnblogs.com/"[^\"].*(/index/order/detail/id.*)\" target=.*\"[^>]*>', -1, 1)",
"expiry": 3600
}
}
},
{
"if": [
"streq(REQUEST_FILENAME, '/shopx/public/index.php')",
"contain(@ARGS.s, '/index/order/detail/id')",
"!contain(SESSION.valid_ids, @ARGS.s)",
],
"then": {
"verdict": {
"action": "deny",
"log": "User access page ${@ARGS.s} NOT in ${SESSION.valid_ids}"
}
}
}
]
示例代碼中有兩條規則,分別作用如下:
第一條規則
當服務器回傳訂單串列時,iFlow 決議此回應,iFlow 用正則運算式匹配串列中每一個訂單詳情的鏈接,然后保存在會話 (SESSION) 的存盤變數 valid_ids 中,
第二條規則
當瀏覽器請求訂單詳情時,iFlow 攔截此請求,iFlow 檢查請求引數 s 是否包含在會話 (SESSION) 的存盤變數 valid_ids 中,如果沒有,則表示這個訂單 ID 是攻擊者自行輸入的,阻止訪問,
注意:上述會話中的
valid_ids是保存在服務器端的 iFlow 存盤中的,攻擊者在瀏覽器端是看不到資料更無法進行修改的,
三、總結
iFlow 使用兩條規則在不修改服務器端代碼的前提下,利用沒有越權的訂單串列資訊,透明地保證了訂單詳情不被水平越權查看,
這個例子是建立在用戶常規操作順序的基礎上的,即先獲得訂單串列再查看訂單詳情,如果網站的其他頁面也包含了訂單詳情鏈接或者用戶從書簽中訪問訂單詳情,則會產生誤判,因此,它僅適用于這個場景而非徹底解決了水平越權問題,
以補丁方式解決水平越權問題還可以有其他一些方式,如后端引數混淆、加入鑒別碼等方式,如何用 iFlow 實作這些功能,在后續介紹中可以看到,(張戈 | 天存資訊)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/288699.html
標籤:其他
上一篇:現代醫院資訊化建設策略與實踐
下一篇:OSPF基本原理和基礎配置
