• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于ECA規(guī)則和動(dòng)態(tài)污點(diǎn)分析的SQL注入攻擊在線檢測(cè)

      2023-05-24 03:18:58劉吉會(huì)何成萬(wàn)
      計(jì)算機(jī)應(yīng)用 2023年5期
      關(guān)鍵詞:污點(diǎn)字符串語(yǔ)句

      劉吉會(huì),何成萬(wàn)

      (武漢工程大學(xué) 計(jì)算機(jī)科學(xué)與工程學(xué)院,武漢 430205)

      0 引言

      互聯(lián)網(wǎng)服務(wù)的廣泛使用使Web 應(yīng)用日漸復(fù)雜,Web 應(yīng)用的安全問(wèn)題也因其易用性和開(kāi)放性而日益顯著,造成的漏洞越來(lái)越多[1-3]。在開(kāi)放式Web 應(yīng)用程序安全項(xiàng)目(Open Web Application Security Project,OWASP)發(fā)布的2013 年和2017年的Web 安全漏洞Top10[4]中,注入漏洞穩(wěn)居第一,其中以SQL 注入為主體。SQL 注入攻擊是一種代碼注入攻擊[5-6]。Web 應(yīng)用程序中的SQL 語(yǔ)句通常由程序中受信任的常量字符串和用戶輸入等不受信任的外部數(shù)據(jù)動(dòng)態(tài)拼接在一起,這會(huì)導(dǎo)致不受信任的數(shù)據(jù)(例如用戶輸入)被數(shù)據(jù)庫(kù)引擎作為SQL 代碼片段執(zhí)行[7]。攻擊者通過(guò)精心構(gòu)造各種未經(jīng)驗(yàn)證的畸形外部輸入數(shù)據(jù),欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行惡意構(gòu)造的SQL 語(yǔ)句以達(dá)到攻擊的目的,對(duì)Web 應(yīng)用潛在的數(shù)據(jù)庫(kù)安全構(gòu)成嚴(yán)重的威脅。因此,對(duì)SQL 注入攻擊的檢測(cè)研究具有非常重要的意義。

      現(xiàn)有的SQL 注入攻擊檢測(cè)主要采用基于SQL 語(yǔ)句合法性進(jìn)行判別的方法來(lái)檢測(cè)攻擊[8]。根據(jù)檢測(cè)原理的不同,大致分為基于污點(diǎn)分析的方法、基于規(guī)則匹配的方法、基于文本向量化和機(jī)器學(xué)習(xí)的方法?;谖谋鞠蛄炕蜋C(jī)器學(xué)習(xí)的方法屬于新興的方法,由于數(shù)據(jù)集不夠、分類模型不完善、SQL 語(yǔ)句特征提取困難等問(wèn)題,存在著諸多挑戰(zhàn);而且在實(shí)際應(yīng)用部署中,實(shí)現(xiàn)實(shí)時(shí)在線檢測(cè)比較困難?;谝?guī)則匹配的方法是傳統(tǒng)的SQL 注入攻擊檢測(cè)方法,又分為靜態(tài)檢測(cè)、動(dòng)態(tài)檢測(cè)、動(dòng)靜結(jié)合檢測(cè)。靜態(tài)檢測(cè)如JDBCChecker(Java DataBase Connectivity Checker)[9]就是在不運(yùn)行程序的情況下通過(guò)源碼分析是否存在SQL 注入的可能。由于需要分析源代碼,無(wú)法發(fā)現(xiàn)運(yùn)行時(shí)發(fā)生的部分攻擊,漏報(bào)率高且浪費(fèi)人力物力,檢測(cè)效率低下。動(dòng)態(tài)檢測(cè)如CANDID(dynamic CANDIDate evaluations)[10]在程序 運(yùn)行時(shí) 動(dòng)態(tài)挖 掘預(yù)期 的SQL 查詢結(jié)構(gòu)與構(gòu)造的SQL 語(yǔ)句結(jié)構(gòu)比對(duì),在無(wú)法獲得源代碼情況下通過(guò)程序運(yùn)行時(shí)動(dòng)態(tài)生成的模型來(lái)判斷是否存在SQL 注入攻擊。動(dòng)靜結(jié)合檢測(cè)如AMNESIA(Analysis and Monitoring for NEutralizing SQL-Injection Attacks)[11]靜態(tài)分析應(yīng)用程序生成正常SQL 語(yǔ)句查詢模型,然后在程序運(yùn)行時(shí)進(jìn)行動(dòng)態(tài)監(jiān)控,比較構(gòu)造的SQL 語(yǔ)句是否符合靜態(tài)分析生成的SQL 語(yǔ)句模型,從而判斷是否存在SQL 注入攻擊并防御。基于規(guī)則匹配的方法在應(yīng)用部署中要么需要源代碼,要么需要在程序運(yùn)行前進(jìn)行程序插樁修改原始程序行為,這類方法的可重用性不足,且不能在Web 應(yīng)用開(kāi)啟后加載檢測(cè)組件以達(dá)到在線檢測(cè)的目的?;谖埸c(diǎn)分析的方法大多需要修改應(yīng)用程序的執(zhí)行引擎,或需要修改應(yīng)用的源代碼,或通過(guò)代碼重寫技術(shù)對(duì)Web 應(yīng)用進(jìn)行預(yù)編譯才能加載檢測(cè)組件。這些技術(shù)無(wú)法在應(yīng)用運(yùn)行時(shí)在線加載檢測(cè)組件,且與原始應(yīng)用耦合性較高,容易干擾原始應(yīng)用的業(yè)務(wù)邏輯,無(wú)法做到檢測(cè)組件的可重用性和在線檢測(cè)。

      ECA(Event Condition Action)規(guī)則語(yǔ)言在Java 語(yǔ)義級(jí)別可以精確指定將要轉(zhuǎn)換的類及其中的方法以修改原始應(yīng)用程序的行為或增加額外的功能。Byteman[12]是一個(gè)字節(jié)碼修改工具,采用這種清晰、簡(jiǎn)單且易于使用的基于Java 的ECA規(guī)則語(yǔ)言,使得它在應(yīng)用程序加載時(shí)或運(yùn)行時(shí)更改應(yīng)用程序的行為變得簡(jiǎn)單。它工作時(shí)原始應(yīng)用程序無(wú)須重寫和編譯。

      本文提出一種基于ECA 規(guī)則和動(dòng)態(tài)污點(diǎn)分析的在線檢測(cè)SQL 注入攻擊的模型。借助ECA 規(guī)則語(yǔ)言封裝動(dòng)態(tài)污點(diǎn)分析的整個(gè)過(guò)程,在Web 應(yīng)用運(yùn)行時(shí)通過(guò)安裝ECA 規(guī)則腳本重新轉(zhuǎn)換構(gòu)成應(yīng)用程序和虛擬機(jī)程序的原始字節(jié)碼,從而在用戶提交請(qǐng)求時(shí)觸發(fā)相關(guān)檢測(cè)組件的執(zhí)行,在線檢測(cè)是否存在SQL 注入攻擊。ECA 規(guī)則語(yǔ)言構(gòu)成的檢測(cè)腳本完全獨(dú)立于Web 應(yīng)用的業(yè)務(wù)邏輯,在Web 應(yīng)用啟動(dòng)后,整個(gè)檢測(cè)腳本將被轉(zhuǎn)化為內(nèi)聯(lián)Java 代碼注入到Web 應(yīng)用及其所屬的虛擬機(jī)中。實(shí)驗(yàn)使用Byteman 實(shí)現(xiàn)了本文所提模型,并利用該模型在文獻(xiàn)[11]使用的Web 應(yīng)用bookstore 和WebGoat[13]上做實(shí)驗(yàn),由ECA 規(guī)則語(yǔ)言封裝的檢測(cè)腳本經(jīng)過(guò)安裝進(jìn)這些應(yīng)用的Byteman 代理讀取并自動(dòng)轉(zhuǎn)換構(gòu)成Web 應(yīng)用和虛擬機(jī)的字節(jié)碼,從而將檢測(cè)代碼無(wú)縫插入到正在運(yùn)行的應(yīng)用基層子程序中。經(jīng)過(guò)實(shí)驗(yàn)驗(yàn)證,這是一種低侵入性、輕量級(jí)的SQL 注入攻擊檢測(cè)方法,能夠在不修改應(yīng)用程序執(zhí)行引擎和源碼的前提下,實(shí)現(xiàn)Web 應(yīng)用的在線檢測(cè),且可以檢測(cè)出6種常見(jiàn)的SQL 注入攻擊類型。

      1 相關(guān)工作

      Ray 等[5-6]定義了代碼注入攻擊。Halfond 等[14]對(duì)迄今為止已知的不同類型的SQL 注入攻擊進(jìn)行了廣泛的回顧。SQL 注入攻擊檢測(cè)主要采用基于SQL 語(yǔ)句合法性判別的方法來(lái)檢測(cè)攻擊。依據(jù)檢測(cè)原理的不同,分為基于規(guī)則匹配的方法、基于污點(diǎn)的分析方法、基于文本向量化和機(jī)器學(xué)習(xí)的方法。

      基于規(guī)則匹配的檢測(cè)方法通過(guò)創(chuàng)建特定的規(guī)則并對(duì)違反規(guī)則的行為進(jìn)行識(shí)別來(lái)檢測(cè)攻擊。其中:正則表達(dá)式匹配的方法通過(guò)構(gòu)建正則表達(dá)式對(duì)與所構(gòu)建的正則表達(dá)式相違背的用戶輸入進(jìn)行檢測(cè)過(guò)濾[15]。語(yǔ)法樹(shù)特征匹配的方法,如Bandhakavi 等[10]提出的方法,通過(guò)動(dòng)態(tài)挖掘針對(duì)用戶任何輸入的、體現(xiàn)程序開(kāi)發(fā)人員意圖的查詢結(jié)構(gòu),并將此結(jié)構(gòu)與實(shí)際動(dòng)態(tài)生成的SQL 查詢語(yǔ)句結(jié)構(gòu)相比較以檢測(cè)是否發(fā)生SQL 注入攻 擊。與之類 似的是Halfond 等[11]提出的AMNESIA,在靜態(tài)分析階段,通過(guò)獲取正常查詢語(yǔ)句結(jié)構(gòu)構(gòu)建合法查詢的模型;在動(dòng)態(tài)階段,監(jiān)視SQL 語(yǔ)句的構(gòu)建,并將構(gòu)建的SQL 語(yǔ)句與靜態(tài)階段建立的合法查詢模型進(jìn)行比較以檢測(cè)攻擊。文獻(xiàn)[16]的研究繼承了AMNESIA 的思想,借助靜態(tài)代碼工具獲取SQL 語(yǔ)句模型,利用面向方面編程(Aspect-Oriented Programming,AOP)技術(shù)捕獲程序執(zhí)行中產(chǎn)生的SQL 語(yǔ)句,將靜態(tài)SQL 語(yǔ)句模型與產(chǎn)生的SQL 語(yǔ)句進(jìn)行比較,判斷是否存在SQL 注入攻擊。文獻(xiàn)[17]中提出一種基于XML(eXtensible Markup Language)且只檢測(cè)重言式SQL 注入攻擊的方法。該方法包含一個(gè)XML 文件生成器,攔截用戶輸入并轉(zhuǎn)換成XML 格式;然后XML 文件將用戶憑據(jù)傳遞給Xschema 驗(yàn)證器,將生成的用戶查詢與Xschema 文件中預(yù)定義的合法查詢進(jìn)行比較,兩個(gè)查詢匹配時(shí)才允許其訪問(wèn),否則阻止訪問(wèn)。該方法執(zhí)行時(shí)間尚可,但檢測(cè)攻擊的類型單一。

      基于污點(diǎn)分析的方案通過(guò)污點(diǎn)的標(biāo)記和傳播,可以準(zhǔn)確區(qū)分SQL 語(yǔ)句的可信部分和不可信部分。污點(diǎn)檢查比較可靠,主要分為靜態(tài)污點(diǎn)分析和動(dòng)態(tài)污點(diǎn)分析。在靜態(tài)污點(diǎn)分析中:Jovanovic 等[18]提出的Pixy 使用流敏感、進(jìn)程間和上下文敏感的靜態(tài)數(shù)據(jù)流分析方法來(lái)挖掘Web 應(yīng)用程序漏洞;Livshits 等[19]使用靜態(tài)數(shù)據(jù)流分析技術(shù)檢測(cè)標(biāo)記的用戶輸入是否到達(dá)SQL 語(yǔ)句執(zhí)行點(diǎn)以挖掘SQL 注入漏洞;Wassermann等[20]將SQL 語(yǔ)句構(gòu)造過(guò)程抽象為上下文無(wú)關(guān)文法,并使用靜態(tài)污點(diǎn)分析方法來(lái)判斷文法中的非終結(jié)符是否與用戶輸入有關(guān)。由于靜態(tài)污點(diǎn)分析不能很好地處理Web 應(yīng)用語(yǔ)言的動(dòng)態(tài)性,會(huì)引入較高的誤報(bào)率,再加上保守的程序分析,使誤報(bào)率會(huì)更高。

      動(dòng)態(tài)污點(diǎn)分析方法可以更好地處理程序的動(dòng)態(tài)特性。Haldar 等[21]提出了一種動(dòng)態(tài)解決方案,在運(yùn)行時(shí)標(biāo)記和跟蹤用戶輸入,并防止用戶不正當(dāng)使用以惡意影響程序的執(zhí)行;Perl 的污點(diǎn)模式[22]明確地將來(lái)自程序外部的數(shù)據(jù)標(biāo)記為受污染,防止受污染的數(shù)據(jù)被用作某些敏感函數(shù)的參數(shù);Nguyen-Tuong 等[23]修改PHP 執(zhí)行引擎中String 類的數(shù)據(jù)結(jié)構(gòu)和內(nèi)置函數(shù),在字符級(jí)對(duì)不可信數(shù)據(jù)進(jìn)行污點(diǎn)標(biāo)記與傳播,并在匯聚點(diǎn)處分析SQL 語(yǔ)句語(yǔ)法結(jié)構(gòu);Rafailidis 等[24]設(shè)計(jì)了污點(diǎn)傳播算法來(lái)實(shí)現(xiàn)實(shí)施安全策略的內(nèi)聯(lián)監(jiān)視器;Chin等[25]針對(duì)Java 實(shí)現(xiàn)了高效率的字符級(jí)別的污點(diǎn)傳播算法;董敏[26]基于C++語(yǔ)言的特性以影子內(nèi)存原理封裝基本數(shù)據(jù)類型,擴(kuò)展污點(diǎn)標(biāo)記位,重載運(yùn)算符以實(shí)現(xiàn)數(shù)據(jù)在程序運(yùn)行時(shí)的實(shí)時(shí)傳播過(guò)程,并在污點(diǎn)匯聚點(diǎn)處解析SQL 語(yǔ)句的污點(diǎn)狀態(tài)以觸發(fā)報(bào)警裝置;Halfond 等[27]則提出了積極污點(diǎn)標(biāo)記方法的新概念,污點(diǎn)標(biāo)記可信數(shù)據(jù),如程序中的硬編碼字符串,并動(dòng)態(tài)跟蹤污點(diǎn)傳播軌跡,可有效解決不可信輸入來(lái)源廣泛、難以完整標(biāo)記的問(wèn)題。

      從以上工作可以看出,對(duì)于SQL 注入攻擊檢測(cè),動(dòng)態(tài)污點(diǎn)追蹤機(jī)制提供額外的污點(diǎn)信息來(lái)判斷SQL 注入攻擊行為,提高了檢測(cè)準(zhǔn)確性,且沒(méi)有復(fù)雜的靜態(tài)分析開(kāi)銷。文獻(xiàn)[28-29]將此機(jī)制與AOP 的思想結(jié)合,使SQL 注入攻擊的安全關(guān)注點(diǎn)從應(yīng)用邏輯中分離出來(lái)由方面封裝,賦予檢測(cè)模型更高的可重用性。從代碼級(jí)別捕獲Web 應(yīng)用基礎(chǔ)設(shè)施的污點(diǎn)數(shù)據(jù)的流動(dòng),通過(guò)方面編織器將污點(diǎn)檢測(cè)代碼織入原始Web 應(yīng)用相關(guān)的安全關(guān)注點(diǎn)中,在關(guān)注點(diǎn)中模擬動(dòng)態(tài)污點(diǎn)分析的各個(gè)流程,避免了對(duì)Web 應(yīng)用源碼及執(zhí)行引擎的直接修改。他們的方法既實(shí)現(xiàn)了對(duì)多數(shù)SQL 注入攻擊類型的檢測(cè),又對(duì)攻擊檢測(cè)代碼的可重用實(shí)現(xiàn)作出努力;但他們的方法部署需要預(yù)編譯加載檢測(cè)組件,在線加載檢測(cè)組件難以實(shí)現(xiàn)。

      基于文本向量和機(jī)器學(xué)習(xí)的方法針對(duì)SQL 語(yǔ)句的合法性進(jìn)行判斷。它們針對(duì)正常和惡意SQL 語(yǔ)句進(jìn)行特征向量的提取和向量化,選取合適的分類模型進(jìn)行數(shù)據(jù)集的訓(xùn)練。由此研究人員提出了許多方法和改進(jìn)的措施。如李紅靈等[30]提出的基于支持向量機(jī)(Support Vector Machine,SVM)和文本特征向量提取的SQL 注入攻擊檢測(cè)技術(shù)、蘇林萍等[31]提出的基于N-gram 和詞頻逆向文件頻率(Term Frequency Inverse Document Frequency,TF-IDF)的SQL 注入攻擊檢測(cè)方法等。相關(guān)數(shù)據(jù)集的數(shù)據(jù)量不夠、分類模型的不完善以及SQL 語(yǔ)句特征提取困難等問(wèn)題,使這個(gè)方面的研究存在諸多困難;而模型檢測(cè)的準(zhǔn)確度和效率完全取決于數(shù)據(jù)集的質(zhì)量。

      2 本文模型

      ECA 規(guī)則精確指定在運(yùn)行時(shí)應(yīng)如何改變應(yīng)用程序行為。規(guī)則的三個(gè)組成部分事件(Event)、條件(Condition)、動(dòng)作(Action)分別定義如下:1)在應(yīng)用程序執(zhí)行期間應(yīng)該發(fā)生副作用的地方;2)副作用是否應(yīng)該發(fā)生;3)副作用應(yīng)該是什么。因此,ECA 規(guī)則可以識(shí)別應(yīng)用程序中外部數(shù)據(jù)流動(dòng)經(jīng)過(guò)的函數(shù),并在該函數(shù)執(zhí)行過(guò)程中在規(guī)則指定的位置插入相應(yīng)的副作用。如果條件判斷為真,副作用就會(huì)發(fā)生,就會(huì)改變?cè)紤?yīng)用的行為;反之,副作用不會(huì)發(fā)生。

      污點(diǎn)分析技術(shù)[32]包括污點(diǎn)源、污點(diǎn)匯聚點(diǎn)和無(wú)害化處理等部分。其中,污點(diǎn)源表示將污點(diǎn)數(shù)據(jù)引入系統(tǒng)中;污點(diǎn)匯聚點(diǎn)表示系統(tǒng)將污點(diǎn)數(shù)據(jù)輸出到敏感數(shù)據(jù)區(qū)或外界,造成敏感數(shù)據(jù)區(qū)被改寫或機(jī)密數(shù)據(jù)被泄漏;無(wú)害化處理表示通過(guò)數(shù)據(jù)加密或重新賦值等操作使數(shù)據(jù)傳播不再對(duì)系統(tǒng)的完整性和機(jī)密性產(chǎn)生危害。污點(diǎn)分析就是分析程序中由污點(diǎn)源引入的數(shù)據(jù)能否不經(jīng)無(wú)害化處理而直接傳播到污點(diǎn)匯聚點(diǎn)[33]。由于ECA 規(guī)則的特性,它可以精確識(shí)別污點(diǎn)源函數(shù)、污點(diǎn)傳播經(jīng)過(guò)的函數(shù)和污點(diǎn)匯聚點(diǎn)函數(shù),在這些函數(shù)對(duì)應(yīng)位置中插入的副作用就是污點(diǎn)標(biāo)記、污點(diǎn)傳播、污點(diǎn)檢查動(dòng)作,而副作用發(fā)生的條件就是判斷函數(shù)參數(shù)及函數(shù)調(diào)用者對(duì)象是否攜帶污點(diǎn),若攜帶污點(diǎn),則執(zhí)行相應(yīng)的污點(diǎn)分析動(dòng)作。

      本文提出的基于ECA 規(guī)則和動(dòng)態(tài)污點(diǎn)分析的SQL 注入攻擊檢測(cè)模型如圖1 所示。

      圖1 基于ECA規(guī)則和動(dòng)態(tài)污點(diǎn)分析的SQL注入攻擊檢測(cè)模型Fig.1 SQL injection attack detection model based on ECA rules and dynamic taint analysis

      它的處理流程主要分為三個(gè)步驟:第一,針對(duì)污點(diǎn)源的ECA 規(guī)則自動(dòng)識(shí)別污點(diǎn)源,在污點(diǎn)源處對(duì)被引入系統(tǒng)的外部數(shù)據(jù)進(jìn)行污點(diǎn)標(biāo)記;第二,針對(duì)污點(diǎn)傳播的ECA 規(guī)則自動(dòng)識(shí)別污點(diǎn)傳播經(jīng)過(guò)的函數(shù),判斷函數(shù)參數(shù)以及函數(shù)調(diào)用者對(duì)象的污點(diǎn)狀態(tài),以此決定是否標(biāo)記函數(shù)返回值,從而在程序運(yùn)行時(shí)實(shí)時(shí)跟蹤污點(diǎn)數(shù)據(jù)的流向;第三,針對(duì)污點(diǎn)匯聚點(diǎn)的ECA 規(guī)則自動(dòng)識(shí)別污點(diǎn)匯聚點(diǎn),在污點(diǎn)匯聚點(diǎn)處對(duì)將要執(zhí)行的SQL 語(yǔ)句進(jìn)行詞法語(yǔ)法分析評(píng)估其污點(diǎn)狀態(tài),從而判斷是否存在SQL 注入攻擊。在Web 應(yīng)用運(yùn)行時(shí),安裝ECA 規(guī)則,實(shí)現(xiàn)檢測(cè)模塊的自動(dòng)在線加載。此時(shí),檢測(cè)模塊就會(huì)在用戶提交請(qǐng)求后發(fā)揮作用。ECA 規(guī)則比較系統(tǒng)完整地模擬了動(dòng)態(tài)污點(diǎn)分析過(guò)程,實(shí)現(xiàn)了針對(duì)待測(cè)Web 應(yīng)用中外部數(shù)據(jù)進(jìn)入系統(tǒng)后從污點(diǎn)源到污點(diǎn)匯聚點(diǎn)經(jīng)過(guò)的所有可能的基本函數(shù)的自動(dòng)識(shí)別以及在相應(yīng)函數(shù)中插入相應(yīng)的污點(diǎn)分析邏輯。這些基本函數(shù)包括服務(wù)器請(qǐng)求接口的方法(污點(diǎn)源,如ServeltRequest.getParameter())、字符串類中具有污點(diǎn)傳播能力的字符串操作方法(污點(diǎn)傳播經(jīng)過(guò)的函數(shù),如String.append())、Java 數(shù)據(jù)庫(kù)連接(Java Database Connectivity,JDBC)接口中的方法(污點(diǎn)匯聚點(diǎn),如Statement.executeQuery())。在用戶發(fā)起請(qǐng)求后,Web 應(yīng)用中與該請(qǐng)求相關(guān)的基本函數(shù)的執(zhí)行就會(huì)觸發(fā)與之相關(guān)的ECA 規(guī)則的執(zhí)行,相關(guān)規(guī)則就會(huì)隨著污點(diǎn)數(shù)據(jù)在系統(tǒng)中的流動(dòng)而自動(dòng)觸發(fā)執(zhí)行污點(diǎn)標(biāo)記、污點(diǎn)傳播、污點(diǎn)檢查動(dòng)作,從而判斷當(dāng)前用戶的請(qǐng)求是否存在SQL注入攻擊。當(dāng)Web 應(yīng)用處理用戶請(qǐng)求時(shí),外部數(shù)據(jù)實(shí)際會(huì)經(jīng)過(guò)哪些基本函數(shù)的處理對(duì)用戶而言是模糊的,對(duì)ECA 規(guī)則而言是透明的。檢測(cè)模塊獨(dú)立于原始Web 應(yīng)用的業(yè)務(wù)邏輯,作為一個(gè)整體被ECA 規(guī)則定義,在線安裝ECA 規(guī)則可以將檢測(cè)模塊動(dòng)態(tài)插入到正在運(yùn)行的Web 應(yīng)用中;同時(shí),也可以在線卸載ECA 規(guī)則,被規(guī)則影響的基本函數(shù)就會(huì)恢復(fù)原狀。安裝卸載規(guī)則的過(guò)程中,無(wú)須重新編譯、打包、部署Web應(yīng)用。

      2.1 污點(diǎn)標(biāo)記算法

      本文基于Java EE(Java platform,Enterprise Edition)框架作具體論述。不可信數(shù)據(jù)進(jìn)入程序中,參與SQL 語(yǔ)句的動(dòng)態(tài)構(gòu)建,并最終被數(shù)據(jù)庫(kù)服務(wù)器當(dāng)作SQL 代碼執(zhí)行。由于SQL注入攻擊涉及的都是字符串的構(gòu)建,因此本文為JDK(Java Development Kit)中的String、StringBuffer、StringBuilder 三個(gè)字符串類的實(shí)例建立一個(gè)映射。每一個(gè)字符串實(shí)例與一個(gè)StringData 類實(shí)例相對(duì)應(yīng),相對(duì)應(yīng)的StringData 類實(shí)例存儲(chǔ)了該字符串實(shí)例的污點(diǎn)狀態(tài)信息。StringData 類包含一個(gè)布爾變量字段和一個(gè)布爾數(shù)組字段:布爾變量表征該實(shí)例是否被污染,布爾數(shù)組則表征該字符串實(shí)例的每個(gè)字符的污染狀況。若布爾變量為false,則相應(yīng)的布爾數(shù)組為空,這樣可以節(jié)省內(nèi)存。

      動(dòng)態(tài)污點(diǎn)標(biāo)記如圖2 所示,在Web 應(yīng)用運(yùn)行時(shí),污點(diǎn)源ECA 規(guī)則一經(jīng)安裝,就會(huì)自動(dòng)識(shí)別污點(diǎn)引入函數(shù),在該函數(shù)業(yè)務(wù)邏輯中增加對(duì)規(guī)則的觸發(fā)調(diào)用。當(dāng)用戶提交的數(shù)據(jù)經(jīng)過(guò)污點(diǎn)引入函數(shù)時(shí),污點(diǎn)標(biāo)記規(guī)則自動(dòng)觸發(fā),評(píng)估條件為真執(zhí)行污點(diǎn)標(biāo)記動(dòng)作,標(biāo)記用戶提交的數(shù)據(jù)。

      圖2 污點(diǎn)標(biāo)記示意圖Fig.2 Schematic diagram of taint marking

      污點(diǎn)標(biāo)記的算法如算法1 所示,創(chuàng)建一個(gè)StringData 類,初始化該類字段,布爾變量字段賦為true,布爾數(shù)組字段的每一個(gè)數(shù)組元素賦值為true,然后以方法參數(shù)param為鍵將新創(chuàng)建的StringData 實(shí)例存儲(chǔ)到taintMaps 映射表中。這種標(biāo)記的好處在于既不用擴(kuò)展字符串類String 等的污點(diǎn)屬性,使污點(diǎn)標(biāo)記的邏輯與原來(lái)字符串處理邏輯弱耦合,也不用在某些字符串處理函數(shù)再進(jìn)行額外的污點(diǎn)標(biāo)記和污點(diǎn)去除的操作,還可以保證污點(diǎn)標(biāo)記的精度。

      算法1 污點(diǎn)標(biāo)記算法。

      2.2 污點(diǎn)傳播算法

      污點(diǎn)傳播算法的設(shè)計(jì)參考文獻(xiàn)[21,27-28]的思想。污點(diǎn)傳播分析要解決的就是外來(lái)數(shù)據(jù)在程序內(nèi)部的實(shí)時(shí)傳播跟蹤與存儲(chǔ)的問(wèn)題。ECA 規(guī)則負(fù)責(zé)識(shí)別污點(diǎn)傳播經(jīng)過(guò)的函數(shù),然后在規(guī)則動(dòng)作執(zhí)行條件中判斷經(jīng)過(guò)函數(shù)的調(diào)用者和參數(shù)是否被污染:若被污染,在該字符串函數(shù)返回之前,規(guī)則將根據(jù)函數(shù)的調(diào)用者和參數(shù)的污點(diǎn)狀態(tài)將它們的污點(diǎn)狀態(tài)合并組合傳播給函數(shù)返回值;反之不執(zhí)行相關(guān)的污點(diǎn)傳播動(dòng)作。污點(diǎn)傳播邏輯由ECA 規(guī)則定義,而字符串處理函數(shù)的邏輯則在字符串操作類中,從而設(shè)計(jì)出既不會(huì)破壞程序執(zhí)行邏輯,又能保持污點(diǎn)方法跟蹤污點(diǎn)數(shù)據(jù)的傳播軌跡的方法。

      針對(duì)JDK 字符串類中的基礎(chǔ)字符串函數(shù),本文逐一實(shí)現(xiàn)污點(diǎn)傳播邏輯。污點(diǎn)傳播算法如算法2所示,分三種情況進(jìn)行討論:1)如果JDK 字符串類中函數(shù)(如toString()、subString()等)只有攜帶污點(diǎn)的字符串調(diào)用者對(duì)象,則將字符串調(diào)用者對(duì)象的污點(diǎn)狀態(tài)傳播給函數(shù)返回值;2)如果JDK 字符串類中函數(shù)(如構(gòu)造函數(shù))參數(shù)為攜帶污點(diǎn)的字符串對(duì)象,則將該字符串對(duì)象的污點(diǎn)狀態(tài)傳播給函數(shù)返回值;3)如果JDK 字符串類中函數(shù)是這一類函數(shù)(如append()、replace()等),則函數(shù)調(diào)用者對(duì)象和參數(shù)對(duì)象均可能攜帶污點(diǎn),將這二者可能攜帶的污點(diǎn)狀態(tài)合并傳播給函數(shù)返回值。通過(guò)該算法實(shí)現(xiàn)JDK字符串類中基礎(chǔ)字符串函數(shù)級(jí)別的污點(diǎn)傳播分析,避免了傳統(tǒng)的基于指令級(jí)別的污點(diǎn)傳播分析。

      算法2 污點(diǎn)傳播算法

      由于字符串類為引用對(duì)象類型,字符串類之間賦值的本質(zhì)是向某個(gè)內(nèi)存的指針賦值。本文污點(diǎn)的存儲(chǔ)方式是基于映射的方式,即一個(gè)字符串對(duì)象對(duì)應(yīng)一個(gè)污點(diǎn)存儲(chǔ)的位置,當(dāng)帶污點(diǎn)的字符串對(duì)象賦值給另一個(gè)變量,則另一個(gè)變量與被賦值的變量指向同一個(gè)存儲(chǔ)污點(diǎn)的內(nèi)存,賦值操作不用更新taintMaps 映射,即自動(dòng)將污點(diǎn)從等號(hào)右邊傳向左邊。

      2.3 污點(diǎn)檢查算法

      標(biāo)準(zhǔn)Servlet 程序中所有和數(shù)據(jù)庫(kù)交互的相關(guān)操作都封裝在JDBC 庫(kù)中。SQL 注入污點(diǎn)匯聚點(diǎn)是消耗用戶輸入的敏感函數(shù),如executeQuery()、executeUpdate()等。使用污點(diǎn)檢查規(guī)則就可以在函數(shù)開(kāi)始執(zhí)行前捕獲這些敏感函數(shù)的參數(shù)并對(duì)它們進(jìn)行語(yǔ)法解析,從而判斷是否發(fā)生SQL 注入攻擊。若判斷發(fā)生SQL 注入攻擊,則污點(diǎn)檢查規(guī)則執(zhí)行通知開(kāi)發(fā)人員的動(dòng)作。

      對(duì)程序中動(dòng)態(tài)構(gòu)建的SQL 語(yǔ)句進(jìn)行詞法語(yǔ)法分析以構(gòu)建語(yǔ)法分析樹(shù),遍歷語(yǔ)法分析樹(shù)的所有終端結(jié)點(diǎn),檢查它們的污點(diǎn)狀態(tài)。若污點(diǎn)僅僅分布在字符串文本和數(shù)字文本中,則沒(méi)有發(fā)生SQL 注入攻擊;若污點(diǎn)部分或全部分布在SQL 關(guān)鍵字、操作符、特殊字符等,則可以認(rèn)為發(fā)生SQL 注入攻擊[27]。為了降低污點(diǎn)傳播性能的損失,每次執(zhí)行語(yǔ)法解析之前都會(huì)清空taintMaps 中存儲(chǔ)的鍵值對(duì)。污點(diǎn)檢查算法如算法3 所示。

      算法3 污點(diǎn)檢查算法

      3 模型實(shí)現(xiàn)

      本文基于Byteman 工具實(shí)現(xiàn)了所提出的模型。Byteman規(guī)則引擎負(fù)責(zé)解析ECA 規(guī)則,將它表示的內(nèi)聯(lián)Java 代碼轉(zhuǎn)化為字節(jié)碼,由Byteman 代理插入到Web 應(yīng)用的字節(jié)碼中。由此,在Web 應(yīng)用請(qǐng)求數(shù)據(jù)流動(dòng)的過(guò)程中,就會(huì)執(zhí)行ECA 規(guī)則集指定的污點(diǎn)分析動(dòng)作。ECA 規(guī)則語(yǔ)言涉及到的內(nèi)置操作集由Byteman 的幫助類加以擴(kuò)展或替換。由Byteman 幫助類實(shí)現(xiàn)有關(guān)動(dòng)態(tài)污點(diǎn)分析動(dòng)作的內(nèi)置操作集,就可以使ECA規(guī)則語(yǔ)言具有污點(diǎn)分析的功能。基于Byteman 工具實(shí)現(xiàn)模型共分為四個(gè)部分:Byteman 幫助類的定義、污點(diǎn)標(biāo)記實(shí)現(xiàn)、污點(diǎn)傳播實(shí)現(xiàn)以及污點(diǎn)檢查實(shí)現(xiàn)。

      3.1 Byteman幫助類的定義

      Byteman 單個(gè)ECA 規(guī)則的基本架構(gòu)如圖3 所示。ECA 規(guī)則語(yǔ)言中,E(event)為規(guī)則事件,用來(lái)規(guī)范標(biāo)識(shí)與目標(biāo)類關(guān)聯(lián)的目標(biāo)方法中的特定位置。目標(biāo)方法可以是靜態(tài)或?qū)嵗椒ɑ驑?gòu)造函數(shù)。RULE、CLASS、METHOD、AT 子句定義規(guī)則事件。C為condition,由IF子句定義。A為actions,由DO 子句定義,當(dāng)與規(guī)則匹配的類及方法執(zhí)行時(shí),就會(huì)觸發(fā)該規(guī)則的執(zhí)行。由該規(guī)則轉(zhuǎn)化地注入應(yīng)用程序中的字節(jié)碼執(zhí)行過(guò)程是:首先判斷IF子句的condition表示的條件是否為真,若為真,則執(zhí)行DO 子句后面的actions 表示的單個(gè)或多個(gè)動(dòng)作;否則,不執(zhí)行由DO 子句定義的動(dòng)作,即規(guī)則雖然觸發(fā)但沒(méi)有執(zhí)行實(shí)際的動(dòng)作。Byteman 工具存在的意義在于為用戶提供ECA 規(guī)則語(yǔ)言,使用戶可以在Java 語(yǔ)義級(jí)別直觀地修改運(yùn)行中的應(yīng)用程序和JVM 的字節(jié)碼。Byteman 的底層規(guī)則引擎通過(guò)Java代理機(jī)制實(shí)現(xiàn)了ECA規(guī)則到字節(jié)碼的自動(dòng)轉(zhuǎn)換。

      圖3 單個(gè)ECA規(guī)則的基本架構(gòu)Fig.3 Basic structure for single ECA rule

      在圖3 中,HELPER 子句定義的是與該規(guī)則相關(guān)聯(lián)的、由用戶自行定義的幫助類。對(duì)于ECA 規(guī)則而言,可以使用的內(nèi)置操作集并不固定。規(guī)則引擎將規(guī)則中調(diào)用的內(nèi)置操作集與該規(guī)則相關(guān)聯(lián)的幫助類的公共實(shí)例方法相對(duì)應(yīng),任何被指定為幫助類的類必須是非抽象和可繼承的,它的公共實(shí)例方法自動(dòng)變?yōu)橐?guī)則事件、條件、動(dòng)作中可調(diào)用的內(nèi)置操作集。在圖4(a)~(c)的3 個(gè)規(guī)則中,setTaintedInSource、isTainted、setTaintedByMethod、parse 等內(nèi)置操作對(duì)應(yīng)下面自定義幫助類HelperSub2 的公共成員方法。所以規(guī)則condition 或actions 子句對(duì)某些方法的調(diào)用實(shí)質(zhì)就是對(duì)該規(guī)則關(guān)聯(lián)的幫助類的公共實(shí)例方法的調(diào)用。在圖4 中,污點(diǎn)標(biāo)記、污點(diǎn)傳播、污點(diǎn)檢查規(guī)則腳本都與幫助類HelperSub2 相關(guān)聯(lián),由此有關(guān)污點(diǎn)標(biāo)記、污點(diǎn)傳播、污點(diǎn)檢查和污點(diǎn)存儲(chǔ)的具體實(shí)現(xiàn)也是在該幫助類中完成的。該類編寫完成打包為jar 包,在Web 應(yīng)用啟動(dòng)后,使用Byteman 寫好的腳本bmsubmit 命令于命令行上在線提交該jar 包到引導(dǎo)類路徑中,以擴(kuò)展在線提交規(guī)則集的內(nèi)置操作集。根據(jù)圖4 所示的內(nèi)容,下面將詳細(xì)闡述污點(diǎn)分析規(guī)則腳本的編寫以及相應(yīng)的污點(diǎn)標(biāo)記、傳播、檢查算法的實(shí)現(xiàn)。

      圖4 Byteman幫助類的定義Fig.4 Definition of Byteman Helper class

      3.2 污點(diǎn)標(biāo)記實(shí)現(xiàn)

      以圖5 所示的污點(diǎn)規(guī)則示例1 進(jìn)行描述,RULE 子句中RULE 關(guān)鍵字后面為規(guī)則名,INTERFACE、METHOD、AT 子句則表明該規(guī)則觸發(fā)執(zhí)行的位置,即在所有實(shí)現(xiàn)javax.servlet.ServletRequest 接口的實(shí)現(xiàn)類中的getParameter 方法返回之前才觸發(fā)該規(guī)則的執(zhí)行。IF 子句為規(guī)則動(dòng)作是否執(zhí)行的條件,DO 子句為該規(guī)則觸發(fā)后具體執(zhí)行的操作,setTriggering(false)方法總是返回true,對(duì)getParameter 方法返回的字符串$!執(zhí)行污點(diǎn)標(biāo)記的動(dòng)作,具體地設(shè)置污點(diǎn)標(biāo)記的實(shí)現(xiàn)在Byteman 自定義幫助類HelperSub2 中完成。在該規(guī)則中,$!為Byteman 的特殊變量,自動(dòng)與getParameter 方法的返回值綁定。

      圖5 污點(diǎn)規(guī)則示例1Fig.5 Taint rule example 1

      與圖5 類似的ECA 規(guī)則腳本共同監(jiān)視應(yīng)用可能引入外部數(shù)據(jù)的函數(shù),一旦這些函數(shù)執(zhí)行,就會(huì)執(zhí)行相應(yīng)的污點(diǎn)標(biāo)記動(dòng)作。這些腳本都與幫助類HelperSub2 相關(guān)聯(lián),腳本調(diào)用的污點(diǎn)標(biāo)記動(dòng)作之一setTaintedInSource()在該幫助類中作一個(gè)公共成員方法來(lái)實(shí)現(xiàn)。核心代碼如下:

      3.3 污點(diǎn)傳播實(shí)現(xiàn)

      監(jiān)控污點(diǎn)經(jīng)過(guò)的字符串操作函數(shù)的規(guī)則集都與HelperSub2 類相關(guān)聯(lián),從而將針對(duì)字符串操作函數(shù)的污點(diǎn)設(shè)置方法整合在一個(gè)類中。一系列監(jiān)控污點(diǎn)傳播經(jīng)過(guò)的函數(shù)的規(guī)則集和它們調(diào)用的在幫助類中實(shí)現(xiàn)的各污點(diǎn)傳播動(dòng)作構(gòu)成了本文所提模型中污點(diǎn)傳播算法的具體實(shí)現(xiàn)。

      針對(duì)JDK 字符串類中每個(gè)字符串操作函數(shù)均有相應(yīng)的規(guī)則需要編寫。以圖6 所示的規(guī)則示例2 舉例闡述,該規(guī)則匹配StringBuilder 類中的append(String)方法,判斷$!,$1的污點(diǎn)狀態(tài)以決定是否在該方法返回之前給該方法返回值設(shè)置污點(diǎn)標(biāo)記。該規(guī)則中$1 與append 方法的第一個(gè)參數(shù)自動(dòng)綁定。設(shè)置污點(diǎn)方法是setTaintedByAppend(),該方法針對(duì)append()方法進(jìn)行處理,具體污點(diǎn)處理操作在自定義幫助類HelperSub2 中實(shí)現(xiàn)。由于利用Byteman 比較完整地實(shí)現(xiàn)了針對(duì)污點(diǎn)傳播經(jīng)過(guò)的字符串函數(shù)的規(guī)則,但實(shí)際應(yīng)用到哪些字符串函數(shù)對(duì)于用戶而言是模糊的,對(duì)于規(guī)則而言卻是透明的。由此,用戶不需要知道數(shù)據(jù)流經(jīng)過(guò)哪些具體的字符串操作函數(shù),由規(guī)則自動(dòng)識(shí)別而觸發(fā)執(zhí)行污點(diǎn)傳播動(dòng)作。

      圖6 污點(diǎn)規(guī)則示例2Fig.6 Taint rule example 2

      針對(duì)圖 6 規(guī)則調(diào) 用的污 點(diǎn)傳播動(dòng)作setTaintedByAppend ($!,$1),在幫助類HelperSub2 中實(shí)現(xiàn)的核心代碼如下:

      判斷函數(shù)參數(shù)是否攜帶污點(diǎn)的內(nèi)置操作isTainted()在幫助類HelperSub2 中實(shí)現(xiàn)的核心代碼如下:

      3.4 污點(diǎn)檢查實(shí)現(xiàn)

      圖7 規(guī)則示例3 顯示的規(guī)則識(shí)別所有實(shí)現(xiàn)Statement 接口的實(shí)現(xiàn)類的executeQuery()方法的執(zhí)行,在該方法執(zhí)行第一條語(yǔ)句前判斷規(guī)則條件以執(zhí)行通知開(kāi)發(fā)人員動(dòng)作。在規(guī)則條件中,首先檢查該方法參數(shù)是否攜帶污點(diǎn),若攜帶污點(diǎn),則規(guī)則調(diào)用parse()方法對(duì)方法參數(shù)即動(dòng)態(tài)構(gòu)建的SQL 語(yǔ)句進(jìn)行詞法語(yǔ)法分析,從而判斷是否存在SQL 注入攻擊。對(duì)于所有敏感函數(shù)接口(如executeUpdate 等),均有相應(yīng)的規(guī)則與之對(duì)應(yīng),這些規(guī)則調(diào)用HelperSub2 類中的parse 方法,污點(diǎn)檢查算法在parse 方法中實(shí)現(xiàn)。

      圖7 污點(diǎn)規(guī)則示例3Fig.7 Taint rule example 3

      parse 方法實(shí)現(xiàn)的核心代碼如下:

      4 實(shí)驗(yàn)與結(jié)果分析

      為驗(yàn)證本文所提模型的有效性,在文獻(xiàn)[11]中使用的bookstore 和WebGoat[13]上進(jìn)行測(cè)試。為了在這些Web應(yīng)用上進(jìn)行測(cè)試,還需要針對(duì)每一個(gè)應(yīng)用的SQL 注入攻擊測(cè)試集(負(fù)樣本)和正常訪問(wèn)請(qǐng)求集(正樣本),負(fù)樣本中含有多種類型的SQL 注入攻擊,正樣本包含富文本字面量及無(wú)SQL 語(yǔ)義字符。在筆記本電腦上搭建實(shí)驗(yàn)環(huán)境,利用正負(fù)樣本測(cè)試集測(cè)試目標(biāo)應(yīng)用以驗(yàn)證SQL 注入攻擊在線檢測(cè)模型的有效性。

      4.1 實(shí)驗(yàn)設(shè)置與測(cè)試結(jié)果分析

      首先啟動(dòng)Web 應(yīng)用,此時(shí)在命令行輸入jps 查詢應(yīng)用執(zhí)行的進(jìn)程號(hào),并輸入Byteman 寫好的命令bminstall,將Byteman 代理安裝到對(duì)應(yīng)進(jìn)程(正在運(yùn)行的Web 應(yīng)用)的Java虛擬機(jī)中,使用bmsubmit 命令提交自定義幫助類jar 包,然后在線提交ECA 規(guī)則集。此時(shí)的Web 應(yīng)用已經(jīng)加載了在線檢測(cè)模塊,模塊隨時(shí)監(jiān)測(cè)Web 應(yīng)用接收的請(qǐng)求。在虛擬機(jī)Linux 系統(tǒng)中使用wget 命令批量提交請(qǐng)求以及手動(dòng)注入,模擬攻擊者頻繁發(fā)送包含SQL 注入行為的請(qǐng)求和正常的請(qǐng)求,檢測(cè)模型會(huì)對(duì)每一個(gè)請(qǐng)求在應(yīng)用中產(chǎn)生的SQL 語(yǔ)句進(jìn)行評(píng)估以判斷是否存在SQL 注入攻擊行為。對(duì)檢測(cè)結(jié)果進(jìn)行統(tǒng)計(jì)之后,結(jié)果如表1~3 所示。

      表1 SQL注入測(cè)試用例及檢測(cè)結(jié)果Tab.1 SQL injection test cases and detection results

      表1 列出了各種SQL 注入攻擊類型的測(cè)試用例代表的攻擊字符信息和檢測(cè)結(jié)果,所提模型能根據(jù)污染的敏感攻擊字符在SQL 語(yǔ)法分析樹(shù)中的位置判斷動(dòng)態(tài)生成的SQL 語(yǔ)句的合法性,從而判斷出表1 中的測(cè)試用例存在SQL 注入攻擊行為。

      表2 列出了針對(duì)每個(gè)Web 應(yīng)用攻擊的SQL 注入攻擊請(qǐng)求樣本數(shù)和成功檢測(cè)到攻擊的樣本數(shù)。針對(duì)兩個(gè)Web 應(yīng)用發(fā)送大約1 200 個(gè)SQL 注入攻擊請(qǐng)求樣本,發(fā)現(xiàn)本文模型可以檢測(cè)到絕大多數(shù)的攻擊樣本,說(shuō)明該模型具有一定的檢測(cè)能力。

      表2 惡意請(qǐng)求樣本檢測(cè)結(jié)果Tab.2 Detection results of malicious request samples

      表3 給出了針對(duì)每個(gè)Web 應(yīng)用發(fā)送的正常請(qǐng)求樣本數(shù)和檢測(cè)到SQL 注入攻擊行為的樣本數(shù)。從表中數(shù)據(jù)可以看出,發(fā)送了大約800 個(gè)正常請(qǐng)求樣本,本文檢測(cè)模型沒(méi)有檢測(cè)到SQL 注入攻擊行為,說(shuō)明該模型并沒(méi)有將正常的請(qǐng)求誤認(rèn)為存在SQL 注入攻擊行為的惡意請(qǐng)求,即不存在誤報(bào)的情況。

      表3 正常請(qǐng)求樣本檢測(cè)結(jié)果Tab.3 Detection results of normal request samples

      綜上所述,可以發(fā)現(xiàn)本文模型能夠檢測(cè)出常見(jiàn)SQL 注入攻擊類型,如重言式、非法或邏輯錯(cuò)誤查詢、聯(lián)合查詢等,針對(duì)發(fā)送的SQL 注入攻擊請(qǐng)求樣本能識(shí)別出絕大多數(shù)具有SQL 注入攻擊行為的請(qǐng)求樣本,針對(duì)正常請(qǐng)求沒(méi)有出現(xiàn)誤報(bào)。上述實(shí)驗(yàn)結(jié)果可以說(shuō)明本文模型是有效的。

      4.2 與其他檢測(cè)方法的比較分析

      由于有些檢測(cè)方法源碼并不開(kāi)放,難以復(fù)現(xiàn),只能通過(guò)閱讀大量的文獻(xiàn)分別從檢測(cè)能力和部署要求等方面進(jìn)行粗略的分析評(píng)估。每種檢測(cè)方法的檢測(cè)能力見(jiàn)表4,每種檢測(cè)方法的實(shí)施部署要求見(jiàn)表5。其中:表4 使用“√”表示可以檢測(cè)到此種類型的攻擊;“*”表示部分可以檢測(cè)的情況;“×”表示不能檢測(cè)該類型的攻擊。

      表4 不同方法的檢測(cè)能力比較Tab.4 Comparison of detection capability of different methods

      表5 不同方法的部署要求比較Tab.5 Comparison of deployment requirements for different methods

      從表4 以看出,文獻(xiàn)[9]的方法側(cè)重于類型安全,文獻(xiàn)[17]的方法側(cè)重于重言式,它們只能檢測(cè)SQL 注入攻擊的一小部分,而當(dāng)前其他一些主流方法基本都可以檢測(cè)到所有類型的SQL 注入攻擊,文獻(xiàn)[30-31]中通過(guò)機(jī)器學(xué)習(xí)與特征向量提取的方法構(gòu)建檢測(cè)模型,模型訓(xùn)練準(zhǔn)確率分別可以達(dá)到91.05%、98.67%。本文方法檢測(cè)準(zhǔn)確率達(dá)到99.42%,在檢測(cè)能力上可以與這些方法相當(dāng)。

      從表5 可以看出,文獻(xiàn)[10-11,27]的方法采用某種插樁工具離線插樁來(lái)加載檢測(cè)模塊,文獻(xiàn)[23]的方法修改了PHP解釋器,文獻(xiàn)[26]的方法則重新定義字符串類及其相關(guān)的賦值連接操作,用這種語(yǔ)言編寫有漏洞的Web 應(yīng)用來(lái)加載檢測(cè)模塊。本文方法既不修改運(yùn)行時(shí)系統(tǒng),也不需要修改原始字符串類,在未作任何修改的Web 應(yīng)用啟動(dòng)后運(yùn)行時(shí)就可以在線提交規(guī)則集以加載檢測(cè)模塊,部署方式更加靈活方便。

      另外,本文和文獻(xiàn)[28]都采用代碼注入的方式將檢測(cè)代碼注入Web 應(yīng)用程序?qū)崿F(xiàn)SQL 注入攻擊檢測(cè)。文獻(xiàn)[28]的方法采用AOP 實(shí)現(xiàn)靜態(tài)注入,而本文使用ECA 規(guī)則實(shí)現(xiàn)了在線注入,可以實(shí)現(xiàn)Web 應(yīng)用的在線檢測(cè),并且ECA 規(guī)則可以在線卸載,使Web 應(yīng)用恢復(fù)原狀。因此,本文模型是一個(gè)低侵入性的無(wú)須重新編譯、打包、部署應(yīng)用的SQL 注入攻擊檢測(cè)模型。另外,文獻(xiàn)[28]的方法對(duì)不可信數(shù)據(jù)進(jìn)行首尾標(biāo)記,并把拼接后的字符串的屬性taint 設(shè)為true,而本文方法對(duì)不可信數(shù)據(jù)采用映射的方式進(jìn)行污點(diǎn)標(biāo)記與存儲(chǔ),即每一個(gè)不可信數(shù)據(jù)對(duì)象與一個(gè)存儲(chǔ)污點(diǎn)信息的對(duì)象相對(duì)應(yīng),這樣標(biāo)記的好處是不影響應(yīng)用的字符串處理邏輯,與應(yīng)用邏輯弱耦合,而且可以保證精度。

      4.3 模型實(shí)時(shí)性分析

      本文模型在加載后,除了可以檢測(cè)SQL 注入攻擊行為,還要考慮它對(duì)原始Web 應(yīng)用造成的性能損失,即當(dāng)用戶發(fā)起請(qǐng)求后,檢測(cè)模型能否及時(shí)給出檢測(cè)結(jié)果。在Web 應(yīng)用的3個(gè)注入點(diǎn),測(cè)試加載檢測(cè)模塊前、后提交正常和惡意請(qǐng)求后得到響應(yīng)的時(shí)間,每個(gè)請(qǐng)求提交200 次,計(jì)算出平均響應(yīng)時(shí)間。通過(guò)比較兩者時(shí)間的差異,初步評(píng)估模型施加給應(yīng)用的性能開(kāi)銷。測(cè)試結(jié)果如表6 所示。從表6 可以看出,3 個(gè)注入點(diǎn)測(cè)試中,當(dāng)發(fā)送正常請(qǐng)求時(shí),加載檢測(cè)組件后,平均響應(yīng)時(shí)間最多增加11 ms;當(dāng)發(fā)送惡意請(qǐng)求時(shí),加載檢測(cè)組件后的平均響應(yīng)時(shí)間最多增加13 ms。由此可以初步評(píng)估,本文模型加載后對(duì)Web 應(yīng)用的施加的影響比較小,對(duì)正常和惡意的請(qǐng)求,模型能及時(shí)判斷出是否存在SQL 注入攻擊行為。

      表6 注入點(diǎn)加載前后的平均響應(yīng)時(shí)間比較 單位:msTab.6 Comparison of average response time before and after loading injection points unit:ms

      5 結(jié)語(yǔ)

      針對(duì)當(dāng)前SQL 注入攻擊檢測(cè)方法不能在線注入檢測(cè)代碼的不足,本文提出了一種基于ECA 規(guī)則和動(dòng)態(tài)污點(diǎn)分析的SQL 注入攻擊檢測(cè)模型。該模型在Web 應(yīng)用運(yùn)行時(shí)安裝ECA 規(guī)則,自動(dòng)加載SQL 注入攻擊檢測(cè)代碼。在攻擊者發(fā)送請(qǐng)求時(shí)自動(dòng)觸發(fā)檢測(cè)組件的執(zhí)行,從而在線檢測(cè)Web 應(yīng)用是否受到SQL 注入攻擊。整個(gè)檢測(cè)模塊由ECA 規(guī)則腳本封裝在一起,與Web 應(yīng)用原來(lái)的邏輯相互獨(dú)立,腳本可在線安裝和卸載,具有輕量級(jí)和低侵入性的部署優(yōu)點(diǎn),在腳本安裝卸載過(guò)程無(wú)須修改應(yīng)用程序執(zhí)行引擎和源碼,無(wú)須重新編譯、打包、部署Web 應(yīng)用。本文基于Byteman 實(shí)現(xiàn)了所提模型,并通過(guò)實(shí)驗(yàn)驗(yàn)證了模型的有效性。但本文方法也具有局限性,只能解決污點(diǎn)傳播中數(shù)據(jù)依賴傳播,沒(méi)有考慮控制依賴傳播。因此未來(lái)的研究計(jì)劃中,將本文方法適用于其他種類的Web 安全威脅防御中。

      猜你喜歡
      污點(diǎn)字符串語(yǔ)句
      基于代碼重寫的動(dòng)態(tài)污點(diǎn)分析
      重點(diǎn):語(yǔ)句銜接
      精彩語(yǔ)句
      使用Lightroom污點(diǎn)去除工具清理照片中的瑕疵
      我國(guó)“污點(diǎn)證人”刑事責(zé)任豁免制度的構(gòu)建
      一種新的基于對(duì)稱性的字符串相似性處理算法
      如何搞定語(yǔ)句銜接題
      依據(jù)字符串匹配的中文分詞模型研究
      一種針對(duì)Java中字符串的內(nèi)存管理方案
      作文語(yǔ)句實(shí)錄
      徐水县| 沾益县| 襄城县| 大田县| 临桂县| 镇沅| 宁明县| 泊头市| 定州市| 土默特右旗| 新晃| 宁南县| 新龙县| 沾化县| 永登县| 祁连县| 吕梁市| 乳源| 将乐县| 海口市| 孝感市| 莱州市| 曲松县| 迁西县| 四会市| 翁牛特旗| 北安市| 福安市| 西林县| 本溪| 石景山区| 富阳市| 灵宝市| 阿拉善左旗| 海门市| 固安县| 靖西县| 刚察县| 漠河县| 德化县| 丹寨县|