天天看點

如何使用加密的Payload來識别并利用SQL注入漏洞

寫在前面的話

密碼學具有諸多優點,資訊的保密性同樣離不開密碼學,但是從曆史經驗來看,在保護應用和資料安全方面我們絕對不能過分依賴于密碼學。在這篇文章中,安全教育教育訓練專家sunilyadav将會讨論一個案例,并介紹如何通過一個加密的payload來發現并利用sql注入漏洞。

請注意:我們在此不打算讨論密碼學方面的問題(例如如何破解加密算法),我們讨論的是應用程式的安全缺陷,這方面問題是很多開發者最容易忽略的問題,而本文所描述的這個漏洞将允許我們通過一個加密的payload來識别并利用程式中的sql注入漏洞。

實際上,這個漏洞是我們在一次真實的滲透測試過程中所發現的。為了給大家進行示範,我們在實驗環境中對該漏洞進行了複現,接下來我們會讨論整個測試過程的具體細節。

如何使用加密的Payload來識别并利用SQL注入漏洞

漏洞發現

近期,我們對一個電子商務應用進行了滲透測試。我們發現,其中絕大多數的請求參數值都經過了加密處理。當請求參數值被加密之後,我們是很難對應用進行滲透測試/模糊測試的,除非我們能夠破解它所使用的加密算法。如果在時間有限的黑盒測試過程中遇到這樣的問題,那絕對是一個噩耗。

下面這張圖檔顯示的就是這個測試項目中的訂單詳情頁面,其中的訂單id(orderid)參數就是以加密形式發送的:

如何使用加密的Payload來識别并利用SQL注入漏洞

位址欄中的參數值“bdkfx3xnksc=”是經過加密的,雖然加密後的id參數值為base64編碼格式,但這裡不僅僅隻采用了base64編碼。除此之外我們還發現,如果我們登出了應用,并使用相同的使用者賬号重新登入,然後再次通路相同的頁面。此時,這個經過加密的參數值就變成了“npbri1km2ic=”,具體如下圖所示:

如何使用加密的Payload來識别并利用SQL注入漏洞

由此可以看出,加密過程要麼使用了一個随機密鑰,要麼就是加密密鑰中有一部分資料是由會話id構成的。從表面上看,這個應用是非常安全的,沒錯吧?但是我們都知道,這世界上沒有絕對安全的程式,是以我們仍然要想辦法找出其中有可能存在的一些加密缺陷。

首先,我們嘗試在多個地方注入單引号(’)來測試系統是否能夠對使用者的輸入進行有效驗證。但是,由于這些輸入必須以加密格式提供給系統,是以我們的請求參數被系統拒絕了。

接下來,我們注意到了該應用的購物車分享功能。這個功能允許使用者将自己購物車裡的商品分享給好友,當使用者儲存好購物車裡的商品并點選分享之後,系統會生成一個帶有随機令牌的連結。通過通路這個連結(url),使用者就可以直接檢視好友的購物車了。而且在儲存購物車商品之前,使用者還需要給購物車命名。

如何使用加密的Payload來識别并利用SQL注入漏洞

由于這是一個使用頻率非常低的文本輸入域,是以我們的模糊測試打算從這裡入手,并嘗試找出sql注入漏洞或xss漏洞,但這一次仍然一無所獲。不過,我們意識到了一件事情,那就是我們所發現的這個分享位址和購物車命名框也許會成為我們的突破口。在進一步分析之後,我們發現購入車分享位址中所使用的令牌就是購物車名稱加密後所得到的密文。

雖然這個購物車分享功能并不會受到任何網絡攻擊的影響,但是我們卻能夠利用這個功能并根據輸入的資訊(明文,即購物車名稱)來生成加密payload(密文)。現在,我們就可以利用這個功能來生成一個攻擊payload,并利用它來檢查應用程式中可能存在的漏洞,例如sql注入漏洞以及身份認證繞過等等。為了檢測sql注入漏洞,我們需要生成單引号(’)所對應的加密值,具體如下圖所示:

如何使用加密的Payload來識别并利用SQL注入漏洞

這樣一來,對于那些隻接受加密值作為輸入資料的文本域,我們就可以使用這種加密payload來進行模糊測試了。雖然尋找注入點的過程花費了我們不少的時間,但最終我們還是找到了一個sql注入漏洞。具體如下圖所示,我們在測試訂單物品(orderitem)頁面的ip參數時,系統傳回了一個sql錯誤資訊:

如何使用加密的Payload來識别并利用SQL注入漏洞

從錯誤資訊中可以看出,這個電子商務應用生成了動态查詢語句,這裡就有可能存在一個sql注入漏洞,而我們可以利用這個漏洞從資料庫中提取出有價值的資訊。在這裡,我們準備使用sql

union查詢語句來從資料庫中提取資料,而union操作符可以合并兩條或多條select子句。

接下來,我們需要确定資料庫表中的列數。在進行了一系列測試之後,我們從傳回資訊中得知了列數(30)。現在,我們就可以從資料庫中提取有效資訊了。我們建立了一個加密payload,具體如下所示:

如何使用加密的Payload來識别并利用SQL注入漏洞

通過上面這條sql語句所生成的payload(id參數),我們得到了系統所使用的資料庫版本資訊。

如何使用加密的Payload來識别并利用SQL注入漏洞

最後,我們還利用這個漏洞攻下了資料庫系統,并拿到了背景伺服器的shell。

總結

這個電子商務應用程式使用了加密參數來實作安全保護,這也是通過資訊隐匿來實作安全性的一個例子,但是這種做法并不能保證軟體的安全。隻有在密鑰得到有效保護的情況下,采用健壯加密算法進行加密的資料才能夠真正地保證安全。實際上,密碼學以及資訊加密手段已經成為了我們防止隐私消息被竊聽或篡改的一種常用方法,但是由于系統在實作加密過程中的錯誤以及開發人員對加密手段的使用不當,往往會導緻更加嚴重的安全漏洞出現。

作者:alpha_h4ck

來源:51cto