• 
    

    
    

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

      SQLMVED:基于多變體執(zhí)行的SQL 注入運(yùn)行時(shí)防御系統(tǒng)

      2021-05-13 10:12:46馬博林張錚劉浩鄔江興
      通信學(xué)報(bào) 2021年4期
      關(guān)鍵詞:變體攻擊者語(yǔ)句

      馬博林,張錚,劉浩,鄔江興

      (1.信息工程大學(xué),河南 鄭州 450001;2.網(wǎng)絡(luò)通信與安全紫金山實(shí)驗(yàn)室,江蘇 南京 211100)

      1 引言

      隨著“互聯(lián)網(wǎng)+”新業(yè)態(tài)的快速發(fā)展,傳統(tǒng)行業(yè)向網(wǎng)絡(luò)服務(wù)發(fā)生轉(zhuǎn)變,海量的數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,互聯(lián)網(wǎng)用戶可以通過結(jié)構(gòu)化查詢語(yǔ)句(SQL,structured query language)隨時(shí)隨地訪問網(wǎng)絡(luò)服務(wù)數(shù)據(jù)。數(shù)據(jù)庫(kù)遵循國(guó)際標(biāo)準(zhǔn)化組織(ISO,International Organization for Standardization)、國(guó)際電工委員會(huì)(IEC,International Electrotechnical Commission)等發(fā)布的統(tǒng)一標(biāo)準(zhǔn),雖然提高了網(wǎng)絡(luò)服務(wù)間數(shù)據(jù)格式的一致性,但易被利用的特性也使網(wǎng)絡(luò)服務(wù)數(shù)據(jù)面臨越來越多的安全威脅。

      目前,SQL 注入攻擊(SQLIA,SQL injection attack)是危害網(wǎng)絡(luò)服務(wù)數(shù)據(jù)安全的主要威脅之一,“OWASP TOP 10”項(xiàng)目最近三次發(fā)布的The Ten Most Critical Web Application Security Risks報(bào)告顯示,SQLIA 在所有統(tǒng)計(jì)的安全威脅分類中連續(xù)多年排名首位。

      文獻(xiàn)[1]提出了一種基于指令集隨機(jī)化的SQLIA 防御方法,通過對(duì)SQL 進(jìn)行隨機(jī)化變化,使攻擊者不能預(yù)知應(yīng)用程序的SQL 形式,無法完成SQLIA。該文獻(xiàn)推動(dòng)了SQLIA 防御方法由SQL 運(yùn)行前的檢測(cè)技術(shù)向運(yùn)行時(shí)的主動(dòng)防御技術(shù)轉(zhuǎn)變,其中的隨機(jī)化方法在黑盒環(huán)境下能夠有效抵御SQLIA,但是攻擊者一旦通過社會(huì)工程學(xué)或者在白盒環(huán)境下掌握了隨機(jī)化方法,調(diào)整注入代碼,便能實(shí)現(xiàn)有效的SQLIA。

      為了解決該問題,本文改進(jìn)文獻(xiàn)[1]的技術(shù)思路,提出了一種基于多變體執(zhí)行技術(shù)的SQLIA防御方法。結(jié)合多變體執(zhí)行與隨機(jī)化防御思路,構(gòu)建SQLIA 運(yùn)行時(shí)防御系統(tǒng)架構(gòu),并根據(jù)數(shù)據(jù)的讀、寫操作設(shè)計(jì)針對(duì)性的表決方法,基于Web 服務(wù)實(shí)現(xiàn)了原型系統(tǒng)SQLMVED(SQL multi-variant execution defense)。安全性評(píng)估和實(shí)驗(yàn)測(cè)試表明,該方法無論在攻擊者是否掌握了防御機(jī)制的情況下,均能夠有效抵御SQLIA。

      2 SQL 注入攻擊研究

      2.1 SQL 注入攻擊原理

      SQL 是用于數(shù)據(jù)庫(kù)查詢、更新和管理的高級(jí)非過程化編程語(yǔ)言,最初由IBM 公司研制開發(fā),目前廣泛地應(yīng)用于程序設(shè)計(jì)開發(fā)中。圖1 給出了典型的Web 服務(wù)架構(gòu)[2]??蛻舳送ㄟ^應(yīng)用層協(xié)議向服務(wù)器端發(fā)送請(qǐng)求(步驟1))。服務(wù)器通過CGI/FastCGI格式將請(qǐng)求轉(zhuǎn)發(fā)至CG(Icommon gateway interface)應(yīng)用程序進(jìn)行解析處理(步驟2))。執(zhí)行目標(biāo)程序,目標(biāo)程序若執(zhí)行回調(diào)功能代碼,則重復(fù)步驟3);若執(zhí)行數(shù)據(jù)庫(kù)操作功能代碼,則進(jìn)行步驟4),例如程序調(diào)用PHP-CGI 中的mysqli_query、oci_execute 等函數(shù);若執(zhí)行具有系統(tǒng)命令調(diào)用功能的代碼,則進(jìn)行步驟5)。最終,通過步驟6)和步驟7)將服務(wù)器端的響應(yīng)結(jié)果返回至客戶端。

      圖1 典型的Web 服務(wù)架構(gòu)

      SQLIA 的語(yǔ)句執(zhí)行在步驟4),攻擊者在用戶輸入中構(gòu)造惡意SQL,由CGI 將其與目標(biāo)程序中的SQL 拼接后發(fā)送至數(shù)據(jù)庫(kù)執(zhí)行,從而實(shí)現(xiàn)非法操作。相較于發(fā)生在步驟3)的代碼注入攻擊和發(fā)生在步驟5)的命令注入攻擊,SQLIA 不依賴于操作系統(tǒng)以及應(yīng)用程序運(yùn)行環(huán)境,在漏洞存在的情況下攻擊實(shí)施的門檻較低。

      2.2 SQL 注入攻擊威脅

      SQLIA 是針對(duì)數(shù)據(jù)庫(kù)的攻擊技術(shù),攻擊者利用應(yīng)用程序開發(fā)階段的漏洞或缺乏對(duì)輸入驗(yàn)證,向應(yīng)用程序中注入惡意SQL,從而達(dá)到查詢、更改或刪除數(shù)據(jù)的目的。根據(jù)網(wǎng)絡(luò)空間安全[3]的框架劃分,SQLIA 主要是利用應(yīng)用層的漏洞或后門,破壞數(shù)據(jù)層的安全性,SQLIA 主要將以下網(wǎng)絡(luò)服務(wù)特性或功能作為攻擊目標(biāo)。

      1) 繞過身份驗(yàn)證。網(wǎng)絡(luò)服務(wù)通常設(shè)置身份驗(yàn)證過程,以用戶輸入與數(shù)據(jù)庫(kù)查詢結(jié)果比對(duì)的方式實(shí)現(xiàn),攻擊者通過SQLIA 可繞過比對(duì)過程,使用非法用戶成功繞過身份驗(yàn)證。

      2) 竊取數(shù)據(jù)。網(wǎng)絡(luò)服務(wù)中的大量數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,如身份證號(hào)、手機(jī)號(hào)、銀行卡號(hào)等信息,攻擊者通過SQLIA 獲取敏感信息,是竊取數(shù)據(jù)的主要途徑。

      3) 破壞可用性。攻擊者通過SQLIA 不僅可以竊取數(shù)據(jù),還可以更改或刪除數(shù)據(jù),破壞數(shù)據(jù)完整性,甚至停止數(shù)據(jù)庫(kù)服務(wù),達(dá)到拒絕服務(wù)的目的。

      4) 數(shù)據(jù)庫(kù)指紋識(shí)別。攻擊者通過SQLIA 識(shí)別數(shù)據(jù)庫(kù)類型、版本等信息,為發(fā)起針對(duì)性的0day或APT(advanced persistent threat)攻擊做準(zhǔn)備。

      5) 繞過輸入檢查。網(wǎng)絡(luò)服務(wù)為了抵御SQLIA,選擇性地部署外掛式防御措施,對(duì)用戶輸入檢查是否存在注入語(yǔ)句,攻擊者通過構(gòu)造特殊的SQLIA繞過輸入檢查。

      2.3 SQL 注入攻擊分類

      本節(jié)主要介紹目前已知的SQLIA 類型,由于無法窮舉每種攻擊類型的所有變化形式,表1 以用戶查詢?yōu)閳?chǎng)景,為每種SQLIA 類型提供了代表性的示例語(yǔ)句。真實(shí)的網(wǎng)絡(luò)對(duì)抗中,攻擊者通常組合使用多種SQLIA 類型來完成對(duì)特定目標(biāo)的攻擊。

      1) 重言式。此類攻擊在條件語(yǔ)句中構(gòu)造注入代碼,使SQL 的判定結(jié)果永遠(yuǎn)為真,從而繞過條件語(yǔ)句中的驗(yàn)證過程。

      2) 批量查詢。此類攻擊利用查詢分隔符,注入額外的SQL,使原始語(yǔ)句完成操作后,繼而執(zhí)行注入的批量語(yǔ)句。

      3) 錯(cuò)誤回顯。數(shù)據(jù)庫(kù)錯(cuò)誤消息通常包含有用信息,此類攻擊向服務(wù)端注入語(yǔ)法錯(cuò)誤、類型轉(zhuǎn)換錯(cuò)誤或邏輯錯(cuò)誤的SQL,利用錯(cuò)誤回顯獲得數(shù)據(jù)庫(kù)關(guān)鍵信息。更進(jìn)一步地,攻擊者將錯(cuò)誤語(yǔ)句與查詢語(yǔ)句拼接,利用錯(cuò)誤信息回顯查詢結(jié)果。

      4) 聯(lián)合查詢。此類攻擊注入U(xiǎn)NION 語(yǔ)句,改變返回的數(shù)據(jù)結(jié)果,從而繞過驗(yàn)證過程或獲得敏感數(shù)據(jù)。

      5) 存儲(chǔ)過程。此類攻擊屬于數(shù)據(jù)庫(kù)中設(shè)置的額外抽象層,可以由開發(fā)人員進(jìn)行編程,因此同樣遭受SQLIA 威脅。攻擊者可以注入SHUTDOWN、DROPTABLE 等語(yǔ)句,造成數(shù)據(jù)破壞或拒絕服務(wù)。

      6) 盲注。當(dāng)應(yīng)用程序隱藏了數(shù)據(jù)庫(kù)的不安全錯(cuò)誤消息而不再產(chǎn)生錯(cuò)誤回顯時(shí),攻擊者既可以采用布爾盲注方法,利用應(yīng)用程序的正確或錯(cuò)誤響應(yīng),判斷注入語(yǔ)句的執(zhí)行結(jié)果;也可以采用時(shí)間盲注方法,利用sleep、benchmark 等函數(shù)配合if-then 語(yǔ)句,通過響應(yīng)時(shí)間判斷注入語(yǔ)句的執(zhí)行結(jié)果,從而獲得有效信息。

      7) 交替編碼。攻擊者使用交替編碼(例如十六進(jìn)制、ASCII、Unicode)修改注入查詢語(yǔ)句,從而繞過輸入過濾器的檢測(cè)。

      2.4 SQL 注入攻擊防御方法

      根據(jù)防御發(fā)生的時(shí)機(jī),Shar 等[4]將SQLIA 防御技術(shù)在廣義上分為防御性編碼、運(yùn)行前分析和運(yùn)行時(shí)防御3 類。

      防御性編碼是在開發(fā)階段約束開發(fā)者的代碼編寫習(xí)慣,要求開發(fā)者在實(shí)現(xiàn)過程中更多地采用參數(shù)化查詢或存儲(chǔ)過程轉(zhuǎn)義所有用戶提交的參數(shù)、數(shù)據(jù)類型校驗(yàn)、白名單篩選等防御性編碼方式。Mcclure 等[5]和Cook 等[6]創(chuàng)新地提出了SQL 開發(fā)模式,開發(fā)者通過提供的API,能夠自動(dòng)實(shí)現(xiàn)具有數(shù)據(jù)類型校驗(yàn)、輸入過濾和轉(zhuǎn)義的SQL,消除大量可能導(dǎo)致SQLIA 發(fā)生的編碼問題。此類防御技術(shù)盡管是有效的,但需要開發(fā)者使用新的編程方式,并且不會(huì)對(duì)已存在的應(yīng)用程序提供安全防護(hù),應(yīng)用范圍狹窄。因此,防御性編碼類的SQLIA 防御技術(shù)未受到國(guó)內(nèi)外學(xué)者的持續(xù)關(guān)注,研究成果有限。

      運(yùn)行前分析一般是通過對(duì)應(yīng)用程序進(jìn)行漏洞掃描、自動(dòng)化測(cè)試等來發(fā)現(xiàn)SQLIA 漏洞,從而確保應(yīng)用程序是安全可靠的,或者是在SQL 執(zhí)行之前利用數(shù)據(jù)挖掘、黑白名單等技術(shù)手段對(duì)輸入檢查,來保證用戶輸入不含有SQLIA 代碼。在漏洞測(cè)試方面,Kiezun 等[7]開發(fā)了ARDILLA 工具,能夠根據(jù)應(yīng)用程序自動(dòng)生成SQLIA 語(yǔ)句,從而檢測(cè)應(yīng)用程序是否存在SQLIA 漏洞;孫歆等[8]設(shè)計(jì)了基于缺陷注入的模糊測(cè)試方法,服務(wù)代理獲取用戶請(qǐng)求后轉(zhuǎn)發(fā)至模糊測(cè)試引擎,引擎采用DOM4J 解析XML偽碼配置,生成測(cè)試用例進(jìn)行注入測(cè)試。針對(duì)輸入檢測(cè),防御方法通常設(shè)計(jì)在防火墻層面[9-12]或CGI層面[13-15]。在防火墻層面的相關(guān)研究較豐富,Kar等[9]提出的SQLiGoT 采用令牌圖和支持向量機(jī)能有效地識(shí)別SQLIA 語(yǔ)句;韓宸望等[10]提出了基于SQL 語(yǔ)法樹的過濾方法,在用戶請(qǐng)求進(jìn)入服務(wù)端前對(duì)比輸入語(yǔ)句的SQL 語(yǔ)法樹特征是否與合法特征一致,有效抵御SQLIA;趙宇飛等[11]基于長(zhǎng)度、連接頻率和特征串對(duì)網(wǎng)絡(luò)流量進(jìn)行分析,有效檢測(cè)SQLIA。在CGI 層面,張慧琳等[13]提出利用編碼值判斷SQL 中敏感字符的來源、轉(zhuǎn)義非可信敏感字符,基于 PHP 的 Zend 引擎實(shí)現(xiàn)了原型系統(tǒng)PHPGate,阻止SQLIA 發(fā)生。運(yùn)行前分析類的SQLIA 防御技術(shù),無論是通過生成測(cè)試用例進(jìn)行自動(dòng)化測(cè)試,還是構(gòu)建合法或非法的語(yǔ)句特征進(jìn)行輸入檢測(cè),其核心思想是在掌握惡意輸入規(guī)則、語(yǔ)法漏洞集合或者建立有效白名單的前提下實(shí)施有效防護(hù),當(dāng)新型的攻擊出現(xiàn)時(shí),此類技術(shù)保證的攻守平衡會(huì)被打破,繼而再努力解決新的問題,產(chǎn)生新的研究成果。

      表1 SQLIA 類型及示例

      運(yùn)行時(shí)防御在運(yùn)行前分析的基礎(chǔ)上,一方面在程序運(yùn)行時(shí)進(jìn)行監(jiān)控,確保應(yīng)用程序的行為始終在信任狀態(tài),Halfond 等[16]提出了AMNESIA 工具,該工具運(yùn)行在CGI 層,將靜態(tài)分析和運(yùn)行時(shí)防御相結(jié)合,在靜態(tài)部分創(chuàng)建語(yǔ)句模型,然后在運(yùn)行時(shí)監(jiān)測(cè)這些動(dòng)態(tài)生成的語(yǔ)句,一旦不符合設(shè)置的合法語(yǔ)句模型,該工具將阻止語(yǔ)句發(fā)送至數(shù)據(jù)庫(kù);何成萬等[17]提出了一種基于AOP(aspect-oriented programming)和動(dòng)態(tài)污點(diǎn)分析的檢測(cè)方法,通過污點(diǎn)標(biāo)記方法區(qū)分可信與非可信數(shù)據(jù)源,在JDBC 中解析發(fā)現(xiàn)非可信語(yǔ)法。另一方面改變攻擊者對(duì)目標(biāo)系統(tǒng)的認(rèn)知,使注入代碼失效,Boyd 等[1]基于SQL的隨機(jī)化設(shè)計(jì)了SQLRand 系統(tǒng),對(duì)SQL 關(guān)鍵字進(jìn)行隨機(jī)化處理,例如,原始未隨機(jī)化的SQL 為SELECT account FROM users WHERE login=“AND pass=”,采用key 為“123”隨機(jī)化后的SQL 為SELECT123 account FROM123 users WHERE123 login=“AND123 pass=”,這樣可以使攻擊者不能預(yù)知應(yīng)用程序的SQL 形式,SQLRand 系統(tǒng)架構(gòu)如圖2所示。在CGI 與數(shù)據(jù)庫(kù)之間增加代理,用于解析語(yǔ)句和去隨機(jī)化處理,如果解析語(yǔ)句發(fā)現(xiàn)含有未隨機(jī)化的SQL 關(guān)鍵字,則進(jìn)行異常處理,不予執(zhí)行,從而實(shí)現(xiàn)SQLIA 的有效防御。

      圖2 SQLRand 系統(tǒng)架構(gòu)

      SQLRand 系統(tǒng)在黑盒環(huán)境下能夠有效抵御SQLIA,但是存在被猜解的威脅,目前通過hashcat[18]工具暴力破解,在GPU 破解速度為9×109次/s 的條件下,每秒可以嘗試900 萬種組合,攻擊者在秒級(jí)時(shí)間內(nèi)就可以完成對(duì)4 位標(biāo)簽的猜解。而攻擊者在白盒環(huán)境下能夠準(zhǔn)確掌握SQL 關(guān)鍵字的隨機(jī)化方法,隨即調(diào)整注入代碼,立刻實(shí)現(xiàn)有效的SQLIA。本文提出了一種基于多變體執(zhí)行的SQLIA 運(yùn)行時(shí)防御方法,多變體間采用互不相同的隨機(jī)化方法,即使在攻擊者掌握了隨機(jī)化方法的情況下,非法SQL也最多只能被某一變體解析成功,利用表決機(jī)制對(duì)多變體的響應(yīng)結(jié)果或解析結(jié)果進(jìn)行表決,實(shí)現(xiàn)SQLIA 的有效防御。

      3 基于多變體執(zhí)行的SQLIA 防御方法

      3.1 多變體執(zhí)行技術(shù)研究

      程序冗余執(zhí)行的技術(shù)思路最早應(yīng)用在程序調(diào)試、錯(cuò)誤容忍等保證程序可靠性的領(lǐng)域中,后來研究者在程序冗余執(zhí)行的基礎(chǔ)上,將冗余執(zhí)行的軟件進(jìn)行多樣化設(shè)計(jì),從而解決軟件的安全問題,因此在軟件安全領(lǐng)域?qū)⑷哂鄨?zhí)行的多樣化程序稱為多變體。多變體執(zhí)行最早由Knowlton[19]提出,分別將2 個(gè)功能邏輯等價(jià)程序的實(shí)現(xiàn)代碼分成小片段,然后利用跳轉(zhuǎn)指令,在保證程序語(yǔ)義不變的前提下,對(duì)代碼片段進(jìn)行重組。2 個(gè)程序并行執(zhí)行時(shí),由CPU 檢查程序的執(zhí)行語(yǔ)義是否相等,從而可以預(yù)防控制轉(zhuǎn)換越界、錯(cuò)誤使用野指針等安全問題。

      Cox 等[20]提出了較完整的軟件多變體執(zhí)行架構(gòu)N-Variant,如圖3 所示。該架構(gòu)通過內(nèi)存地址空間隨機(jī)化和指令集隨機(jī)化技術(shù)生成冗余變體,在不關(guān)注攻擊方式的情況下,實(shí)現(xiàn)了對(duì)信息泄露攻擊的有效防御,N-Variant 奠定了多變體執(zhí)行技術(shù)的基礎(chǔ),并總結(jié)出該技術(shù)面臨著變體生成、監(jiān)控方法等關(guān)鍵問題。

      圖3 N-Variant 系統(tǒng)架構(gòu)

      有關(guān)多變體執(zhí)行技術(shù)的眾多研究中,Berger 等[21]提出了DieHard,其架構(gòu)如圖4 所示。該架構(gòu)對(duì)init_heap、malloc、free 函數(shù)進(jìn)行重新設(shè)計(jì),采用新的init_heap 和malloc 函數(shù)結(jié)合,使用隨機(jī)化技術(shù)為多變體生成不同的堆對(duì)象布局。多變體以獨(dú)立的進(jìn)程運(yùn)行,通過管道從主進(jìn)程接收輸入,然后在新的free 函數(shù)中將輸出寫入共享空間的緩沖區(qū)中,調(diào)用表決進(jìn)程對(duì)所有變體的輸出進(jìn)行比較,從而有效抵御內(nèi)存錯(cuò)誤,保證內(nèi)存安全。該團(tuán)隊(duì)又在Diehard的基礎(chǔ)上,擴(kuò)展內(nèi)存分配機(jī)制,設(shè)計(jì)了Dieharder[22]系統(tǒng)架構(gòu),使變體能夠在不連續(xù)的內(nèi)存頁(yè)面上隨機(jī)分配,解決了Diehard 中單個(gè)堆塊溢出后覆蓋其他堆塊空間的問題。

      圖4 DieHard 系統(tǒng)架構(gòu)

      Novark 等[23]在DieHard 的基礎(chǔ)上,擴(kuò)展提出了 Exterminator,如圖 5 所示。該架構(gòu)改善了Diehard 的表決算法,能夠表決發(fā)現(xiàn)內(nèi)存錯(cuò)誤位置,并在運(yùn)行時(shí)生成補(bǔ)丁進(jìn)行適應(yīng)性的修補(bǔ),并且Exterminator 首次為多變體執(zhí)行架構(gòu)增加了動(dòng)態(tài)反饋機(jī)制。

      圖5 Exterminator 系統(tǒng)架構(gòu)

      以N-Variant、Diehard、Dieharder、Exterminator等架構(gòu)為代表進(jìn)行分析,多變體執(zhí)行是在多樣化技術(shù)的基礎(chǔ)上,利用冗余、動(dòng)態(tài)機(jī)制,解決軟硬件同質(zhì)化帶來的安全問題。多變體只要在受保護(hù)的攻擊面中存在更小的重疊范圍,便可以作為變體的“源”來構(gòu)建冗余執(zhí)行架構(gòu)。

      我國(guó)鄔江興院士[24]提出了由構(gòu)造決定安全的擬態(tài)防御理論,研究了冗余、異構(gòu)、動(dòng)態(tài)特性解決內(nèi)生安全問題的有效性,系統(tǒng)地構(gòu)建了動(dòng)態(tài)異構(gòu)冗余架構(gòu),如圖6 所示。該架構(gòu)由輸入代理、異構(gòu)組件池、異構(gòu)執(zhí)行體集、調(diào)度器、表決器組成。動(dòng)態(tài)異構(gòu)冗余架構(gòu)下同時(shí)運(yùn)行多個(gè)功能等價(jià)、結(jié)構(gòu)相異的執(zhí)行體,由于網(wǎng)絡(luò)攻擊對(duì)于目標(biāo)環(huán)境的依賴性,不同執(zhí)行體對(duì)具有攻擊行為的輸入會(huì)產(chǎn)生不一致的輸出,通過表決就能夠發(fā)現(xiàn)執(zhí)行體產(chǎn)生的異常結(jié)果。因此,動(dòng)態(tài)異構(gòu)冗余架構(gòu)能夠在不依賴先驗(yàn)知識(shí)的情況下,有效防御針對(duì)已知或未知漏洞后門發(fā)起的攻擊。

      圖6 擬態(tài)防御動(dòng)態(tài)異構(gòu)冗余架構(gòu)

      擬態(tài)防御相較于多變體技術(shù),具有完備的理論體系,已發(fā)行多版中英文著作[25]。對(duì)比兩者的技術(shù)思路可以發(fā)現(xiàn),多變體技術(shù)屬于擬態(tài)防御作為內(nèi)生安全構(gòu)造技術(shù)解決軟件安全的范疇。

      本文基于多變體執(zhí)行技術(shù),設(shè)計(jì)實(shí)現(xiàn)了SQLIA運(yùn)行時(shí)防御原型系統(tǒng)SQLMVED?;诒竟?jié)的研究?jī)?nèi)容,SQLMVED 的衍生路線如圖7 所示。

      圖7 SQLMVED 的衍生路線

      3.2 SQLMVED 系統(tǒng)設(shè)計(jì)

      大部分多變體執(zhí)行架構(gòu)采用Leader-Follower或者M(jìn)aster-Slave 設(shè)計(jì),針對(duì)不予表決的系統(tǒng)調(diào)用,監(jiān)控器將其分派至Leader/Master 變體執(zhí)行,再將結(jié)果同步至Follower/Slave 變體中,這種方法能夠有效降低假陽(yáng)性,卻增加了安全威脅,Leader/Master變體一旦被控制,多變體執(zhí)行架構(gòu)的防御有效性將大打折扣。本文提出基于多變體執(zhí)行的SQLMVED系統(tǒng),為避免Leader-Follower/Master-Slave 模式的安全威脅,采用同步模式,系統(tǒng)架構(gòu)如圖8 所示,系統(tǒng)由用戶請(qǐng)求代理、負(fù)責(zé)處理請(qǐng)求的多變體、數(shù)據(jù)庫(kù)代理,以及數(shù)據(jù)庫(kù)組成。

      圖8 SQLMVED 系統(tǒng)架構(gòu)

      用戶請(qǐng)求代理是網(wǎng)絡(luò)服務(wù)的出入口[26],當(dāng)接收到用戶發(fā)起的請(qǐng)求時(shí),其將請(qǐng)求復(fù)制3 份再轉(zhuǎn)發(fā)至多變體;當(dāng)接收到多變體的響應(yīng)時(shí),進(jìn)行表決,若存在多數(shù)一致的響應(yīng),則返回至用戶,否則拒絕響應(yīng)。用戶請(qǐng)求代理基于Nginx 實(shí)現(xiàn),利用ngx_http_upstream_module 模塊的負(fù)載功能和本文3.3 節(jié)設(shè)計(jì)的算法1,實(shí)現(xiàn)同一用戶請(qǐng)求向多變體的轉(zhuǎn)發(fā),以及同一用戶響應(yīng)的表決。

      多變體由Web 服務(wù)端、CGI 以及部署的應(yīng)用程序組成,其中應(yīng)用程序采用隨機(jī)化方法對(duì)SQL 進(jìn)行隨機(jī)化變化,且變體之間采用的標(biāo)簽是不同的。

      數(shù)據(jù)庫(kù)代理由獨(dú)立地服務(wù)于各個(gè)變體的SQL語(yǔ)法解析器SQLParse 和負(fù)責(zé)比較其解析結(jié)果的表決器組成。SQL 語(yǔ)法解析器基于sqlparse/ keywords.py 文件,使tokens.Keyword 與隨機(jī)化標(biāo)簽保持一致,完成解析隨機(jī)化SQL 和去隨機(jī)化的過程。由于只改變tokens.Keyword 的表現(xiàn)形式,不改變SQL 解析的正常流程,因此本文提出的SQL 隨機(jī)化方法不會(huì)影響SQL 解析器的正常功能。例如,變體E1采用的標(biāo)簽為“123”,其對(duì)應(yīng)的語(yǔ)法解析器為SQLParse1;變體E2采用的標(biāo)簽為“456”,其對(duì)應(yīng)的語(yǔ)法解析器為SQLParse2。以SQLSELECT a FROM b WHERE c=‘?’;(其中?為占位符)為例,當(dāng)攻擊者掌握了隨機(jī)化標(biāo)簽,調(diào)整輸入為admin’or123 ‘1’=‘1 時(shí),SQLParse1解析的結(jié)果,在未經(jīng)去隨機(jī)化處理時(shí)的結(jié)構(gòu)如圖9 所示。由于攻擊者注入的“or123”符合變體E1的變化方法,因此在變體E1中注入攻擊成功。

      圖9 注入成功時(shí)的SQL 語(yǔ)法樹

      SQLParse2解析的結(jié)果,在未經(jīng)去隨機(jī)化處理時(shí)的結(jié)構(gòu)如圖10 所示。在變體E2中,攻擊者注入的“or123”不符合其變化方法,因此注入攻擊失敗。同理,在變體E3中,注入攻擊也失敗。

      變體E1、E2、E3中的SQL 經(jīng)去隨機(jī)化處理后由數(shù)據(jù)庫(kù)執(zhí)行,變體E2和變體E3的執(zhí)行結(jié)果一致,且不同于注入成功的變體E1的執(zhí)行結(jié)果。

      3.3 SQL 表決方法設(shè)計(jì)

      表決作為多變體執(zhí)行架構(gòu)中的關(guān)鍵技術(shù),決定著多變體系統(tǒng)能否發(fā)現(xiàn)異常。在多變體系統(tǒng)中,表決點(diǎn)要么設(shè)置在變體執(zhí)行前對(duì)輸入進(jìn)行表決,要么設(shè)置在變體執(zhí)行后對(duì)輸出進(jìn)行表決??紤]到數(shù)據(jù)庫(kù)服務(wù)中數(shù)據(jù)讀、寫操作的不同影響,SQLMVED 系統(tǒng)針對(duì)數(shù)據(jù)的讀、寫操作采取的處理方式也不同。

      圖10 注入失敗時(shí)的SQL 語(yǔ)法樹

      讀操作。數(shù)據(jù)的讀操作不會(huì)引起數(shù)據(jù)的變化,讀操作的表決點(diǎn)設(shè)置在用戶請(qǐng)求代理處,用戶請(qǐng)求代理對(duì)變體返回用戶的輸出進(jìn)行表決,充分利用協(xié)議代理功能,保證參與一次表決的變體返回結(jié)果的同源性。

      寫操作。數(shù)據(jù)的寫操作必然使數(shù)據(jù)產(chǎn)生變化,若表決點(diǎn)繼續(xù)設(shè)置在用戶請(qǐng)求代理處,當(dāng)其發(fā)現(xiàn)不一致時(shí)還需要對(duì)數(shù)據(jù)進(jìn)行還原操作,增加了系統(tǒng)的復(fù)雜度。因此,寫操作的表決點(diǎn)設(shè)置在數(shù)據(jù)庫(kù)代理處,表決器對(duì)經(jīng)過隨機(jī)化語(yǔ)法解析器去隨機(jī)化的語(yǔ)句進(jìn)行表決,只有通過表決的寫操作語(yǔ)句才會(huì)由數(shù)據(jù)庫(kù)執(zhí)行。

      結(jié)合3.2 節(jié)的SQLMVED 系統(tǒng)設(shè)計(jì),系統(tǒng)處理用戶請(qǐng)求的流程如圖11 所示。

      1) 用戶請(qǐng)求代理表決算法

      用戶請(qǐng)求代理將請(qǐng)求復(fù)制,轉(zhuǎn)發(fā)至冗余多變體執(zhí)行并獲取響應(yīng)結(jié)果,對(duì)HTTP 響應(yīng)數(shù)據(jù)結(jié)構(gòu)的響應(yīng)體[27]進(jìn)行表決,用戶請(qǐng)求代理表決算法描述如算法1 所示,若存在多數(shù)一致的響應(yīng),則將其中的響應(yīng)結(jié)果返回至用戶;若無法通過表決,則拒絕響應(yīng),返回錯(cuò)誤狀態(tài)碼。

      圖11 SQLMVED 系統(tǒng)流程

      算法1用戶請(qǐng)求代理表決算法

      2) 寫操作表決方法

      數(shù)據(jù)庫(kù)代理負(fù)責(zé)將冗余的寫操作合并成一次請(qǐng)求轉(zhuǎn)發(fā)至數(shù)據(jù)庫(kù)執(zhí)行,因此無法以用戶請(qǐng)求代理的方式處理。為保證參與表決的SQL 是由同一請(qǐng)求復(fù)制分發(fā)而來的,算法1 中的步驟4)~步驟6)采用唯一性標(biāo)識(shí)碼和時(shí)間戳在請(qǐng)求的頭部對(duì)請(qǐng)求進(jìn)行標(biāo)記。在此基礎(chǔ)上,通過修改應(yīng)用程序源代碼,將算法1 中的標(biāo)記信息傳遞至應(yīng)用程序的SQL 中,使數(shù)據(jù)庫(kù)代理通過該標(biāo)識(shí)能夠識(shí)別不同變體的同一用戶請(qǐng)求。如示例程序1 所示,應(yīng)用程序獲取請(qǐng)求頭部中的標(biāo)記信息,之后通過變量將其以注釋的形式拼接至SQL 中。

      示例程序1修改登錄用戶密碼

      數(shù)據(jù)庫(kù)代理的表決器配置高速緩存,變體的SQL臨時(shí)存儲(chǔ)在緩存中,并設(shè)置超時(shí)時(shí)間,當(dāng)未達(dá)到超時(shí)時(shí)間,若緩存中存在一致的3 條語(yǔ)句,則消除緩存記錄,轉(zhuǎn)發(fā)至數(shù)據(jù)庫(kù)執(zhí)行一次;當(dāng)達(dá)到超時(shí)時(shí)間,則直接消除緩存記錄,不予轉(zhuǎn)發(fā)至數(shù)據(jù)庫(kù)執(zhí)行,返回空數(shù)據(jù)至多變體。多變體在得到數(shù)據(jù)庫(kù)代理返回的數(shù)據(jù)后,返回響應(yīng)結(jié)果至用戶請(qǐng)求代理,此時(shí)用戶請(qǐng)求代理表決器再次對(duì)結(jié)果進(jìn)行表決,由于寫操作的請(qǐng)求已經(jīng)在數(shù)據(jù)庫(kù)代理處完成表決,因此多變體的響應(yīng)結(jié)果在用戶請(qǐng)求代理處表決是一致的。

      3.4 安全性評(píng)估

      根據(jù)SQLMVED 系統(tǒng)的設(shè)計(jì)方法,在對(duì)其進(jìn)行安全性評(píng)估時(shí),需要滿足以下幾個(gè)條件。1) 多變體E1、E2、E3同時(shí)處理請(qǐng)求,都具有獨(dú)立執(zhí)行SQL的能力;2) 多變體E1、E2、E3在不遭受SQLIA 時(shí),均能夠正確地處理SQL;3) 多變體E1、E2、E3任意之間不存在協(xié)同或協(xié)作的聯(lián)系,假設(shè)用戶請(qǐng)求代理和數(shù)據(jù)庫(kù)代理的設(shè)計(jì)實(shí)現(xiàn)中沒有漏洞或后門,攻擊者無法以此為跳板協(xié)同多變體;4) 假設(shè)表決算法的設(shè)計(jì)實(shí)現(xiàn)中也不存在漏洞或后門,由此做出以下形式化推論。

      圖12 IEO 模型

      Ei使用的隨機(jī)化方法集合Vi中隨機(jī)化方法個(gè)數(shù)記為card(Vi),,且card(ω)≤card(Vi),τ為集合ω中的元素。假設(shè)對(duì)于任意一個(gè)變體Ei∈E,采用隨機(jī)化方法集合Vi中每個(gè)方法元素的概率是相等的。根據(jù)式(1)可得出,SQLMVED 系統(tǒng)在某種隨機(jī)化設(shè)計(jì)下被注入成功的概率為

      由此可見,SQLMVED 系統(tǒng)的防御能力取決于變體之間隨機(jī)化方法的差異性,由于key1、key2、key3之間互不相同,因此變體之間不存在任何相互一致的隨機(jī)化方法,也就是card(ω)=0,因此攻擊者無法有效實(shí)施SQLIA。

      4 實(shí)驗(yàn)與分析

      為驗(yàn)證本文設(shè)計(jì)的SQLMVED 系統(tǒng)的有效性,本節(jié)主要從防御有效性測(cè)試和性能測(cè)試對(duì)其進(jìn)行實(shí)驗(yàn)與分析。

      4.1 防御有效性測(cè)試

      防御有效性測(cè)試中,采用VMware Workstation虛擬化環(huán)境搭建實(shí)驗(yàn)平臺(tái),普通未防護(hù)的環(huán)境為L(zhǎng)AMP(Linux、Apache、MySQL、PHP)架構(gòu),施加防護(hù)的環(huán)境為本文提出的SQLMVED 架構(gòu),用戶請(qǐng)求代理、變體(E1、E2、E3)、數(shù)據(jù)庫(kù)代理、數(shù)據(jù)庫(kù)均采用虛擬機(jī)(VM,virtual machine)進(jìn)行部署,具體配置如表2 所示。

      表2 防御有效性測(cè)試環(huán)境

      選取bWAPP、DVWA、SQLI-LABS 這3 種靶機(jī)應(yīng)用程序中未實(shí)施安全防護(hù)策略的部分,采用sqlmap 工具與人工構(gòu)造注入結(jié)合的方式分別對(duì)部署在LAMP 和SQLMVED 架構(gòu)環(huán)境中的以上3 種靶機(jī)應(yīng)用程序進(jìn)行測(cè)試,測(cè)試結(jié)果如表3 所示。LAMP 架構(gòu)環(huán)境對(duì)3 種靶機(jī)應(yīng)用程序的全部40 個(gè)注入點(diǎn)沒有任何防御能力,而SQLMVED 架構(gòu)環(huán)境能夠有效防御針對(duì)其中36 個(gè)注入點(diǎn)的攻擊。其中bWAPP 2.2 中SQLite、Stored SQLite、Blind SQLite 注入點(diǎn)無法防御是因?yàn)镾QLMVED 基于MySQL 數(shù)據(jù)庫(kù)設(shè)計(jì),暫且無法應(yīng)用于其他類型數(shù)據(jù)庫(kù);Drupal 屬于應(yīng)用框架,目前SQLMVED 還未適用所有框架,因此無法有效防御此注入點(diǎn)。實(shí)驗(yàn)表明,SQLMVED 架構(gòu)能夠有效防御針對(duì)以上3 種靶機(jī)應(yīng)用程序的大部分SQLIA。

      表3 防御有效性測(cè)試環(huán)境

      4.2 性能測(cè)試

      SQLMVED 架構(gòu)環(huán)境在變體E1、E2、E3中部署具有數(shù)據(jù)讀寫操作的測(cè)試頁(yè)面,讀寫測(cè)試語(yǔ)句如表4 所示,在LAMP 架構(gòu)環(huán)境中也部署同樣的測(cè)試頁(yè)面。

      表4 讀寫測(cè)試語(yǔ)句

      為減小虛擬化的實(shí)驗(yàn)環(huán)境對(duì)測(cè)試結(jié)果的影響,以及主要體現(xiàn)讀寫過程的性能損耗,測(cè)試方法采用在連續(xù)的100 次訪問中分別記錄測(cè)試頁(yè)面的響應(yīng)時(shí)間。

      讀數(shù)據(jù)測(cè)試結(jié)果匯總?cè)鐖D13 和圖14 所示,SQLMVED 的平均響應(yīng)時(shí)間為47.48 ms,LAMP 的平均響應(yīng)時(shí)間為23.88 ms。SQLMVED 架構(gòu)相較于LAMP 架構(gòu),平均響應(yīng)時(shí)間增加約一倍,大部分響應(yīng)時(shí)間控制在60 ms 以內(nèi),性能損耗可以接受。

      圖13 SQLMVED 讀數(shù)據(jù)測(cè)試結(jié)果

      寫數(shù)據(jù)測(cè)試結(jié)果匯總?cè)鐖D15 和圖16 所示,SQLMVED 平均響應(yīng)時(shí)間為4 870.63 ms,LAMP 的平均響應(yīng)時(shí)間為20.6 ms。SQLMVED 的寫操作產(chǎn)生了較嚴(yán)重的性能損耗,這是由于SQLMVED 中寫數(shù)據(jù)的過程比讀數(shù)據(jù)更復(fù)雜。但是,通過防御有效性測(cè)試可以發(fā)現(xiàn),SQLIA 通常發(fā)生在讀數(shù)據(jù)過程中,因此,若為減小性能損耗,即使只將讀數(shù)據(jù)采用多變體執(zhí)行的方法設(shè)計(jì),也能夠防御大部分SQLIA。

      圖14 LAMP 讀數(shù)據(jù)測(cè)試結(jié)果

      圖15 SQLMVED 寫數(shù)據(jù)測(cè)試結(jié)果

      圖16 LAMP 寫數(shù)據(jù)測(cè)試結(jié)果

      此外,SQLMVED 原型系統(tǒng)在設(shè)計(jì)實(shí)現(xiàn)中可能存在缺陷,包括防御有效性測(cè)試中發(fā)現(xiàn)的不足,SQLMVED 的局限性將在第5 節(jié)進(jìn)行分析總結(jié)。

      5 局限性分析

      SQLMVED 原型系統(tǒng)的局限性主要體現(xiàn)在以下2 個(gè)方面。

      1) 首先,SQLMVED 的多變體中需要對(duì)應(yīng)用程序的SQL 進(jìn)行隨機(jī)化變化,而SQL 具有跨代碼段、跨函數(shù)、跨文件等多種拼接方式,如何準(zhǔn)確地識(shí)別應(yīng)用程序中的SQL 并進(jìn)行隨機(jī)化變化,可能需要對(duì)程序分析技術(shù)進(jìn)行深入研究。其次,本文使用的隨機(jī)化方法不支持Hibernate、Mybatis 等開發(fā)框架,因此SQLMVED 的適用范圍局限于使用原生SQL開發(fā)的應(yīng)用程序。

      應(yīng)用程序以網(wǎng)站為例,根據(jù)W3Techs 對(duì)Alexa排名前100 萬網(wǎng)站的類型統(tǒng)計(jì)結(jié)果來看,使用原生SQL 開發(fā)為主的PHP 網(wǎng)站數(shù)量占比達(dá)到了79%,說明SQLMVED 雖然不能適用于所有的應(yīng)用程序,但也具備可觀的應(yīng)用前景。

      2) 本文在數(shù)據(jù)庫(kù)代理處采用高速緩存解決數(shù)據(jù)庫(kù)讀操作的表決問題。但在高并發(fā)數(shù)據(jù)流的背景下,若把所有請(qǐng)求語(yǔ)句都保存在緩存中進(jìn)行表決處理,將會(huì)大大增加表決過程對(duì)存儲(chǔ)空間的消耗,本節(jié)基于Bloom filter[28]提出SQLMVED 的改進(jìn)思路。

      Bloom filter 是一種存儲(chǔ)空間高效的散列結(jié)構(gòu),被廣泛應(yīng)用在P2P 網(wǎng)絡(luò)寫作、網(wǎng)絡(luò)緩存以及網(wǎng)絡(luò)測(cè)量等領(lǐng)域。Bloom filter 可以對(duì)待表決的語(yǔ)句集合采用位串表示,利用數(shù)據(jù)流冗余消除方式對(duì)語(yǔ)句進(jìn)行表決,當(dāng)判定某請(qǐng)求語(yǔ)句是冗余重復(fù)的數(shù)據(jù),就認(rèn)為該語(yǔ)句為3 冗余多變體中的多數(shù)一致語(yǔ)句,由數(shù)據(jù)庫(kù)代理轉(zhuǎn)發(fā)至數(shù)據(jù)庫(kù)執(zhí)行,否則丟棄該語(yǔ)句。數(shù)據(jù)流冗余消除算法設(shè)計(jì)的關(guān)鍵問題是需要實(shí)時(shí)刪除達(dá)到最大計(jì)數(shù)值的過期元素,主要算法可以分為3 類,分別是基準(zhǔn)窗口模式、滑動(dòng)窗口模式、跳躍窗口模式,需要采用何種方式還需要進(jìn)一步研究。

      6 結(jié)束語(yǔ)

      本文在研究了現(xiàn)有多變體執(zhí)行技術(shù)和SQL 注入防御方法的基礎(chǔ)上,結(jié)合兩者的技術(shù)思路,提出了一種基于多變體執(zhí)行的SQL 注入運(yùn)行時(shí)防御方法。首先為應(yīng)用程序在運(yùn)行時(shí)構(gòu)建多變體執(zhí)行架構(gòu);其次通過隨機(jī)化方法對(duì)應(yīng)用程序的SQL 進(jìn)行變化,保證變體間隨機(jī)化方法的異構(gòu)性;最后在用戶請(qǐng)求代理和數(shù)據(jù)庫(kù)代理處通過表決分別發(fā)現(xiàn)異常的數(shù)據(jù)讀操作結(jié)果和數(shù)據(jù)寫請(qǐng)求,使攻擊者即使在掌握了變體隨機(jī)化方法的情況下也無法實(shí)施有效的 SQLIA?;谠摲椒ㄔO(shè)計(jì)實(shí)現(xiàn)了原型系統(tǒng)SQLMVED,并通過形式化推論證明了SQLMVED的防御能力。性能測(cè)試結(jié)果顯示,由于該方法引入了請(qǐng)求的復(fù)制分發(fā)、語(yǔ)句解析、去隨機(jī)化、表決等處理過程,會(huì)降低程序性能,因此如何減小對(duì)性能的影響將是未來工作的重點(diǎn)之一。防御有效性測(cè)試雖然采用靶機(jī)應(yīng)用程序和自動(dòng)化注入工具構(gòu)造的都是已知漏洞攻擊,但是該方法也可以有效防御利用未知漏洞的SQLIA,只要攻擊者構(gòu)造的輸入數(shù)據(jù)中具有SQL 指令,就無法同時(shí)在多變體中正確執(zhí)行,進(jìn)而無法通過表決,防御利用未知漏洞的SQLIA。

      猜你喜歡
      變體攻擊者語(yǔ)句
      基于DDPG算法的變體飛行器自主變形決策
      基于微分博弈的追逃問題最優(yōu)策略設(shè)計(jì)
      重點(diǎn):語(yǔ)句銜接
      正面迎接批判
      愛你(2018年16期)2018-06-21 03:28:44
      精彩語(yǔ)句
      非仿射參數(shù)依賴LPV模型的變體飛行器H∞控制
      耀變體噴流高能電子譜的形成機(jī)制
      有限次重復(fù)博弈下的網(wǎng)絡(luò)攻擊行為研究
      中國(guó)傳統(tǒng)文學(xué)的換形變體——論“詩(shī)化小說”的興起與傳承
      如何搞定語(yǔ)句銜接題
      宁阳县| 宝坻区| 崇文区| 台东县| 涪陵区| 南溪县| 三都| 凭祥市| 牡丹江市| 南木林县| 勐海县| 南部县| 商水县| 无为县| 兖州市| 新乐市| 汕头市| 观塘区| 宁夏| 元江| 绥德县| 云南省| 乳山市| 东平县| 东乡| 康乐县| 若尔盖县| 崇仁县| 积石山| 财经| 陕西省| 茶陵县| 毕节市| 尤溪县| 万宁市| 陵川县| 临桂县| 无极县| 昌黎县| 忻州市| 泌阳县|