WEB安全新玩法 [7] 加密不安全下載路徑
提供下載功能的網站,其下載資源的連結是任何使用者都能獲取的。如若設計不當,攻擊者通過分析連結的文字,能夠構造出意外但有效的連結,訪問網站功能之外的資源,從而竊取主機上的敏感資訊。
以下就是這樣一個例子:網站將下載資源的檔案路徑作為引數傳入,但沒有對這個引數進行檢查,於是攻擊者可以構造多級父路徑來嘗試獲取作業系統的配置檔案。使用 iFlow 業務安全加固平臺能夠加密 URL 中的關鍵部分,使得攻擊者的這種構造行為無從進行。
一、原始網站
1.1 正常使用者訪問
使用者點選進入下載頁面,點選選擇其中一名球星,網站彈出下載框,使用者點選確定後圖片下載成功。
HTTP 互動過程如下:
sequenceDiagram participant 正常使用者 participant 瀏覽器 participant Web伺服器 正常使用者->>瀏覽器: 點選進入【下載頁面】 瀏覽器->>Web伺服器: 請求:下載頁面 Web伺服器->>瀏覽器: 返回:下載頁面 瀏覽器->>正常使用者: 顯示:下載頁面 正常使用者->>瀏覽器: 點選選擇球星【科比】 瀏覽器->>Web伺服器: GET /vul/dl/execdownload.php?filename=kb.png Web伺服器->>瀏覽器: 返回:球星圖片 瀏覽器->>正常使用者: 得到:球星圖片1.2 攻擊者訪問
同樣地,攻擊者點選進入下載頁面,點選選擇其中一名球星,網站彈出下載框,攻擊者點選確定後圖片下載成功。
以火狐瀏覽器為例,攻擊者單擊工具欄中的下載按鈕,可檢視下載的圖片,並複製下載連結。
攻擊者在新的標籤中嵌入拷貝下來的下載連結,將 kb.png
作如下修改—— ../../../../../../../../Windows/System32/drivers/etc/hosts
回車後即可看到敏感檔案下載框。
攻擊者點選確定後,就取得了 Windows 系統的敏感檔案: /Windows/System32/drivers/etc/hosts
HTTP 互動過程如下:
sequenceDiagram participant 攻擊者 participant 瀏覽器 participant Web伺服器 攻擊者->>瀏覽器: 點選進入【下載頁面】 瀏覽器->>Web伺服器: 請求:下載頁面 Web伺服器->>瀏覽器: 返回:下載頁面 瀏覽器->>攻擊者: 顯示:下載頁面 攻擊者->>瀏覽器: 點選選擇球星【科比】 瀏覽器->>Web伺服器: GET /vul/dl/execdownload.php?filename=kb.png Web伺服器->>瀏覽器: 返回:球星圖片 瀏覽器->>攻擊者: 得到:球星圖片 rect rgb(250, 128, 128) 攻擊者->>瀏覽器: 複製連結,修改引數 end 瀏覽器->>Web伺服器: GET /vul/dl/execdownload.php?filename=../../../../../../../../Windows/System32/drivers/etc/hosts Web伺服器->>瀏覽器: 返回:系統敏感檔案 rect rgb(250, 128, 128) 瀏覽器->>攻擊者: 得到:系統敏感檔案 end二、iFlow虛擬補丁後的網站
我們在 Web 伺服器前部署 iFlow 業務安全加固平臺,它有能力攔截、計算和修改雙向 HTTP 報文並具備儲存能力,成為 Web 應用的虛擬補丁。在本例中,iFlow 將下載頁面中的下載連結加密,使得攻擊者無從構造 URL。
2.1 正常使用者訪問
使用者訪問下載頁面時,Web 伺服器原始頁面上的下載連結是明文的,iFlow 將它們全部加密後發給使用者;使用者點選其中一項後,瀏覽器發出密文連結的請求,iFlow 將密文連結解密為明文,再向 Web 伺服器端發出請求。
正常使用者的 HTTP 互動流程如下:
sequenceDiagram participant 正常使用者 participant 瀏覽器 participant iFlow participant Web伺服器 正常使用者->>瀏覽器: 點選進入【下載頁面】 瀏覽器->>Web伺服器: 請求:下載頁面 Web伺服器->>iFlow: 返回:包含明文連結的下載頁面 rect rgb(160, 250, 160) Note over iFlow: 加密每一個下載連結 end iFlow->>瀏覽器: 返回:包含密文連結的下載頁面 瀏覽器->>正常使用者: 顯示:下載頁面 正常使用者->>瀏覽器: 點選選擇球星【科比】 瀏覽器->>iFlow: GET /vul/dl/WTJSdmQyNXNiMkZrTG5Cb2NEOW1hV3hsYm1GdFpUMQ== rect rgb(160, 250, 160) Note over iFlow: 解密連結 end iFlow->>Web伺服器: GET /vul/dl/execdownload.php?filename=kb.png Web伺服器->>瀏覽器: 返回:球星圖片 瀏覽器->>正常使用者: 得到:球星圖片2.2 攻擊者訪問
攻擊者得到如下的下載連結:
<a href="/vul/dl/WTJSdmQyNXNiMkZrTG5Cb2NEOW1hV3hsYm1GdFpUMQ==">
顯然,攻擊者無法通過分析這段文字來構造攻擊請求。
2.3 程式碼
iFlow 內建的 W2 語言是一種專門用於實現 Web 應用安全加固的類程式語言。它介於配置和通用語言之間,具備程式設計的基本要素和針對 HTTP 協議的特有擴充套件,能為業務系統編寫涉及複雜判斷和動態修改的邏輯。
考慮到安全產品的使用者通常為非程式設計師,他們習慣面對配置檔案而非一段程式碼。因此,W2 語言雖包含語言要素,仍以規則檔案方式呈現,並採用可以體現層次結構和方便詞法校驗的 JSON 格式。
用 W2 語言實現上述虛擬補丁的程式碼如下:
[
{
"if": true,
"then": "TX.key='kj2Hdsol'"
},
{
"if": [
"streq(REQUEST_FILENAME, '/vul/dl/down_nba.php')",
"REQUEST_METHOD == 'GET'"
],
"then": {
"directive": "alterResponseBody",
"op": "regex",
"target": "execdownload.*png",
"target_transform": ["rc5_enc(TX.key)", "btoa"],
"substitute": "$0"
}
},
{
"if": "begin(REQUEST_FILENAME, '/vul/dl/')",
"then": [
"TX.part = rc5_dec(atob(REQUEST_FILENAME[8:]), TX.key)",
{
"if": "begin(TX.part, 'execdownload.php?filename=')",
"then": {
"directive": "alterRequestLine",
"op": "url",
"value": "/vul/dl/${TX.part}"
}
}
]
}
]
示例程式碼中有三條規則,分別作用如下:
第一條規則
定義了一個加密/解密用的金鑰字串,這個可以自行修改。
第二條規則
當伺服器返回下載頁面時,iFlow 截獲此響應。iFlow 用正則表示式匹配出頁面中的每一個下載連結,將其內容替換為用 RC5 加密後再進行 Base64 編碼的結果。
第三條規則
當瀏覽器請求圖片時,iFlow 截獲此請求。iFlow 用 Base64 解碼並用 RC5 解密請求 URL 中的密文部分。如果解密後的結果是明文符合原始下載連結的格式,則將這個明文作為 URL 發給後端 Web 伺服器。
注意:上述密碼演算法和金鑰完全是在伺服器端的 iFlow 中實現和運算的,攻擊者在客戶端是看不到演算法和金鑰的。
三、總結
iFlow 在不改動後端程式的情形下,防範攻擊者通過分析和構造連結來下載系統敏感檔案。值得說明的是,規則中的所有計算均在伺服器端實現,瀏覽器端不執行任何程式碼,攻擊者無法通過程式碼分析來破解。(張戈 | 天存資訊)