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