杜建新
(內蒙古師范大學,內蒙古 呼和浩特 010030)
當前,Web應用已經得到了廣泛應用,人們的網絡購物、社交交友等都離不開Web應用程序。但是由于Web應用開發門檻較低,開發人員技術水平參差不齊,很多開發人員缺少安全開發思維,開發的Web應用的安全防護能力較弱,存在SQL注入、跨站腳本攻擊等各種安全問題,攻擊者利用上述漏洞竊取企業和用戶信息、控制系統權限,嚴重威脅企業和用戶的信息安全。SQL注入攻擊以數據庫作為攻擊對象,通過偽造字符串實現在數據庫中盜取信息的目的,是一種典型的代碼注入式攻擊[1]。對攻擊者來說,SQL注入攻擊的原理相對簡單,且一旦攻擊成功就可以獲取較大的收益。因此,開展針對SQL注入攻擊檢測與防御技術的研究具有重要的研究價值和現實意義。
大部分Web應用程序在正常工作時都需要與后臺數據庫進行數據傳遞,而SQL是訪問數據庫服務器的標準語言。目前大多數的編程語言都可采用可編程方法與數據庫建立連接并傳遞數據。在實際使用Web應用時,通常需要將Web表單、cookie等數值傳遞給SQL進行查詢,如果系統在傳遞該數值前沒有對其進行驗證,那么可能導致出現SQL注入漏洞[2]。
對構建的動態SQL語句,需要將輸入傳遞進去,在傳遞前如果沒有對代碼進行驗證或編碼,那么攻擊者可將SQL語句當作輸入提供給應用,同時將SQL語句輸入給數據庫執行。在構造動態字符串的過程中,轉義字符處理不當、數據類型處理錯誤、查詢語句設計不合理、查詢錯誤、處理錯誤以及對多個查詢請求處理不當等均可能導致SQL注入攻擊的發生。圖1為SQL注入攻擊流程圖,首先傳遞動態參數網頁,對是否注入漏洞和數據庫類型進行判斷,得到確認后探測數據庫表名、列名和列值,然后擴張權限,實施攻擊。

圖1 SQL注入攻擊流程圖
數據庫的不安全配置也是導致SQL注入攻擊發生的重要因素之一。很多數據庫都有默認的預安裝內容,例如主流的數據庫SQL Server的系統管理員賬戶默認為“sa”;My SQL數據庫的默認賬戶為“root”等,其他數據庫也會采用同樣的方式設置默認賬戶,而且這些賬戶對應的口令通常是公開的。一旦攻擊者利用SQL注入漏洞和授權賬戶連接數據庫,即可利用內置賬戶的權限執行其他代碼。因此,開發人員在編碼時應當與數據庫管理人員協作,確保系統訪問數據庫時是在最低權限模型下運行,或根據系統的實際功能需要對登錄角色權限進行分離。
在線檢測主要包括關鍵詞檢測和SQL語句異常檢測,關鍵詞檢測在客戶端對用戶的數據進行檢測,SQL語句異常檢測在服務器端執行。在客戶端對用戶的輸入進行檢測時,主要實現對含有特定關鍵詞的輸入進行檢測和攔截,對檢測到的關鍵詞進行Error提示,并采取相應的措施。如果該輸入繞過了客戶端的關鍵詞檢測,則在服務器端對已經嵌套在SQL語句中的輸入進行SQL語句異常檢測;如果檢測到異常,則同樣提示Error錯誤并采取相應措施,對通過檢測的SQL語句就可以傳遞給數據庫服務器用于執行,服務器執行該語句后給出響應,同時在數據庫日志中進行記錄并將數據發送給離線檢測。
離線檢測的輸入是在線檢測部分發送來的數據庫日志文件和從網絡中直接過去的數據庫查詢語句。在采用文本處理方法對該SQL語句進行處理后,將其分成測試數據和訓練數據2個部分,對訓練數據采用多種機器學習模型進行訓練,得到較優的檢測模型,利用該模型對測試數據進行測試,實現離線條件下的SQL語句異常檢測。
目前,較為主流的SQL注入檢測方法是通過對用戶輸入的字符串或合成的SQL語句的合法性進行判別來確定是否存在SQL注入攻擊行為。在檢測字符串或SQL語句時,根據檢測方式的不同,現有方法大致可分為基于污點分析的檢測方法、基于文本向量化和機器學習的檢測方法以及基于規則匹配的檢測方法,下面分別對這3種方法進行介紹和分析。
基于污點分析的檢測方法是信息流分析技術的一種,該方法先對敏感數據進行標記,跟蹤標記數據在系統中的傳播情況,進而判定該行為是否為攻擊行為[3]。具體來說,先對用戶輸入的不可信數據或可信的常量字符串數據進行污點標記,在程序執行的過程中,跟蹤該標記數據的傳播情況,在將SQL語句傳遞給數據庫之前對其進行解析,分析污點信息,判斷是否存在SQL注入攻擊。圖2為基于污點分析的檢測模塊流程圖,先獲取一條指令,對安全函數進行參數解析,獲取規則匹配數據,判斷是否屬于污點攻擊行為。

圖2 基于污點分析的檢測模塊流程圖
在實際應用時,常見的方法主要包括利用積極污點標記方法標記常量字符串中的可信敏感字符,將污點信息以轉變編碼的方式存儲在字符串的編碼中,同時動態跟蹤其傳播情況,根據編碼值確定SQL語句中敏感字符的來源,對SQL注入攻擊行為進行防御。另一種常見的方法是標記外部輸入的動態污點分析檢測方法,該方法首先對用戶的輸入進行標記,解析根據輸入數據流動態構造的SQL語句,利用語法分析從中提取SQL語法數,利用污點檢測算法檢測其中的結點是否被污染,從而判定是否存在SQL注入行為。
目前較為常見的SQL語句向量化方法主要有基于查詢轉換的方法、基于改進查詢規范化的方法、基于Token圖的方法以及基于TFIDF文本向量化的方法等。其中基于查詢轉換的方法首先利用轉換函數將特殊字符、符號等轉換為詞的形式,然后利用詞來對SQL語句進行向量化標識。基于改進查詢規范化的方法根據SQL語句的特點,以空格為分隔符將其轉換為Token序列,然后根據Token與數字索引的關系,再將Token序列轉換為數值序列,最終用以數值組成的向量來標識SQL語句。基于Token圖的方法同樣以空格作為分隔符對SQL語句進行分割,在將其轉化為Token序列后,定義滑動窗口以Token圖向量來標識SQL語句。圖3為基于ITFIDF算法的SQL注入攻擊檢測模型示意圖,基于TFIDF文本向量化的方法巧妙地利用了TFIDF算法的2個指標,即詞頻和逆文檔頻率,對SQL語句中的敏感字符進行處理,計算敏感字符的TFIDF值,通過設計文本向量化方法將SQL語句數據集轉換為特征向量。

圖3 基于ITFIDF算法的SQL注入攻擊檢測模型示意圖
目前機器學習方法中用來檢測SQL注入攻擊的典型方法主要包括基于數據挖掘和SVM的方法、基于神經網絡的檢測方法以及基于馬爾科夫模型的方法等[4]。基于文本向量化和機器學習的檢測方法通過將SQL語句轉換為特征向量,可以較為準確地描述SQL語句的特征,利用機器學習對其進行分析并得出檢測模型,得到的規則比人為制定的規則更為實用,但是該方法的檢測效率依賴于特征向量的準確性和分類器的性能。
基于規則匹配的檢測方法的基本原理是設定一定的規則,通過檢測是否違反規則來判定是否存在攻擊行為。典型的方法包括基于正則表達式匹配的方法、基于語法樹特征匹配的方法和基于模式匹配的方法等[5]。
基于正則表達式匹配的方法利用構建的正則表達式對用戶的輸入進行匹配和過濾。基于語法樹特征匹配的方法首先構建SQL語句語法樹,然后通過與待檢測語句進行比對來檢測語句中是否存在SQL注入攻擊的可能。基于模式匹配的方法主要包括靜態階段和動態階段;在靜態階段主要利用正常的查詢語句構建合法模型;在動態階段執行查詢時,將查詢語句與構建的合法模型進行比對,從而發現其中可能存在的異常。
SQL注入攻擊防御方法大致可分為代碼層防御技術和平臺層防御技術,下面分別對這2種技術進行比較和分析。表1為幾種防御技術對比。

表1 幾種防御技術對比
3.1.1 基于預處理和參數化查詢的方法
該方法是指在程序中將參數化語句提前編譯好,當程序訪問數據庫使用動態SQL語句時,不是直接將用戶的輸入傳遞給SQL語句,而是利用編譯好的參數進行傳遞,從而降低發生SQL注入攻擊的概率。
3.1.2 基于輸入驗證的方法
該方法在用戶輸入時即對其輸入字段進行限制,如果數字、日期等具有固定格式的參數的數據類型已經確定,則對其范圍進行限定,此外,還可以利用黑名單和白名單的方法對用戶的輸入進行限定。
3.1.3 基于安全函數的方法
該方法采用安全函數來對用戶的輸入進行過濾和轉義,該安全函數既可以是系統自帶的,也可以是開發人員自定義的。該方法能夠提高攻擊者開展SQL注入攻擊的難度,進而降低被攻擊的風險。
與代碼層防御技術不同,平臺層防御技術主要在應用程序運行過程中發揮作用,該技術通過優化運行處理流程或優化系統配置等檢測防止出現SQL注入攻擊的情況[6]。目前平臺層防御可采取的措施如下。
3.2.1 維護數據和數據庫
安全地提高數據庫的安全性是防止SQL注入攻擊的有效措施。為盡可能提高數據庫的安全性,需要對未授權用戶的訪問進行限制,對已授權用戶的操作權限進行設定,同時在數據庫服務器上采取有效的安全加固措施,將用戶的操作限定在其權限內,不允許其訪問超出權限的數據資源,具體的措施例如隔離數據庫登錄、額外系統對象鎖定等。
3.2.2 服務器和網絡的安全配置
根據Apache、IIS等不同的服務器類型,有針對性地進行Web服務器安全配置。可以對網絡訪問控制進行安全配置,例如利用防火墻和路由器ACL網絡層等限制與其他系統的連接。此外,還可將數據庫服務器與Web服務器部署在不同的主機上,降低來自Web應用攻擊的概率,同時也不會將數據庫服務器暴露給攻擊者。平臺層防御在Web應用程序層對SQL注入攻擊進行抵御,但是如果注入漏洞較為復雜,防御的效率可能較低。
當前,開展針對SQL注入攻擊與檢測技術的研究具有重要的現實意義。該文詳細分析了SQL注入攻擊檢測和防御基本技術和方法,在SQL注入攻擊檢測與防御研究中,盡管研究者們取得了一系列研究成果,提出的方法在一定程度上降低了發生SQL注入攻擊的可能性,但是該方法的檢測性能還有較大的提升空間。同時,隨著攻擊方式的多樣化,還需要投入更多的人力物力開展針對SQL注入攻擊檢測與防御的相關研究。