杜建新
(內(nèi)蒙古師范大學(xué),內(nèi)蒙古 呼和浩特 010030)
當(dāng)前,Web應(yīng)用已經(jīng)得到了廣泛應(yīng)用,人們的網(wǎng)絡(luò)購(gòu)物、社交交友等都離不開Web應(yīng)用程序。但是由于Web應(yīng)用開發(fā)門檻較低,開發(fā)人員技術(shù)水平參差不齊,很多開發(fā)人員缺少安全開發(fā)思維,開發(fā)的Web應(yīng)用的安全防護(hù)能力較弱,存在SQL注入、跨站腳本攻擊等各種安全問題,攻擊者利用上述漏洞竊取企業(yè)和用戶信息、控制系統(tǒng)權(quán)限,嚴(yán)重威脅企業(yè)和用戶的信息安全。SQL注入攻擊以數(shù)據(jù)庫(kù)作為攻擊對(duì)象,通過(guò)偽造字符串實(shí)現(xiàn)在數(shù)據(jù)庫(kù)中盜取信息的目的,是一種典型的代碼注入式攻擊[1]。對(duì)攻擊者來(lái)說(shuō),SQL注入攻擊的原理相對(duì)簡(jiǎn)單,且一旦攻擊成功就可以獲取較大的收益。因此,開展針對(duì)SQL注入攻擊檢測(cè)與防御技術(shù)的研究具有重要的研究?jī)r(jià)值和現(xiàn)實(shí)意義。
大部分Web應(yīng)用程序在正常工作時(shí)都需要與后臺(tái)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)傳遞,而SQL是訪問數(shù)據(jù)庫(kù)服務(wù)器的標(biāo)準(zhǔn)語(yǔ)言。目前大多數(shù)的編程語(yǔ)言都可采用可編程方法與數(shù)據(jù)庫(kù)建立連接并傳遞數(shù)據(jù)。在實(shí)際使用Web應(yīng)用時(shí),通常需要將Web表單、cookie等數(shù)值傳遞給SQL進(jìn)行查詢,如果系統(tǒng)在傳遞該數(shù)值前沒有對(duì)其進(jìn)行驗(yàn)證,那么可能導(dǎo)致出現(xiàn)SQL注入漏洞[2]。
對(duì)構(gòu)建的動(dòng)態(tài)SQL語(yǔ)句,需要將輸入傳遞進(jìn)去,在傳遞前如果沒有對(duì)代碼進(jìn)行驗(yàn)證或編碼,那么攻擊者可將SQL語(yǔ)句當(dāng)作輸入提供給應(yīng)用,同時(shí)將SQL語(yǔ)句輸入給數(shù)據(jù)庫(kù)執(zhí)行。在構(gòu)造動(dòng)態(tài)字符串的過(guò)程中,轉(zhuǎn)義字符處理不當(dāng)、數(shù)據(jù)類型處理錯(cuò)誤、查詢語(yǔ)句設(shè)計(jì)不合理、查詢錯(cuò)誤、處理錯(cuò)誤以及對(duì)多個(gè)查詢請(qǐng)求處理不當(dāng)?shù)染赡軐?dǎo)致SQL注入攻擊的發(fā)生。圖1為SQL注入攻擊流程圖,首先傳遞動(dòng)態(tài)參數(shù)網(wǎng)頁(yè),對(duì)是否注入漏洞和數(shù)據(jù)庫(kù)類型進(jìn)行判斷,得到確認(rèn)后探測(cè)數(shù)據(jù)庫(kù)表名、列名和列值,然后擴(kuò)張權(quán)限,實(shí)施攻擊。
圖1 SQL注入攻擊流程圖
數(shù)據(jù)庫(kù)的不安全配置也是導(dǎo)致SQL注入攻擊發(fā)生的重要因素之一。很多數(shù)據(jù)庫(kù)都有默認(rèn)的預(yù)安裝內(nèi)容,例如主流的數(shù)據(jù)庫(kù)SQL Server的系統(tǒng)管理員賬戶默認(rèn)為“sa”;My SQL數(shù)據(jù)庫(kù)的默認(rèn)賬戶為“root”等,其他數(shù)據(jù)庫(kù)也會(huì)采用同樣的方式設(shè)置默認(rèn)賬戶,而且這些賬戶對(duì)應(yīng)的口令通常是公開的。一旦攻擊者利用SQL注入漏洞和授權(quán)賬戶連接數(shù)據(jù)庫(kù),即可利用內(nèi)置賬戶的權(quán)限執(zhí)行其他代碼。因此,開發(fā)人員在編碼時(shí)應(yīng)當(dāng)與數(shù)據(jù)庫(kù)管理人員協(xié)作,確保系統(tǒng)訪問數(shù)據(jù)庫(kù)時(shí)是在最低權(quán)限模型下運(yùn)行,或根據(jù)系統(tǒng)的實(shí)際功能需要對(duì)登錄角色權(quán)限進(jìn)行分離。
在線檢測(cè)主要包括關(guān)鍵詞檢測(cè)和SQL語(yǔ)句異常檢測(cè),關(guān)鍵詞檢測(cè)在客戶端對(duì)用戶的數(shù)據(jù)進(jìn)行檢測(cè),SQL語(yǔ)句異常檢測(cè)在服務(wù)器端執(zhí)行。在客戶端對(duì)用戶的輸入進(jìn)行檢測(cè)時(shí),主要實(shí)現(xiàn)對(duì)含有特定關(guān)鍵詞的輸入進(jìn)行檢測(cè)和攔截,對(duì)檢測(cè)到的關(guān)鍵詞進(jìn)行Error提示,并采取相應(yīng)的措施。如果該輸入繞過(guò)了客戶端的關(guān)鍵詞檢測(cè),則在服務(wù)器端對(duì)已經(jīng)嵌套在SQL語(yǔ)句中的輸入進(jìn)行SQL語(yǔ)句異常檢測(cè);如果檢測(cè)到異常,則同樣提示Error錯(cuò)誤并采取相應(yīng)措施,對(duì)通過(guò)檢測(cè)的SQL語(yǔ)句就可以傳遞給數(shù)據(jù)庫(kù)服務(wù)器用于執(zhí)行,服務(wù)器執(zhí)行該語(yǔ)句后給出響應(yīng),同時(shí)在數(shù)據(jù)庫(kù)日志中進(jìn)行記錄并將數(shù)據(jù)發(fā)送給離線檢測(cè)。
離線檢測(cè)的輸入是在線檢測(cè)部分發(fā)送來(lái)的數(shù)據(jù)庫(kù)日志文件和從網(wǎng)絡(luò)中直接過(guò)去的數(shù)據(jù)庫(kù)查詢語(yǔ)句。在采用文本處理方法對(duì)該SQL語(yǔ)句進(jìn)行處理后,將其分成測(cè)試數(shù)據(jù)和訓(xùn)練數(shù)據(jù)2個(gè)部分,對(duì)訓(xùn)練數(shù)據(jù)采用多種機(jī)器學(xué)習(xí)模型進(jìn)行訓(xùn)練,得到較優(yōu)的檢測(cè)模型,利用該模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行測(cè)試,實(shí)現(xiàn)離線條件下的SQL語(yǔ)句異常檢測(cè)。
目前,較為主流的SQL注入檢測(cè)方法是通過(guò)對(duì)用戶輸入的字符串或合成的SQL語(yǔ)句的合法性進(jìn)行判別來(lái)確定是否存在SQL注入攻擊行為。在檢測(cè)字符串或SQL語(yǔ)句時(shí),根據(jù)檢測(cè)方式的不同,現(xiàn)有方法大致可分為基于污點(diǎn)分析的檢測(cè)方法、基于文本向量化和機(jī)器學(xué)習(xí)的檢測(cè)方法以及基于規(guī)則匹配的檢測(cè)方法,下面分別對(duì)這3種方法進(jìn)行介紹和分析。
基于污點(diǎn)分析的檢測(cè)方法是信息流分析技術(shù)的一種,該方法先對(duì)敏感數(shù)據(jù)進(jìn)行標(biāo)記,跟蹤標(biāo)記數(shù)據(jù)在系統(tǒng)中的傳播情況,進(jìn)而判定該行為是否為攻擊行為[3]。具體來(lái)說(shuō),先對(duì)用戶輸入的不可信數(shù)據(jù)或可信的常量字符串?dāng)?shù)據(jù)進(jìn)行污點(diǎn)標(biāo)記,在程序執(zhí)行的過(guò)程中,跟蹤該標(biāo)記數(shù)據(jù)的傳播情況,在將SQL語(yǔ)句傳遞給數(shù)據(jù)庫(kù)之前對(duì)其進(jìn)行解析,分析污點(diǎn)信息,判斷是否存在SQL注入攻擊。圖2為基于污點(diǎn)分析的檢測(cè)模塊流程圖,先獲取一條指令,對(duì)安全函數(shù)進(jìn)行參數(shù)解析,獲取規(guī)則匹配數(shù)據(jù),判斷是否屬于污點(diǎn)攻擊行為。
圖2 基于污點(diǎn)分析的檢測(cè)模塊流程圖
在實(shí)際應(yīng)用時(shí),常見的方法主要包括利用積極污點(diǎn)標(biāo)記方法標(biāo)記常量字符串中的可信敏感字符,將污點(diǎn)信息以轉(zhuǎn)變編碼的方式存儲(chǔ)在字符串的編碼中,同時(shí)動(dòng)態(tài)跟蹤其傳播情況,根據(jù)編碼值確定SQL語(yǔ)句中敏感字符的來(lái)源,對(duì)SQL注入攻擊行為進(jìn)行防御。另一種常見的方法是標(biāo)記外部輸入的動(dòng)態(tài)污點(diǎn)分析檢測(cè)方法,該方法首先對(duì)用戶的輸入進(jìn)行標(biāo)記,解析根據(jù)輸入數(shù)據(jù)流動(dòng)態(tài)構(gòu)造的SQL語(yǔ)句,利用語(yǔ)法分析從中提取SQL語(yǔ)法數(shù),利用污點(diǎn)檢測(cè)算法檢測(cè)其中的結(jié)點(diǎn)是否被污染,從而判定是否存在SQL注入行為。
目前較為常見的SQL語(yǔ)句向量化方法主要有基于查詢轉(zhuǎn)換的方法、基于改進(jìn)查詢規(guī)范化的方法、基于Token圖的方法以及基于TFIDF文本向量化的方法等。其中基于查詢轉(zhuǎn)換的方法首先利用轉(zhuǎn)換函數(shù)將特殊字符、符號(hào)等轉(zhuǎn)換為詞的形式,然后利用詞來(lái)對(duì)SQL語(yǔ)句進(jìn)行向量化標(biāo)識(shí)?;诟倪M(jìn)查詢規(guī)范化的方法根據(jù)SQL語(yǔ)句的特點(diǎn),以空格為分隔符將其轉(zhuǎn)換為Token序列,然后根據(jù)Token與數(shù)字索引的關(guān)系,再將Token序列轉(zhuǎn)換為數(shù)值序列,最終用以數(shù)值組成的向量來(lái)標(biāo)識(shí)SQL語(yǔ)句?;赥oken圖的方法同樣以空格作為分隔符對(duì)SQL語(yǔ)句進(jìn)行分割,在將其轉(zhuǎn)化為Token序列后,定義滑動(dòng)窗口以Token圖向量來(lái)標(biāo)識(shí)SQL語(yǔ)句。圖3為基于ITFIDF算法的SQL注入攻擊檢測(cè)模型示意圖,基于TFIDF文本向量化的方法巧妙地利用了TFIDF算法的2個(gè)指標(biāo),即詞頻和逆文檔頻率,對(duì)SQL語(yǔ)句中的敏感字符進(jìn)行處理,計(jì)算敏感字符的TFIDF值,通過(guò)設(shè)計(jì)文本向量化方法將SQL語(yǔ)句數(shù)據(jù)集轉(zhuǎn)換為特征向量。
圖3 基于ITFIDF算法的SQL注入攻擊檢測(cè)模型示意圖
目前機(jī)器學(xué)習(xí)方法中用來(lái)檢測(cè)SQL注入攻擊的典型方法主要包括基于數(shù)據(jù)挖掘和SVM的方法、基于神經(jīng)網(wǎng)絡(luò)的檢測(cè)方法以及基于馬爾科夫模型的方法等[4]?;谖谋鞠蛄炕蜋C(jī)器學(xué)習(xí)的檢測(cè)方法通過(guò)將SQL語(yǔ)句轉(zhuǎn)換為特征向量,可以較為準(zhǔn)確地描述SQL語(yǔ)句的特征,利用機(jī)器學(xué)習(xí)對(duì)其進(jìn)行分析并得出檢測(cè)模型,得到的規(guī)則比人為制定的規(guī)則更為實(shí)用,但是該方法的檢測(cè)效率依賴于特征向量的準(zhǔn)確性和分類器的性能。
基于規(guī)則匹配的檢測(cè)方法的基本原理是設(shè)定一定的規(guī)則,通過(guò)檢測(cè)是否違反規(guī)則來(lái)判定是否存在攻擊行為。典型的方法包括基于正則表達(dá)式匹配的方法、基于語(yǔ)法樹特征匹配的方法和基于模式匹配的方法等[5]。
基于正則表達(dá)式匹配的方法利用構(gòu)建的正則表達(dá)式對(duì)用戶的輸入進(jìn)行匹配和過(guò)濾?;谡Z(yǔ)法樹特征匹配的方法首先構(gòu)建SQL語(yǔ)句語(yǔ)法樹,然后通過(guò)與待檢測(cè)語(yǔ)句進(jìn)行比對(duì)來(lái)檢測(cè)語(yǔ)句中是否存在SQL注入攻擊的可能?;谀J狡ヅ涞姆椒ㄖ饕o態(tài)階段和動(dòng)態(tài)階段;在靜態(tài)階段主要利用正常的查詢語(yǔ)句構(gòu)建合法模型;在動(dòng)態(tài)階段執(zhí)行查詢時(shí),將查詢語(yǔ)句與構(gòu)建的合法模型進(jìn)行比對(duì),從而發(fā)現(xiàn)其中可能存在的異常。
SQL注入攻擊防御方法大致可分為代碼層防御技術(shù)和平臺(tái)層防御技術(shù),下面分別對(duì)這2種技術(shù)進(jìn)行比較和分析。表1為幾種防御技術(shù)對(duì)比。
表1 幾種防御技術(shù)對(duì)比
3.1.1 基于預(yù)處理和參數(shù)化查詢的方法
該方法是指在程序中將參數(shù)化語(yǔ)句提前編譯好,當(dāng)程序訪問數(shù)據(jù)庫(kù)使用動(dòng)態(tài)SQL語(yǔ)句時(shí),不是直接將用戶的輸入傳遞給SQL語(yǔ)句,而是利用編譯好的參數(shù)進(jìn)行傳遞,從而降低發(fā)生SQL注入攻擊的概率。
3.1.2 基于輸入驗(yàn)證的方法
該方法在用戶輸入時(shí)即對(duì)其輸入字段進(jìn)行限制,如果數(shù)字、日期等具有固定格式的參數(shù)的數(shù)據(jù)類型已經(jīng)確定,則對(duì)其范圍進(jìn)行限定,此外,還可以利用黑名單和白名單的方法對(duì)用戶的輸入進(jìn)行限定。
3.1.3 基于安全函數(shù)的方法
該方法采用安全函數(shù)來(lái)對(duì)用戶的輸入進(jìn)行過(guò)濾和轉(zhuǎn)義,該安全函數(shù)既可以是系統(tǒng)自帶的,也可以是開發(fā)人員自定義的。該方法能夠提高攻擊者開展SQL注入攻擊的難度,進(jìn)而降低被攻擊的風(fēng)險(xiǎn)。
與代碼層防御技術(shù)不同,平臺(tái)層防御技術(shù)主要在應(yīng)用程序運(yùn)行過(guò)程中發(fā)揮作用,該技術(shù)通過(guò)優(yōu)化運(yùn)行處理流程或優(yōu)化系統(tǒng)配置等檢測(cè)防止出現(xiàn)SQL注入攻擊的情況[6]。目前平臺(tái)層防御可采取的措施如下。
3.2.1 維護(hù)數(shù)據(jù)和數(shù)據(jù)庫(kù)
安全地提高數(shù)據(jù)庫(kù)的安全性是防止SQL注入攻擊的有效措施。為盡可能提高數(shù)據(jù)庫(kù)的安全性,需要對(duì)未授權(quán)用戶的訪問進(jìn)行限制,對(duì)已授權(quán)用戶的操作權(quán)限進(jìn)行設(shè)定,同時(shí)在數(shù)據(jù)庫(kù)服務(wù)器上采取有效的安全加固措施,將用戶的操作限定在其權(quán)限內(nèi),不允許其訪問超出權(quán)限的數(shù)據(jù)資源,具體的措施例如隔離數(shù)據(jù)庫(kù)登錄、額外系統(tǒng)對(duì)象鎖定等。
3.2.2 服務(wù)器和網(wǎng)絡(luò)的安全配置
根據(jù)Apache、IIS等不同的服務(wù)器類型,有針對(duì)性地進(jìn)行Web服務(wù)器安全配置??梢詫?duì)網(wǎng)絡(luò)訪問控制進(jìn)行安全配置,例如利用防火墻和路由器ACL網(wǎng)絡(luò)層等限制與其他系統(tǒng)的連接。此外,還可將數(shù)據(jù)庫(kù)服務(wù)器與Web服務(wù)器部署在不同的主機(jī)上,降低來(lái)自Web應(yīng)用攻擊的概率,同時(shí)也不會(huì)將數(shù)據(jù)庫(kù)服務(wù)器暴露給攻擊者。平臺(tái)層防御在Web應(yīng)用程序?qū)訉?duì)SQL注入攻擊進(jìn)行抵御,但是如果注入漏洞較為復(fù)雜,防御的效率可能較低。
當(dāng)前,開展針對(duì)SQL注入攻擊與檢測(cè)技術(shù)的研究具有重要的現(xiàn)實(shí)意義。該文詳細(xì)分析了SQL注入攻擊檢測(cè)和防御基本技術(shù)和方法,在SQL注入攻擊檢測(cè)與防御研究中,盡管研究者們?nèi)〉昧艘幌盗醒芯砍晒岢龅姆椒ㄔ谝欢ǔ潭壬辖档土税l(fā)生SQL注入攻擊的可能性,但是該方法的檢測(cè)性能還有較大的提升空間。同時(shí),隨著攻擊方式的多樣化,還需要投入更多的人力物力開展針對(duì)SQL注入攻擊檢測(cè)與防御的相關(guān)研究。