亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于抽象語(yǔ)法樹(shù)的C#源代碼SQL注入漏洞檢測(cè)算法

        2015-11-21 03:34:12
        信息安全研究 2015年2期
        關(guān)鍵詞:源代碼數(shù)據(jù)流漏洞

        孫 偉 陳 林

        1(中山大學(xué)信息科學(xué)與技術(shù)學(xué)院 廣州 510006)2(信息技術(shù)教育部重點(diǎn)實(shí)驗(yàn)室(中山大學(xué)) 廣州 510006)3 (中山大學(xué)數(shù)據(jù)科學(xué)與計(jì)算機(jī)學(xué)院 廣州 510006)(sunwei@mail.sysu.edu.cn)

        ?

        基于抽象語(yǔ)法樹(shù)的C#源代碼SQL注入漏洞檢測(cè)算法

        孫 偉1,2陳 林3

        1(中山大學(xué)信息科學(xué)與技術(shù)學(xué)院 廣州 510006)2(信息技術(shù)教育部重點(diǎn)實(shí)驗(yàn)室(中山大學(xué)) 廣州 510006)3(中山大學(xué)數(shù)據(jù)科學(xué)與計(jì)算機(jī)學(xué)院 廣州 510006)(sunwei@mail.sysu.edu.cn)

        SQL注入攻擊是數(shù)據(jù)庫(kù)安全的主要威脅.SQL注入攻擊被列為OWASP(open Web application security project)2010年和2013年十大Web應(yīng)用系統(tǒng)安全威脅之首.SQL注入攻擊檢測(cè)及防御是目前常見(jiàn)的研究熱點(diǎn),結(jié)合抽象語(yǔ)法樹(shù)的數(shù)據(jù)傳播分析及C#語(yǔ)言特性,提出基于規(guī)則及特征匹配的漏洞檢測(cè)架構(gòu),實(shí)現(xiàn)了C#源代碼的靜態(tài)檢測(cè)算法.測(cè)試結(jié)果表明該算法效果良好,簡(jiǎn)單實(shí)用,通過(guò)生成源代碼的抽象語(yǔ)法樹(shù)及追蹤數(shù)據(jù)的傳播途徑,根據(jù)規(guī)則匹配進(jìn)行檢測(cè),實(shí)現(xiàn)C#源代碼的SQL注入漏洞檢測(cè),在開(kāi)發(fā)階段提高了代碼的安全性;同時(shí)提出的漏洞檢測(cè)框架可以進(jìn)行拓展,實(shí)現(xiàn)對(duì)其他編程語(yǔ)言的SQL注入漏洞檢測(cè).

        SQL注入;抽象語(yǔ)法樹(shù);數(shù)據(jù)流分析;規(guī)則匹配;靜態(tài)分析

        根據(jù)美國(guó)Verizon發(fā)布的《2015 數(shù)據(jù)泄露調(diào)查報(bào)告》[1]統(tǒng)計(jì),2014年發(fā)生在全球61個(gè)國(guó)家的79 790起安全事件中,有2 122起數(shù)據(jù)泄露事件得到確認(rèn),從2010年到2014年的統(tǒng)計(jì)數(shù)據(jù)來(lái)看,全球數(shù)據(jù)庫(kù)泄露事件呈現(xiàn)緩慢增長(zhǎng)的趨勢(shì).在眾多導(dǎo)致數(shù)據(jù)庫(kù)泄露的漏洞中,利用SQL(structured query language)注入漏洞發(fā)動(dòng)的攻擊,是數(shù)據(jù)庫(kù)安全的主要威脅.OWASP(open Web application security project) 在2010年和2013年都把SQL注入攻擊列為十大Web應(yīng)用系統(tǒng)安全威脅之首[2-3].根據(jù)安華金和數(shù)據(jù)庫(kù)攻防實(shí)驗(yàn)室最新發(fā)布的《2015H1安華金和數(shù)據(jù)庫(kù)漏洞威脅報(bào)告》[4]顯示,80%以上的數(shù)據(jù)庫(kù)泄露漏洞都屬于SQL注入范疇.

        SQL注入漏洞不僅數(shù)量多,而且危害性很大,一旦發(fā)生SQL注入攻擊,常常給用戶(hù)帶來(lái)巨大的損失.據(jù)美國(guó)NTT集團(tuán)對(duì)2013年全球發(fā)生的近30億次攻擊進(jìn)行分析得出的《2014年全球威脅情報(bào)報(bào)告(GTIR)》[5]指出,一次“小規(guī)?!钡腟QL注入攻擊造成的損失超過(guò)19.6萬(wàn)美元.因此研究SQL注入攻擊的防御檢測(cè)是一個(gè)迫切而有價(jià)值的研究.

        SQL注入(SQL injection, SQLI)是一種代碼注入技術(shù),通過(guò)把惡意的SQL腳本插入到要執(zhí)行的輸入字段,用于攻擊數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用程序[6].SQL注入漏洞本質(zhì)上就是Web應(yīng)用程序開(kāi)發(fā)者編程過(guò)程中的缺陷[7].因此對(duì)SQL注入漏洞的檢測(cè)主要是對(duì)程序代碼進(jìn)行檢測(cè).常見(jiàn)的代碼檢測(cè)方法有靜態(tài)代碼檢測(cè)和動(dòng)態(tài)代碼檢測(cè)2種方法.靜態(tài)代碼檢測(cè)就是不需要運(yùn)行應(yīng)用程序,在編譯和執(zhí)行之前就實(shí)施漏洞檢測(cè).動(dòng)態(tài)代碼檢測(cè)則相反,需要運(yùn)行應(yīng)用程序,在應(yīng)用程序執(zhí)行的過(guò)程中實(shí)施漏洞檢測(cè).

        在動(dòng)態(tài)檢測(cè)方法的研究中,文獻(xiàn)[8]對(duì)包括開(kāi)源和商業(yè)的11個(gè)黑盒掃描器進(jìn)行了分析評(píng)價(jià),其中Acunetix,AppScan,N-Stalker,w3af在對(duì)比分析中都是較為突出的代表.Huang 等人[9]提出一個(gè)名為WAVES的黑盒測(cè)試技術(shù),利用一個(gè)網(wǎng)頁(yè)蜘蛛爬蟲(chóng)(Web crawler)識(shí)別出所有可能被利用的SQL注入點(diǎn),然后基于預(yù)先定義的模式和攻擊技術(shù)模擬攻擊,WAVES會(huì)觀察應(yīng)用系統(tǒng)的反應(yīng)而作出判斷,并通過(guò)機(jī)器學(xué)習(xí)的方法提高攻擊技術(shù).文獻(xiàn)[10]提出一種基于三維的多相位檢測(cè)方法(multiple phases detection approach, MDPA)的動(dòng)態(tài)SQL注入漏洞測(cè)試用例的生成模型,提高了SQL注入檢測(cè)的覆蓋度、準(zhǔn)確性及檢測(cè)效率.

        在靜態(tài)檢測(cè)的方法研究中,JDBC-Checker[11]通過(guò)對(duì)動(dòng)態(tài)生成的SQL查詢(xún)的類(lèi)型正確性進(jìn)行靜態(tài)的檢查,能夠防御類(lèi)型不匹配的攻擊,其缺點(diǎn)是不能對(duì)更多即使符合語(yǔ)法規(guī)范及類(lèi)型正確但依然是惡意的SQL語(yǔ)句進(jìn)行檢測(cè).Java Static Tainting[12]是Livshits和Lam提出的一種用靜態(tài)分析技術(shù)來(lái)檢測(cè)軟件中漏洞的方法,其核心是使用信息流的技術(shù)來(lái)檢測(cè)被感染的輸入是否已被用來(lái)構(gòu)造一個(gè)SQL查詢(xún).其限制是只能檢測(cè)已知的攻擊模式,而且因使用了保守分析而影響了對(duì)未污染操作的支持,存在著較高的誤報(bào)率.文獻(xiàn)[13-15]先后相關(guān)地論述了使用二叉決策圖(binary decision diagram)的基于克隆的上下文相關(guān)的指針?lè)治黾夹g(shù),通過(guò)Datalog(a logic programming language)和PQL(program query language)的支持,實(shí)現(xiàn)了對(duì)Java基于用戶(hù)自定義規(guī)則的靜態(tài)代碼的檢測(cè),該工具的優(yōu)點(diǎn)是作為Eclipse的一個(gè)插件,能夠在編碼的階段識(shí)別出漏洞,在漏洞風(fēng)險(xiǎn)發(fā)生之前就發(fā)出警告,降低了SQL注入攻擊的風(fēng)險(xiǎn),但該方法的缺陷是其準(zhǔn)確率及誤報(bào)率依賴(lài)于漏洞規(guī)范的定義,而且目前只能應(yīng)用到Java語(yǔ)言.

        以上都是來(lái)自國(guó)外的研究情況,在國(guó)內(nèi),文獻(xiàn)[16]使用基于信任源的動(dòng)態(tài)著色及SQL方言語(yǔ)法感知的方法,修改了PHP的詞法分析器,利用不同數(shù)據(jù)庫(kù)管理系統(tǒng)各自的SQL語(yǔ)法解析器對(duì)SQL語(yǔ)句進(jìn)行語(yǔ)法分析,改進(jìn)了傳統(tǒng)的動(dòng)態(tài)著色防御漏洞的方法,但該方法需要修改編程語(yǔ)言的內(nèi)核,未必適用于其他編程語(yǔ)言.文獻(xiàn)[17]提出一種基于程序分析技術(shù)的防御SQL注入的方法,通過(guò)標(biāo)識(shí)污染源,跟蹤污染數(shù)據(jù)流,并為包含污染數(shù)據(jù)的SQL腳本在程序注入點(diǎn)建立自動(dòng)機(jī)模型,在程序運(yùn)行時(shí)監(jiān)控SQL腳本的自動(dòng)機(jī)模型,如果無(wú)法滿(mǎn)足合法查詢(xún)的自動(dòng)機(jī)模型,即為惡意SQL注入攻擊.該方法最大的弱點(diǎn)是需要在源程序進(jìn)行插裝,更改了應(yīng)用程序的源代碼.文獻(xiàn)[18]提出基于“污染值傳播”理論的數(shù)據(jù)流分析的SQL漏洞發(fā)現(xiàn)方法,首先將源代碼轉(zhuǎn)換為順序、分支或循環(huán)等控制流圖,定義并求解程序中每一個(gè)變量在控制流圖節(jié)點(diǎn)的污染格值,包括“污染”和“非污染”2個(gè)值,通過(guò)數(shù)據(jù)流分析技術(shù)跟蹤這種污染格值的傳播轉(zhuǎn)換,把污染值轉(zhuǎn)播分析結(jié)果作為漏洞判定的依據(jù),最終污染格值為“污染”的參數(shù)被標(biāo)識(shí)為漏洞,該方法能夠在程序開(kāi)發(fā)階段發(fā)現(xiàn)SQL注入漏洞,適用于解釋執(zhí)行的腳本語(yǔ)言,未見(jiàn)對(duì)編譯型的編程語(yǔ)言的支持.

        在我國(guó),廣泛使用C#作為Web系統(tǒng)的設(shè)計(jì)語(yǔ)言,但對(duì)其研究較少,因此針對(duì)C#作為源代碼的SQL注入攻擊檢測(cè)的研究具有較高的現(xiàn)實(shí)意義.本文針對(duì)C#的源代碼提出一種基于抽象語(yǔ)法樹(shù)的數(shù)據(jù)流分析的規(guī)則及特征匹配算法,在應(yīng)用程序研發(fā)過(guò)程中對(duì)源代碼進(jìn)行靜態(tài)檢測(cè)和分析,為應(yīng)用程序的安全評(píng)估提供信息,從而提高了Web應(yīng)用的安全性.

        1 C#代碼的SQL注入漏洞特征分析

        SQL注入的過(guò)程是一個(gè)受到污染的注入源(source),經(jīng)過(guò)一系列的數(shù)據(jù)傳播路徑,最后到達(dá)注入點(diǎn)(sink)觸發(fā)注入的過(guò)程.因此,檢測(cè)SQL注入的源代碼重點(diǎn)是關(guān)注注入源的感染點(diǎn)代碼以及注入點(diǎn)的代碼,對(duì)應(yīng)于C#編程語(yǔ)言,就是接收和讀取用戶(hù)輸入、客戶(hù)端或服務(wù)端信息的代碼以及與數(shù)據(jù)庫(kù)接口相關(guān)的代碼.

        在C#語(yǔ)言中,使用System.Web命名空間中的HttpRequest類(lèi)讀取客戶(hù)端在Web請(qǐng)求期間的HTTP值,表1是C#代碼與SQL注入相關(guān)的編碼特征.

        表1 與SQL注入相關(guān)的C#代碼特征

        表1主要描述了與SQL注入相關(guān)的C#代碼特征,這些特征將作為匹配規(guī)則的依據(jù),檢測(cè)源代碼中是否存在導(dǎo)致SQL注入的注入源以及注入點(diǎn)的代碼,其中如果采用了參數(shù)化編程,在本文中會(huì)被認(rèn)為這樣的編碼是安全的.

        下面通過(guò)一個(gè)存在SQL注入漏洞的代碼例子,分析其特點(diǎn),為檢測(cè)規(guī)則的定義提供理論依據(jù).圖1是一個(gè)Web應(yīng)用的后臺(tái)登錄前端界面:

        圖1 Web應(yīng)用后臺(tái)登錄界面

        圖1的登錄界面由用戶(hù)名、密碼和驗(yàn)證碼3個(gè)字段構(gòu)成,其中用戶(hù)名字段經(jīng)常是SQL注入攻擊的位置.當(dāng)輸入這3個(gè)字段的值按回車(chē)或者是點(diǎn)擊登錄按鈕之后,其執(zhí)行的代碼如圖2所示:

        圖2 執(zhí)行的代碼

        上述代碼通過(guò)用戶(hù)名和密碼驗(yàn)證是否存在該帳號(hào),跟蹤輸入正常的用戶(hù)名和密碼的數(shù)據(jù)流,對(duì)應(yīng)的SQL語(yǔ)句分析如圖3所示:

        圖3 輸入正常帳號(hào)信息的登錄數(shù)據(jù)流分析

        由圖3可見(jiàn),當(dāng)在前端界面輸入用戶(hù)名admin進(jìn)行登錄時(shí),傳入代碼的用戶(hù)名數(shù)據(jù)是admin,對(duì)應(yīng)的SQL查詢(xún)語(yǔ)句為select*from CRM_User where Name=′admin′ and PassWord=′admin′.假如用戶(hù)在用戶(hù)名字段輸入了諸如′or 1=1- -的惡意代碼,跟蹤處理的數(shù)據(jù)流,對(duì)應(yīng)的SQL語(yǔ)句分析如圖4所示:

        圖4 輸入異常帳號(hào)信息的登錄數(shù)據(jù)流分析

        由圖4可見(jiàn),用戶(hù)名字段傳入代碼的數(shù)據(jù)是′or 1=1 - -,對(duì)應(yīng)的SQL查詢(xún)語(yǔ)句為select*from CRM_User where Name=′′or 1=1 - -′ and PassWord=′admin′,結(jié)果繞過(guò)了用戶(hù)名和密碼的校驗(yàn),把表CRM_User的所有用戶(hù)信息查詢(xún)出來(lái).

        從以上例子可見(jiàn),源代碼通過(guò)strUsername=Request.Form[″username″]獲取用戶(hù)的輸入,這個(gè)代碼就是SQL注入源,經(jīng)過(guò)sqlstring=″select*from CRM_User where Name=′″+strUsername+″′ and PassWord=′″+strPassword+″′″語(yǔ)句與其他SQL命令和密碼字段串聯(lián)組裝成新的字符串,這是注入源的傳播路徑,經(jīng)過(guò)串聯(lián)組裝的SQL語(yǔ)句最后經(jīng)過(guò)SqlCommand cmd=new SqlCommand(sqlstring, dbcon)把SQL腳本傳送給后臺(tái)數(shù)據(jù)庫(kù)執(zhí)行,最終觸發(fā)了SQL注入,這個(gè)代碼就是注入點(diǎn).經(jīng)過(guò)分析歸納,存在SQL注入點(diǎn)的代碼具有如下特點(diǎn):

        1) 存在如表1所述的注入源特征的用戶(hù)輸入、客戶(hù)端Cookie、服務(wù)端變量;

        2) 從注入源獲取的值直接與其他字符串串聯(lián)拼接成SQL語(yǔ)句,或注入源的值以變量輸入到一個(gè)函數(shù),且函數(shù)的輸出與其他字符串串聯(lián)拼接成SQL語(yǔ)句;

        3) 拼接的SQL語(yǔ)句經(jīng)過(guò)表1的注入點(diǎn)特征代碼交付到后臺(tái)數(shù)據(jù)庫(kù)執(zhí)行.

        符合以上3個(gè)特點(diǎn)的編碼被認(rèn)為是存在SQL注入漏洞的.

        2 源代碼靜態(tài)檢測(cè)的思路分析

        2.1 檢測(cè)架構(gòu)分析

        本文基于靜態(tài)分析的C#源代碼SQL注入檢測(cè)算法,是根據(jù)第1節(jié)描述的代碼特點(diǎn)進(jìn)行SQL注入漏洞判斷的.假如從注入源到注入點(diǎn)的數(shù)據(jù)信息傳播路徑,一直都是直接的字符串拼接或者效果等于直接字符串拼接的賦值操作,那么認(rèn)為這些代碼是存在SQL注入漏洞的,反之,假如采用參數(shù)化、存儲(chǔ)過(guò)程化或者對(duì)象化(諸如采用Nhibernate)編程對(duì)數(shù)據(jù)進(jìn)行處理,那么這樣的代碼被認(rèn)為是安全的.

        本文檢測(cè)算法的基本思路是利用抽象語(yǔ)法樹(shù)技術(shù)對(duì)C#源代碼分析,遍歷抽象語(yǔ)法樹(shù),得到每一個(gè)用戶(hù)輸入的數(shù)據(jù)流分析結(jié)果,最終把用戶(hù)輸入的數(shù)據(jù)流分析結(jié)果與SQL注入校驗(yàn)規(guī)則比較匹配,得出SQL注入漏洞的檢測(cè)結(jié)果.抽象語(yǔ)法樹(shù)技術(shù)的引入目的是為了提高生成用戶(hù)輸入的數(shù)據(jù)流分析結(jié)果的效率.

        本文通過(guò)建立一個(gè)開(kāi)放和可擴(kuò)展的架構(gòu),利用抽象語(yǔ)法樹(shù)的數(shù)據(jù)流分析技術(shù)及規(guī)則匹配的算法,根據(jù)定義的規(guī)則與源代碼作匹配,最終輸出漏洞缺陷警告,實(shí)現(xiàn)對(duì)源代碼靜態(tài)分析的掃描.本文算法的核心基礎(chǔ)是應(yīng)用抽象語(yǔ)法樹(shù)的特性,如圖5所示.

        由圖5可見(jiàn),架構(gòu)主要由輸入、處理引擎和輸出3部分組成,其功能特點(diǎn)如下:

        1) 處理引擎.由生成抽象語(yǔ)法樹(shù)、分析數(shù)據(jù)傳播路徑、規(guī)則匹配檢測(cè)、生成知識(shí)、記錄漏洞等各個(gè)功能組件構(gòu)成,具有良好的擴(kuò)展性和穩(wěn)定性.本文實(shí)現(xiàn)的漏洞檢測(cè)工具重點(diǎn)實(shí)現(xiàn)了規(guī)則匹配檢測(cè)、記錄漏洞、漏洞缺陷報(bào)告生成3個(gè)功能組件.生成抽象語(yǔ)法樹(shù)借助了開(kāi)源軟件Mono[19]的支持.

        2) 輸入.由代碼和規(guī)則庫(kù)組成.規(guī)則庫(kù)將根據(jù)輸出的知識(shí)庫(kù)和漏洞缺陷警告等信息進(jìn)行改進(jìn).

        3) 輸出.由知識(shí)庫(kù)和漏洞缺陷警告組成.知識(shí)庫(kù)的意義是生成有價(jià)值的知識(shí),指導(dǎo)開(kāi)發(fā)人員提高編程質(zhì)量,同時(shí)也對(duì)規(guī)則庫(kù)的完整性和準(zhǔn)確性提供支持.本文漏洞檢測(cè)工具實(shí)現(xiàn)了漏洞缺陷警告功能,知識(shí)庫(kù)的提出為下一步研究提供了接口和思路.

        圖5 靜態(tài)檢測(cè)算法的架構(gòu)

        2.2 檢測(cè)流程描述

        基于抽象語(yǔ)法樹(shù)的數(shù)據(jù)流分析的規(guī)則匹配算法從源代碼開(kāi)始,經(jīng)過(guò)抽象語(yǔ)法樹(shù)的生成、遍歷抽象語(yǔ)法樹(shù)生成數(shù)據(jù)流分析結(jié)果,循環(huán)調(diào)用檢測(cè)算法,用規(guī)則庫(kù)和數(shù)據(jù)流分析的數(shù)據(jù)比較匹配,當(dāng)規(guī)則匹配時(shí),記錄相應(yīng)漏洞信息,當(dāng)檢測(cè)算法循環(huán)體達(dá)到結(jié)束條件時(shí),生成當(dāng)前C#源代碼文件的警告報(bào)告,其流程如圖6所示:

        圖7 圖2中代碼的抽象語(yǔ)法樹(shù)

        圖6 靜態(tài)掃描的流程

        圖6描述了基于靜態(tài)分析的C#源代碼SQL注入檢測(cè)的整個(gè)流程,其核心過(guò)程有3個(gè):第1個(gè)是生成抽象語(yǔ)法樹(shù);第2個(gè)是遍歷抽象語(yǔ)法樹(shù)生成用戶(hù)數(shù)據(jù)的數(shù)據(jù)傳播路徑,該數(shù)據(jù)傳播路徑可以用1棵二叉樹(shù)表達(dá);第3個(gè)是漏洞檢測(cè)過(guò)程,該過(guò)程就是基于規(guī)則庫(kù),遍歷用戶(hù)數(shù)據(jù)的傳播路徑,即遍歷用戶(hù)數(shù)據(jù)流的二叉樹(shù),符合規(guī)則的標(biāo)準(zhǔn),記錄漏洞,最后生成漏洞報(bào)告.

        2.3 關(guān)鍵算法描述

        本文的靜態(tài)掃描算法,重點(diǎn)是遍歷和析取抽象語(yǔ)法樹(shù)數(shù)據(jù)并進(jìn)行漏洞檢測(cè)的算法.

        抽象語(yǔ)法樹(shù)[20](abstract syntax tree, AST)也稱(chēng)為語(yǔ)法樹(shù)(syntax tree),是采用計(jì)算機(jī)編程語(yǔ)言寫(xiě)成的源代碼的抽象語(yǔ)法結(jié)構(gòu)的樹(shù)狀表現(xiàn)形式,樹(shù)上的每個(gè)節(jié)點(diǎn)都表示源代碼中的一種結(jié)構(gòu).之所以說(shuō)語(yǔ)法是“抽象”的,是因?yàn)檫@里的語(yǔ)法并不會(huì)表示出真實(shí)語(yǔ)法中出現(xiàn)的每個(gè)細(xì)節(jié).圖7是圖2中代碼對(duì)應(yīng)的抽象語(yǔ)法樹(shù).

        為了便于理解,圖7用矩形框起了語(yǔ)句string strUsername=Request.Form[″username″]的抽象語(yǔ)法樹(shù)關(guān)鍵節(jié)點(diǎn),對(duì)本文來(lái)說(shuō)有意義的節(jié)點(diǎn)就是用戶(hù)輸入及其傳播的節(jié)點(diǎn).每一個(gè)用戶(hù)輸入的傳播過(guò)程相當(dāng)于一系列的賦值指令過(guò)程,每一個(gè)賦值指令語(yǔ)句由目的操作數(shù)、操作符和源操作數(shù)組成,對(duì)應(yīng)到抽象語(yǔ)法樹(shù)的節(jié)點(diǎn),就是Body→Statement→Variable→Identifier→=→Expression→Identifier→Argument這樣的一個(gè)節(jié)點(diǎn)聯(lián)系過(guò)程,每個(gè)指令語(yǔ)句相當(dāng)于一個(gè)Statement節(jié)點(diǎn),每個(gè)Statement節(jié)點(diǎn)包含目的操作數(shù)、操作符和源操作數(shù)的子節(jié)點(diǎn).通過(guò)遍歷析取抽象語(yǔ)法樹(shù),得到每一個(gè)用戶(hù)輸入的數(shù)據(jù)傳播過(guò)程信息,每一個(gè)用戶(hù)輸入的數(shù)據(jù)經(jīng)由輸入、傳播,最終到達(dá)數(shù)據(jù)庫(kù)執(zhí)行,其傳播過(guò)程可以表達(dá)成一個(gè)數(shù)據(jù)流樹(shù),以u(píng)sername的傳播過(guò)程為例,其數(shù)據(jù)流樹(shù)如圖8所示.

        圖8 用戶(hù)輸入傳播過(guò)程的數(shù)據(jù)流樹(shù)

        由圖8可見(jiàn),每一個(gè)用戶(hù)輸入的傳播過(guò)程最終形成的數(shù)據(jù)結(jié)構(gòu)是1棵數(shù)據(jù)流樹(shù),葉子是源操作數(shù)或目的操作數(shù),非葉子節(jié)點(diǎn)是操作符.源代碼經(jīng)過(guò)抽象語(yǔ)法樹(shù)的生成,遍歷抽象語(yǔ)法樹(shù),最終生成每一個(gè)用戶(hù)輸入的數(shù)據(jù)流樹(shù),并存儲(chǔ)到數(shù)據(jù)表中.

        通過(guò)遍歷析取抽象語(yǔ)法樹(shù)獲得用戶(hù)輸入的數(shù)據(jù)流樹(shù)信息后,檢測(cè)SQL注入漏洞的算法轉(zhuǎn)變?yōu)橐砸?guī)則庫(kù)遍歷用戶(hù)輸入的數(shù)據(jù)流樹(shù).規(guī)則庫(kù)定義了各種操作符及其安全性,其數(shù)據(jù)定義為(操作符,安全類(lèi)型),操作符包括C#代碼處理用戶(hù)輸入的各種函數(shù),如表1所示的注入源、注入點(diǎn)及參數(shù)化編程的操作符以及各種字符串串接、賦值、轉(zhuǎn)換、用戶(hù)自定義函數(shù)等.安全類(lèi)型包括安全、不安全、可能不安全,針對(duì)SQL注入漏洞而言,其安全類(lèi)型定義如下:

        1) 參數(shù)化、存儲(chǔ)過(guò)程化和對(duì)象化編程的操作標(biāo)記為安全;

        2) 其他的直接賦值、轉(zhuǎn)換操作標(biāo)記為不安全;

        3) 函數(shù)操作標(biāo)記為可能不安全.

        另外,作為注入源的用戶(hù),直接輸入標(biāo)記為不安全.SQL注入漏洞的檢測(cè)規(guī)則為:

        1) 不安全的數(shù)據(jù)經(jīng)過(guò)安全的操作,輸出為安全;

        2) 不安全的數(shù)據(jù)經(jīng)過(guò)不安全的操作,輸出為不安全;

        3) 不安全的數(shù)據(jù)經(jīng)過(guò)可能不安全的操作,輸出為不安全;

        4) 安全的數(shù)據(jù)經(jīng)過(guò)安全的操作,輸出為安全;

        5) 安全的數(shù)據(jù)經(jīng)過(guò)不安全的操作,輸出為安全;

        6) 安全的數(shù)據(jù)經(jīng)過(guò)可能不安全的操作,輸出為安全.

        依據(jù)這些規(guī)則,遍歷用戶(hù)輸入的檢測(cè)結(jié)果如圖9所示.

        在圖9中,用戶(hù)輸入Request.Form[″username″]標(biāo)記為不安全,經(jīng)過(guò)一系列的操作,由源操作數(shù)和操作符的安全性一起決定目的操作數(shù)的安全性,然后標(biāo)識(shí)每個(gè)操作輸出的安全性,整個(gè)數(shù)據(jù)流分析結(jié)果表明該用戶(hù)輸入存在漏洞,不安全.

        圖9 遍歷數(shù)據(jù)流樹(shù)的檢測(cè)結(jié)果

        3 SQL注入漏洞檢測(cè)算法實(shí)現(xiàn)

        從以上對(duì)SQL注入及防御的研究可知,SQL注入其實(shí)質(zhì)是一種驗(yàn)證型的漏洞,這對(duì)如何提高代碼的安全性有著重要的現(xiàn)實(shí)意義.通過(guò)檢測(cè)代碼存在的SQL注入漏洞,是一種有效防御SQL注入的方法.

        本文從源代碼靜態(tài)檢測(cè)的角度,提出基于抽象語(yǔ)法樹(shù)的數(shù)據(jù)流分析技術(shù),針對(duì)C#源代碼的靜態(tài)檢測(cè)方法,不僅有利于發(fā)現(xiàn)源代碼的安全漏洞,給軟件開(kāi)發(fā)商帶來(lái)切實(shí)的價(jià)值,把軟件系統(tǒng)的安全風(fēng)險(xiǎn)提前揭示,而且能夠給代碼開(kāi)發(fā)人員帶來(lái)有益的啟示,提高了開(kāi)發(fā)人員編碼的規(guī)范性和安全性.

        本文提出的檢測(cè)算法,其功能主要包括:

        1) 生成抽象語(yǔ)法樹(shù).通過(guò)xx編譯器把C#的源代碼(*.cs)生成抽象語(yǔ)法樹(shù).

        2) 析取抽象語(yǔ)法樹(shù)數(shù)據(jù).通過(guò)遍歷抽象語(yǔ)法樹(shù),析取與用戶(hù)輸入相關(guān)的節(jié)點(diǎn)數(shù)據(jù),每一個(gè)用戶(hù)輸入數(shù)據(jù)的傳播過(guò)程都形成1棵數(shù)據(jù)流樹(shù).

        3) 規(guī)則的定義.定義檢測(cè)代碼是否存在SQL注入漏洞的規(guī)則,用來(lái)判斷用戶(hù)輸入數(shù)據(jù)從注入源到注入點(diǎn)的過(guò)程是否存在安全或不安全的操作.

        4) 檢測(cè)SQL注入漏洞.依據(jù)檢測(cè)規(guī)則,遍歷數(shù)據(jù)流樹(shù),檢測(cè)代碼的SQL注入漏洞并保存到數(shù)據(jù)表中.

        5) 輸出檢測(cè)報(bào)告.查詢(xún)檢測(cè)結(jié)果,輸出檢測(cè)結(jié)果報(bào)告.

        本文提供的算法暫時(shí)無(wú)法檢測(cè)跨文件的數(shù)據(jù)傳播,使得本文的靜態(tài)代碼檢測(cè)算法存在一定的誤判率.

        3.1 分析及設(shè)計(jì)

        根據(jù)SQL注入檢測(cè)的問(wèn)題,依據(jù)其功能要求,析取以下用例,如圖10所示:

        圖10 SQL注入漏洞檢測(cè)的用例

        圖10由5個(gè)用例組成,包括生成抽象語(yǔ)法樹(shù)、析取抽象語(yǔ)法樹(shù)數(shù)據(jù)、檢測(cè)SQL注入漏洞、定義規(guī)則及輸出檢測(cè)結(jié)果.其中生成抽象語(yǔ)法樹(shù)的用例功能,引用了開(kāi)源軟件Mono項(xiàng)目的Cecil控件,本文在其基礎(chǔ)上實(shí)現(xiàn)了遍歷抽象語(yǔ)法樹(shù),析取用戶(hù)輸入的數(shù)據(jù)流傳播信息的功能.

        下面通過(guò)活動(dòng)圖描述核心的2個(gè)用例:析取抽象語(yǔ)法樹(shù)數(shù)據(jù)用例和檢測(cè)SQL注入漏洞的用例,如圖11和圖12所示.

        圖11描述了析取語(yǔ)法樹(shù)用例的活動(dòng)過(guò)程:

        1) 讀取抽象語(yǔ)法樹(shù);

        2) 遍歷抽象語(yǔ)法樹(shù)的每一個(gè)元素;

        3) 判斷抽象語(yǔ)法樹(shù)的節(jié)點(diǎn)Token類(lèi)型是否是賦值型的表達(dá)式,如果是,則判斷同級(jí)節(jié)點(diǎn)的表達(dá)式是否包含用戶(hù)輸入變量,用戶(hù)輸入變量的判斷來(lái)自檢測(cè)規(guī)則的HTTP request的特征關(guān)鍵字,如果是用戶(hù)輸入,則析取該表達(dá)式的節(jié)點(diǎn)信息并記錄到數(shù)據(jù)庫(kù),按照目的操作數(shù)、操作符和源操作數(shù)這樣的指令模式記錄;

        4) 把獲得的表達(dá)式的目的操作數(shù)作為輸入,遍歷抽象語(yǔ)法樹(shù)的節(jié)點(diǎn),追蹤該目的操作數(shù)作為源操作數(shù)的表達(dá)式,如3)一樣記錄到數(shù)據(jù)庫(kù);

        5) 遞歸檢測(cè)每一個(gè)新的目的操作數(shù),并記錄到數(shù)據(jù)庫(kù),直到目的操作數(shù)在抽象語(yǔ)法樹(shù)中不再作為源操作數(shù)存在;

        6) 結(jié)束.

        圖11 析取抽象語(yǔ)法樹(shù)數(shù)據(jù)的活動(dòng)圖

        圖12是檢測(cè)SQL注入漏洞的用例活動(dòng)圖.該圖描述了檢測(cè)SQL注入漏洞用例的活動(dòng)過(guò)程:

        1) 獲取所有待檢測(cè)的文件名;

        2) 循環(huán)遍歷每一個(gè)文件;

        3) 獲取同一個(gè)文件所有的注入源,即用戶(hù)輸入;

        4) 遍歷每一個(gè)注入源的數(shù)據(jù)流樹(shù),用預(yù)先定義的規(guī)則,跟蹤分析每一個(gè)用戶(hù)輸入的數(shù)據(jù)傳播路徑,從注入源的位置開(kāi)始,到注入點(diǎn)的位置結(jié)束,得出該用戶(hù)輸入的安全屬性;

        5) 保存檢測(cè)結(jié)果.

        圖12 檢測(cè)SQL注入漏洞的活動(dòng)圖

        根據(jù)以上的分析,檢測(cè)算法的類(lèi)設(shè)計(jì)如圖13所示.

        圖13描述了檢測(cè)算法各個(gè)類(lèi)之間的關(guān)系,由圖13可見(jiàn),檢測(cè)的邊界類(lèi)ScanView調(diào)用了檢測(cè)規(guī)則的控制類(lèi)RuleMaintemance和檢測(cè)結(jié)果的控制類(lèi)ScanResultOperation.

        圖13 SQL注入檢測(cè)算法實(shí)現(xiàn)的VOPC(view of participating class)圖

        3.2 編碼的技術(shù)架構(gòu)

        邏輯上,SQL注入檢測(cè)算法的實(shí)現(xiàn)采用3層的架構(gòu),包括界面層、業(yè)務(wù)邏輯層和實(shí)體層,在編碼實(shí)現(xiàn)中,其技術(shù)架構(gòu)如圖14所示.

        圖14 SQL注入檢測(cè)算法的實(shí)現(xiàn)技術(shù)架構(gòu)

        圖14描述了實(shí)際編碼中的技術(shù)架構(gòu).用戶(hù)界面定義面向用戶(hù)操作的功能,也稱(chēng)表示層,通過(guò)調(diào)用邏輯層的接口,實(shí)現(xiàn)業(yè)務(wù)邏輯處理;邏輯層通過(guò)數(shù)據(jù)訪問(wèn)層訪問(wèn)數(shù)據(jù)庫(kù);Model負(fù)責(zé)定義數(shù)據(jù)實(shí)體的類(lèi),可以被表示層、邏輯層和數(shù)據(jù)訪問(wèn)層訪問(wèn);在數(shù)據(jù)訪問(wèn)層,為了更便于編程及編碼的簡(jiǎn)潔,數(shù)據(jù)庫(kù)訪問(wèn)接口統(tǒng)一放在Library子層,該Library子層定義了數(shù)據(jù)庫(kù)連接字符串及各種直接面向數(shù)據(jù)庫(kù)的操作接口,數(shù)據(jù)處理組件只要引用Library,則可方便連接數(shù)據(jù)庫(kù)及調(diào)用各種數(shù)據(jù)庫(kù)執(zhí)行指令.

        3.3 算法典型代碼

        SQL注入漏洞的檢測(cè)算法的典型代碼如圖15所示.圖15的典型代碼主要包含各種循環(huán)遍歷的檢測(cè)代碼,包括循環(huán)遍歷獲取所有待檢測(cè)文件、循環(huán)遍歷每一個(gè)文件的所有用戶(hù)輸入,遍歷每一個(gè)用戶(hù)輸入的數(shù)據(jù)傳播路徑的數(shù)據(jù)流樹(shù),最終確定每一個(gè)用戶(hù)輸入是否存在SQL注入漏洞,把檢測(cè)的結(jié)果保存到結(jié)果表.

        圖15 SQL注入漏洞的檢測(cè)算法代碼

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

        下面是本文實(shí)現(xiàn)的檢測(cè)算法的功能界面截圖,主要包括4個(gè):

        1) 規(guī)則定義界面如圖16所示.

        圖16通過(guò)列表的形式顯示規(guī)則,增加、修改規(guī)則之后,點(diǎn)擊底下的保存按鈕即可保存到數(shù)據(jù)庫(kù).

        2) 語(yǔ)法樹(shù)生成界面如圖17所示.

        圖17頂部的代碼是C#源代碼,點(diǎn)擊生成語(yǔ)法樹(shù)按鈕之后,底部的樹(shù)型結(jié)構(gòu)的內(nèi)容即是源代碼對(duì)應(yīng)的抽象語(yǔ)法樹(shù).

        圖17 生成語(yǔ)法樹(shù)界面

        3) 析取語(yǔ)法樹(shù)結(jié)果界面如圖18所示.

        圖18呈現(xiàn)了析取抽象語(yǔ)法樹(shù)之后,每一個(gè)用戶(hù)輸入的表達(dá)式,都以目的操作數(shù)、操作符和源操作數(shù)的形式保存到數(shù)據(jù)庫(kù),每一個(gè)用戶(hù)輸入的數(shù)據(jù)傳播路徑,都形成一個(gè)樹(shù)型的數(shù)據(jù)流樹(shù).

        4) 掃描檢測(cè)結(jié)果界面如圖19所示.

        圖19顯示了點(diǎn)擊開(kāi)始檢測(cè)按鈕后的檢測(cè)結(jié)果,包括檢測(cè)的文件數(shù)、檢測(cè)所耗時(shí)間以及檢測(cè)發(fā)現(xiàn)的SQL注入漏洞個(gè)數(shù),底部詳細(xì)呈現(xiàn)了注入源、行號(hào)、SQL注入掃描結(jié)果、注入傳播路徑、文件名及掃描時(shí)間等數(shù)據(jù)信息.

        圖18 析取抽象語(yǔ)法樹(shù)的結(jié)果

        圖19 SQL注入檢測(cè)結(jié)果界面

        實(shí)驗(yàn)的檢測(cè)結(jié)果表明,本文提出的基于靜態(tài)分析的C#源代碼SQL注入檢測(cè)算法是可行的,覆蓋了標(biāo)準(zhǔn)的C#源代碼的SQL注入源的所有類(lèi)型,檢測(cè)的結(jié)果經(jīng)滲透測(cè)試是正確的.

        5 總 結(jié)

        本文提出的靜態(tài)檢測(cè)算法概述為通過(guò)抽象語(yǔ)法樹(shù)的生成,析取抽象語(yǔ)法樹(shù)的節(jié)點(diǎn)數(shù)據(jù),形成用戶(hù)輸入的數(shù)據(jù)流樹(shù),然后基于預(yù)先定義的檢測(cè)規(guī)則,從注入源到注入點(diǎn)遍歷檢測(cè)數(shù)據(jù)流樹(shù),追蹤分析源操作數(shù)、操作符及目的操作數(shù)的安全性變化,最終得出用戶(hù)輸入是否存在SQL注入漏洞的安全性分析結(jié)果.但在未來(lái)的研究中需要進(jìn)一步完善以下功能:

        1) 改進(jìn)生成源代碼的抽象語(yǔ)法樹(shù)的功能;

        2) 改善遍歷抽象語(yǔ)法樹(shù)生成數(shù)據(jù)流分析樹(shù)的功能;

        3) 提高跨過(guò)程調(diào)用的檢測(cè)準(zhǔn)確率及實(shí)現(xiàn)跨文件調(diào)用的檢測(cè);

        4) 完善規(guī)則庫(kù)和知識(shí)庫(kù)的建設(shè),提高覆蓋度及準(zhǔn)確率.

        [1]2015 data breach investigations report[R/OL]. New York: Verizon, 2015 [2015-10-19]. https://msisac.cisecurity.org/resources/reports/documents/rp_data-breach-investigation-report-2015_en_xg.pdf

        [2]Creative Commons Attributution Share-alike. The top10 most critical Web application security risks 2010[R/OL]. United States: OWASP, 2010 [2015-10-19]. http://owasptop10.googlecode.com/files/OWASP%20Top%2010%20-%202010.pdf

        [3]Creative Commons Attributution Share-alike. The top10 most critical Web application security risks 2013[R/OL]. United States: OWASP, 2013 [2015-10-19]. http://owasptop10.googlecode.com/files/OWASP%20Top%2010%20-%202013.pdf

        [4]安華金和. 2015H1安華金和數(shù)據(jù)庫(kù)漏洞威脅報(bào)告[R/OL]. 北京: 安華金和數(shù)據(jù)庫(kù)攻防實(shí)驗(yàn)室, 2015 [2015-10-19]. http://www.dbsec.cn/service/pdf/2015H1-DATABASE-VULNERABILITIES-REPORT.pdf

        [5]NTT Innovation Institute. Global threat intelligence report[R/OL]. Palo Alto, California: NTT Group, 2015 [2015-10-19]. https://nttgroupsecurity.com/articles-content/articles/download-the-2014-report

        [6]維基百科編者. SQL injection[G/OL]. 維基百科, (2015-10-19) [2015-10-19]. https://en.wikipedia.org/wiki/SQL_injection

        [7]馬小婷, 胡國(guó)平, 李舟軍. SQL注入漏洞檢測(cè)與防御技術(shù)研究[J]. 計(jì)算機(jī)安全, 2010 (11): 18-24

        [8]Doupé A, Cova M, Vigna G. Why johnny can’t pentest: An analysis of black-box Web vulnerability scanners[M] //Detection of Intrusions and Malware, and Vulnerability Assessment. Berlin: Springer, 2010: 111-131

        [9]Huang Y W, Huang S K, Lin T P, et al. Web application security assessment by fault injection and behavior monitoring[C] //Proc of the 12th Int Conf on World Wide Web. New York: ACM, 2003: 148-159

        [10]Liu Lei,Xu Jing, Li Minglei, et al. A dynamic SQL injection vulnerability test case generation model based on the multiple phases detection approach[C] //Proc of the 37th IEEE Annual Computer Software and Applications Conf. Piscataway, NJ: IEEE, 2013: 256-261

        [11]Gould C, Su Z, Devanbu P. JDBC checker: A static analysis tool for SQL/JDBC applications[C] //Proc of the 26th Int Conf on Software Engineering. Los Alamitos, CA: IEEE Computer Society, 2004: 697-698

        [12]Livshits B V, Lam M S. Finding security errors in Java programs with static analysis[C] //Proc of the 14th USENIX Security Symp. Berkeley: USENIX Association, 2005: 271-286

        [13]Whaley J, Lam M S. Cloning-based context-sensitive pointer alias analysis using binary decision diagrams[J]. ACM SIGPLAN Notices, 2004, 39(6): 131-144

        [14]Martin M, Livshits B, Lam M S. Finding application errors using PQL: A program query language[R]. Palo Alto, California: Stanford University, 2004

        [15]Martin M, Livshits B, Lam M S. Finding application errors and security flaws using PQL: A program query language[J]. ACM SIGPLAN Notices, 2005, 40(10): 365-383

        [16]丁翔, 仇寅, 鄭滔. 一種利用PHP防御SQL注入攻擊的方法[J]. 計(jì)算機(jī)工程, 2011, 37(11): 152-153

        [17]李小花, 孫建華, 陳浩. 程序分析技術(shù)在SQL注入防御中的應(yīng)用研究[J]. 小型微型計(jì)算機(jī)系統(tǒng), 2011, 32(6): 1089-1093

        [18]謝億鑫, 孫樂(lè)昌, 劉京菊. 基于數(shù)據(jù)流分析的SQL注入漏洞發(fā)現(xiàn)技術(shù)研究[J]. 微計(jì)算機(jī)信息, 2010 (15): 163-165

        [19]Mono. Cecil[CP/OL]. 2015 [2015-09-10]. http://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/

        [20]維基百科編者. Abstract syntax tree[G/OL]. 維基百科, (2015-09-08) [2015-10-19]. https://en.wikipedia.org/wiki/Abstract_syntax_tree

        孫 偉

        教授,博士生導(dǎo)師,主要研究方向?yàn)榫W(wǎng)絡(luò)安全和多媒體技術(shù)通信.

        sunwei@mail.sysu.edu.cn

        陳 林

        碩士研究生,主要研究方向?yàn)樾畔踩?

        chanlan@163.com

        A C# Source-Code SQL Injection Attack Detection Algorithm Based on Abstract Syntax Tree

        Sun Wei1,2and Chen Lin3

        1(SchoolofInformationScienceandTechnology,SunYat-senUniversity,Guangzhou510006)2(KeyLaboratoryofInformationTechnology(MinistryofEducation),SunYat-senUniversity,Guangzhou510006)3(SchoolofDataandComputerScience,SunYat-senUniversity,Guangzhou510006)

        SQL injection attacks is ranked first in OWASP (open Web application security project) Top10 Web application security threats in both 2010 and 2013. This paper proposes a static abstract syntax tree analysis framework for detecting SQL injections based on the matching rules, and implements the C# source-code SQL injection attack detection algorithm. This paper focuses on data flow analysis based on the abstract syntax tree, tracing the route of transmission of data and detecting SQL vulnerability in accordance with the predefined rules. Then this paper achieves injection detection algorithm based on C# language source code and MSSQL. The detection algorithm results show that the algorithm works well for C# language source code. But the results also show that it is possible to make false negative due to lack of supportof detecting the vulnerability existing in the cross-file and cross-function. However, the proposed architecture and algorithms can be extended to other programming platforms. Finally, this paper makes a summary on both SQL injection and the defense, points out the shortcomings itself and makes a prospect of the SQL injection research.

        SQL injection; abstract syntax tree; data flow analysis; feature matching; static analysis

        2015-10-19

        TP309

        猜你喜歡
        源代碼數(shù)據(jù)流漏洞
        人工智能下復(fù)雜軟件源代碼缺陷精準(zhǔn)校正
        漏洞
        基于TXL的源代碼插樁技術(shù)研究
        汽車(chē)維修數(shù)據(jù)流基礎(chǔ)(下)
        軟件源代碼非公知性司法鑒定方法探析
        一種提高TCP與UDP數(shù)據(jù)流公平性的擁塞控制機(jī)制
        三明:“兩票制”堵住加價(jià)漏洞
        漏洞在哪兒
        揭秘龍湖產(chǎn)品“源代碼”
        基于數(shù)據(jù)流聚類(lèi)的多目標(biāo)跟蹤算法
        亚洲国产综合专区在线电影| 久久不见久久见免费视频7| 久久综合噜噜激激的五月天| 国产freesexvideos中国麻豆| 国产精品亚洲а∨无码播放不卡| 夜夜躁狠狠躁2021| 肉体裸交丰满丰满少妇在线观看 | 久久中文字幕av第二页| 麻豆精品国产免费av影片| 国产一区av男人天堂| 国产综合色在线精品| 国产成本人片无码免费2020| 亚洲一区av无码少妇电影 | 99视频一区二区日本| 国产精品专区第一页天堂2019 | 日本一卡2卡3卡4卡无卡免费网站| 亚洲爆乳少妇无码激情| 韩日无码不卡| 区三区久久精品水蜜桃av| 人妻一区二区三区在线看| 成人无码一区二区三区| 国产网红主播无码精品| 人人玩人人添人人澡| 手机看片福利盒子久久青| 四虎国产精品成人影院| 亚洲一区二区三区av天堂| 国产一区二区三区亚洲avv| 国产午夜福利不卡在线观看| 天堂а√在线最新版中文| 9久9久女女热精品视频免费观看 | 午夜视频福利一区二区三区| 久久成人永久婷婷99精品| 99精品久久99久久久久| 岳毛多又紧做起爽| 欧美老妇与禽交| 亚洲 国产 韩国 欧美 在线 | 啪啪免费网站| 久久精品国产乱子伦多人| 亚洲一区二区三区码精品色| 免费看黄色亚洲一区久久| 久9re热视频这里只有精品|