如何使用加密的Payload來識別并利用SQL注入漏洞
寫在前面的話
密碼學具有諸多優點,信息的保密性同樣離不開密碼學,但是從歷史經驗來看,在保護應用和數據安全方面我們絕對不能過分依賴于密碼學。在這篇文章中,安全教育培訓專家SunilYadav將會討論一個案例,并介紹如何通過一個加密的Payload來發現并利用SQL注入漏洞。
請注意:我們在此不打算討論密碼學方面的問題(例如如何破解加密算法),我們討論的是應用程序的安全缺陷,這方面問題是很多開發者最容易忽略的問題,而本文所描述的這個漏洞將允許我們通過一個加密的Payload來識別并利用程序中的SQL注入漏洞。
實際上,這個漏洞是我們在一次真實的滲透測試過程中所發現的。為了給大家進行演示,我們在實驗環境中對該漏洞進行了復現,接下來我們會討論整個測試過程的具體細節。
漏洞發現
近期,我們對一個電子商務應用進行了滲透測試。我們發現,其中絕大多數的請求參數值都經過了加密處理。當請求參數值被加密之后,我們是很難對應用進行滲透測試/模糊測試的,除非我們能夠破解它所使用的加密算法。如果在時間有限的黑盒測試過程中遇到這樣的問題,那絕對是一個噩耗。
下面這張圖片顯示的就是這個測試項目中的訂單詳情頁面,其中的訂單ID(orderid)參數就是以加密形式發送的:
地址欄中的參數值“BDKfx3xNKsc=”是經過加密的,雖然加密后的ID參數值為base64編碼格式,但這里不僅僅只采用了base64編碼。除此之外我們還發現,如果我們登出了應用,并使用相同的用戶賬號重新登錄,然后再次訪問相同的頁面。此時,這個經過加密的參數值就變成了“nPBri1km2ic=”,具體如下圖所示:
由此可以看出,加密過程要么使用了一個隨機密鑰,要么就是加密密鑰中有一部分數據是由會話ID構成的。從表面上看,這個應用是非常安全的,沒錯吧?但是我們都知道,這世界上沒有絕對安全的程序,所以我們仍然要想辦法找出其中有可能存在的一些加密缺陷。
首先,我們嘗試在多個地方注入單引號(’)來測試系統是否能夠對用戶的輸入進行有效驗證。但是,由于這些輸入必須以加密格式提供給系統,所以我們的請求參數被系統拒絕了。
接下來,我們注意到了該應用的購物車分享功能。這個功能允許用戶將自己購物車里的商品分享給好友,當用戶保存好購物車里的商品并點擊分享之后,系統會生成一個帶有隨機令牌的鏈接。通過訪問這個鏈接(URL),用戶就可以直接查看好友的購物車了。而且在保存購物車商品之前,用戶還需要給購物車命名。
由于這是一個使用頻率非常低的文本輸入域,所以我們的模糊測試打算從這里入手,并嘗試找出SQL注入漏洞或XSS漏洞,但這一次仍然一無所獲。不過,我們意識到了一件事情,那就是我們所發現的這個分享地址和購物車命名框也許會成為我們的突破口。在進一步分析之后,我們發現購入車分享地址中所使用的令牌就是購物車名稱加密后所得到的密文。
雖然這個購物車分享功能并不會受到任何網絡攻擊的影響,但是我們卻能夠利用這個功能并根據輸入的信息(明文,即購物車名稱)來生成加密Payload(密文)。現在,我們就可以利用這個功能來生成一個攻擊Payload,并利用它來檢查應用程序中可能存在的漏洞,例如SQL注入漏洞以及身份認證繞過等等。為了檢測SQL注入漏洞,我們需要生成單引號(’)所對應的加密值,具體如下圖所示:
這樣一來,對于那些只接受加密值作為輸入數據的文本域,我們就可以使用這種加密Payload來進行模糊測試了。雖然尋找注入點的過程花費了我們不少的時間,但最終我們還是找到了一個SQL注入漏洞。具體如下圖所示,我們在測試訂單物品(orderitem)頁面的IP參數時,系統返回了一個SQL錯誤信息:
從錯誤信息中可以看出,這個電子商務應用生成了動態查詢語句,這里就有可能存在一個SQL注入漏洞,而我們可以利用這個漏洞從數據庫中提取出有價值的信息。在這里,我們準備使用SQL UNION查詢語句來從數據庫中提取數據,而UNION操作符可以合并兩條或多條select子句。
接下來,我們需要確定數據庫表中的列數。在進行了一系列測試之后,我們從返回信息中得知了列數(30)。現在,我們就可以從數據庫中提取有效信息了。我們創建了一個加密Payload,具體如下所示:
通過上面這條SQL語句所生成的Payload(ID參數),我們得到了系統所使用的數據庫版本信息。
最后,我們還利用這個漏洞攻下了數據庫系統,并拿到了后臺服務器的Shell。
總結
這個電子商務應用程序使用了加密參數來實現安全保護,這也是通過信息隱匿來實現安全性的一個例子,但是這種做法并不能保證軟件的安全。只有在密鑰得到有效保護的情況下,采用健壯加密算法進行加密的數據才能夠真正地保證安全。實際上,密碼學以及信息加密手段已經成為了我們防止隱私消息被竊聽或篡改的一種常用方法,但是由于系統在實現加密過程中的錯誤以及開發人員對加密手段的使用不當,往往會導致更加嚴重的安全漏洞出現。