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