1. 程式人生 > 其它 >WEB安全新玩法 [7] 加密不安全下載路徑

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 在不改動後端程式的情形下,防範攻擊者通過分析和構造連結來下載系統敏感檔案。值得說明的是,規則中的所有計算均在伺服器端實現,瀏覽器端不執行任何程式碼,攻擊者無法通過程式碼分析來破解。(張戈 | 天存資訊)