強加密算法下,SQL注入案例
密碼學具有各種優點,包括信息的機密性。然而,過度依賴密碼學來保護應用程序是一個壞主意。今天我們就通過一個案例研究,來認識一下通過加密的有效載荷識別和利用SQL注入漏洞。
SQL注入也許很多人都知道或者使用過,如果沒有了解或完全沒有聽過也沒有關系,因為接下來我們將介紹SQL Injection。
SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙 服務器 執行惡意的SQL命令。
具體來說,它是利用現有應用程序,將惡意的SQL命令注入到后臺 數據庫 引擎執行的能力,它可以通過在Web表單中輸入惡意SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
那SQL注入會在什么時候發生呢?
假設我們在瀏覽器中輸入URL www.sample.com,由于它只是對頁面的簡單請求無需對數據庫動進行動態請求,所以它不存在SQL Injection,當我們輸入www.sample.com?testid=23時,我們在URL中傳遞變量testid,并且提供值為23,由于它是對數據庫進行動態查詢的請求(其中?testid=23表示數據庫查詢變量),所以我們可以在該URL中嵌入惡意SQL語句。
不過要提前說明一下,我們不會在本文中討論加密問題,而是只討論應用程序缺陷,我們會先生成加密的有效載荷,然后將其用于識別和利用SQL注入。
在最近我們接觸到的一個電子商務應用程序中,觀察了該網站的大多數請求參數值已被加密。當請求參數被加密時,很難對應用程序進行模糊測試,除非我們可以去除加密,不過這需要知道密鑰和加密算法。
下圖就是我們所找的樣本網站的詳細信息頁面,該頁面就是以加密格式發送id(orderid)參數的。
注意:參數值(BDKfx3xNKsc =)是加密的,而不是簡單的base64編碼。ID參數的加密值以base64編碼格式表示。
我們還注意到,如果我們退出應用程序,然后以相同的用戶登錄并導航到完全相同的頁面,則加密參數(nPBri1km2ic =)的值現在不同,如下所示。
正如上圖所示,隨機密鑰在每個成功的登錄或會話ID(cookie的一部分)中用于加密,以某種方式用作密鑰的一部分。這看起來很安全,不過還是讓我們嘗試著SQL注入。
首先,我們嘗試在多個位置注入單引號(')以測試輸入驗證,但請求參數被拒絕,因為這些參數需要加密格式(即有效的密文)。
不過我們在這里可以使用購物車的一個分享功能,此功能允許用戶與其他人共享購物車項目。當用戶保存購物車進行共享時,會產生一個帶有隨機查詢令牌的鏈接。通過訪問此鏈接(URL),用戶可以訪問彼此的購物車。在購物車被要求保存之前,用戶被要求在購物車上標記一個名字。
由于這是接受明文輸入的罕見輸入字段之一,所以我們將其編碼為SQLi,XSS。在更深入的檢測中,我們發現生成的URL中的令牌共享購物車實際上是我們為購物車選擇的購物車名稱的密碼。
不過請注意,共享購物車功能可不會輕易受到任何攻擊的影響,但可以用于為給定輸入(明文)生成加密的有效內容(密文)。現在,可以共享購物車功能的鏈接就可以生成一個加密的攻擊有效載荷來檢查應用程序對SQL注入,繞過授權等漏洞行為進行驗證了。為了測試SQL注入,生成了單引號(')的加密值。
加密的有效載荷用于模糊僅接受密文值作為輸入的各種應用參數。我們花了一些時間來打到正確的位置,但是最終,orderitem頁面的ID參數返回一個SQL錯誤消息,確認該漏洞。
該錯誤消息證明應用程序生成動態查詢,并可能容易受到SQL注入攻擊。現在是從數據庫中提取信息的時候了,基于UNION的SQL查詢用于從數據庫中提取數據,聯合運算符用于組合兩個或多個select語句的結果。
第一個任務是確定作為SQL查詢的一部分返回的列數,使用試錯,我們在查詢中返回了一些列(30)。現在是時候從數據庫中提取信息了,我們創建了一個加密的有效載荷來提取數據庫版本信息,如下所示。
然后,把上述有效載荷的輸出生成的密文作為頁面上易受攻擊的ID參數輸入。
然后我們使用這個漏洞來構建數據庫系統,最終得到一個shell。
總結
由上面的分析可知,用加密參數來實現應用程序中的安全性其實并不像想象中的那么安全,比如用強加密算法加密的數據,惡意攻擊者可以使用加密的有效載荷的方式來進行攻擊。 目前,加密仍被認為是保護數據免遭篡改或欺騙的有力機制,不過由于加密執行不力和缺乏明確的使用隱私保護,所以仍有可能會造成相當危險的安全漏洞。