1. 程式人生 > 資料庫 >基於機器學習的 SQL 注入漏洞挖掘技術的 分析與實現——論文研究學習

基於機器學習的 SQL 注入漏洞挖掘技術的 分析與實現——論文研究學習

論文研究學習

總體介紹和概括

這篇文章,首先從介紹SQL注入的背景入手,這裡點到了產生原因、影響、攻擊型別和傳統的漏洞注入技術。然後提出基於機器學習的 SQL 注入漏洞挖掘方法,這裡的指的是利用SVM來對資料集進行分類回收。最後用實驗證明該模型和提出相應的問題。

我認為本文的可取之處,在於對傳統SQL注入技術的總結,然後使用支援向量機機器學習演算法結合詞袋模型實現了SQL注入漏洞挖掘的自動化。這一點值得借鑑。

下面,我將對該論文的章節進行詳述。(這裡主要是用我自己的話,來闡述)

SQL注入的背景

為什麼會產生SQL注入

網站後臺通常使用使用者輸入資訊動態地構造SQL語句來與後端資料庫進行互動,在網站後臺沒有對使用者輸入進行合理的過濾而直接使用的情況下極易產生SQL注入漏洞。

(一句話,可能不嚴謹,就是沒有對使用者輸入的惡意程式碼,進行過濾)

SQL影響

SQL注入攻擊完全破壞了目標系統的機密性、完整性和可用性,其造成的損失隨資料庫中儲存資訊的重要性變化而變化。

更嚴重的問題是黑客可以把SQL注入攻擊作為跳板進行更深層次的攻擊活動

具體的影響請參照

攻擊型別

在這裡插入圖片描述
報錯資訊指的是這種攻擊方式是否需要利用查詢語句執行的錯誤資訊。基於報錯的注入攻擊需要將資料庫中的資訊伴隨錯誤資訊顯示出來,所以也依賴於報錯資訊。(如報錯注入)
直接顯示錶示這種攻擊方式從資料庫中獲得的資料是否直接顯示,還是需要進行推斷。(盲注)
多條記錄代表這種攻擊方式能夠同時獲得多條資料記錄。

傳統的漏洞注入技術

靜態分析指的是在不執行Web應用程式程式碼的前提下對其進行分析,主要藉助於抽象語法樹(AST)、控制流程圖(CFG)、呼叫流程圖(CG)等這類程式碼的中間表示中的一種或者幾種,結合程式碼切片等程式碼分析手段來進行模式匹配以發現應用中可能存在的安全漏洞。

(我的理解:就是對web應用程式進行程式碼審計,通過分析原始碼,來判斷是否是漏洞。)

動態分析技術首先需要為Web應用程式配置適當的程式碼執行環境,然後在Web應用程式成功執行的前提下通過除錯、Fuzzing、模擬攻擊等手段挖掘其中可能存在的安全問題。

(我的理解:就是直接對執行中的web應用程式,進行測試,發現漏洞。)
動靜結合的混雜分析:顧名思義,將上面的兩個結合。

傳統的注入技術的缺陷

在對眾多Web應用進行批量漏洞挖掘時,由於應用程式之間存在的差異性,其相應的可執行環境也存在一定的差異性,這種情況下為每一個專案搭建合適的執行環境是不切實際的,為此動態分析技術在實施過程中通常不盡人意。並且有資料顯示的實驗結果,也是很差的。
(我的理解:由於程式和相應環境的差異性,所以傳統的注入技術,缺乏普適性)

基於SVM的SQL注入漏洞挖掘技術

資料集處理

資料集:使用STIVALET等人提出的PHP程式碼測試樣例作為機器學習的原始資料集。此資料集中與SQL查詢有關的PHP程式碼測試樣例一共有 9552 個,其中8640 個不存在注入漏洞、912 個存在SQL注入漏洞。

資料集的不平衡問題:通過使用欠取樣,隨機選取兩倍於漏洞程式碼樣例數量的正常程式碼樣例。(什麼是)

最後得到的實際利用資料集:訓練資料集由 1824個正常樣例和912個漏洞樣例組成,共有2736個測試樣例。

資料的預處理:使用PHP中內建的token_get_all函式將PHP原始碼檔案標籤化,這些標籤代表了原始碼的一些關鍵字、符號以及程式碼結構。本文在標籤化過程中忽略了空格符以及註釋等不影響程式碼執行安全的資訊,並且將數字和字串轉化為了特定的標籤,如使用 T_CONSTANT_ENCAPSED_STRING 代表所有單雙引號內的字串。標籤化過程結束後本文利用詞袋模型將上述的標籤化後的原始碼檔案進行向量化,演算法粒度為單個的原始碼檔案。

模型選擇

為什麼使用SVM:基於VC維數和結構風險最小化原理的統計學習方法,根據有限樣本資訊在模型的複雜性和學習能力之間尋找最佳折衷,從而獲得最優的泛化能力。
該方法的數學意義是最終解決了與向量維無關的凸二次規劃問題,其物理本質是通過在超平面中建立決策面,使得正樣本與負樣本之間的隔離邊界最大化。
綜合考慮經驗風險和置信區間,使分類器不僅具有良好的分類效能,而且具有更好的擴充套件性。

模型的建立

  1. 假定樣本線性可分
    給定一個訓練樣本(Xi,Yi),其中i=1, 2,…, n, xi∈Rd, yi∈{+1, -1},這裡yi是樣本xi對應的標籤,d代表向量空間的維度也就是訓練時所選擇的特徵向量中屬性的數量。最優的劃分平面需滿足下式:
    在這裡插入圖片描述
    在這裡插入圖片描述

  2. 樣本非線性
    引入核函式,核函式的作用就是將低維空間中線性不可分的x對映到高維空間,在高維空間內那些二維空間中的線性不可分問題往往會變為線性可分。
    這裡選用的是高斯核函式,(我認為可以嘗試用其他的核函式來測試比較一下)
    在這裡插入圖片描述
    用分層交叉驗證來評估該模型,並結合了精確度、召回率、F1-score。

在這裡插入圖片描述
上面是使用機器學習挖掘SQL注入漏洞的流程。
(詞袋,就是把一個字串,轉換成獨立的詞,用來儲存)

實驗驗證及問題

首先通過詞袋模型將每一個PHP測試樣例檔案轉化為一個98維的向量作為最終的訓練資料,通過網格搜尋(Grid Search)演算法確定最優引數C=50, λ = 0.005,
模擬結果。
在這裡插入圖片描述
在針對上述訓練集時漏洞程式碼的預測精確度達到了81%且召回率達到了95%,良性程式碼的預測精度達到了98%且召回率達到了91%。模型驗證成功。

問題

  1. 資料集的方面
    一方面是一個高質量的資料集難以獲取,需要我們從很多個開源的PHP原始碼中對漏洞資訊進行分析、跟蹤、定位,難度極大;另一方面,機器學習所需要的資料集都是十分龐大的,而一個Web程式是難以滿足資料集的漏洞數量,這便要求我們從多個版本的web來下手。
    有效措施:通過組合預先收集到的輸入、過濾以及危險函式這3個模組中的樣本資料,來自動生成一個漏洞的樣本,新增一些迴圈、判斷和函式等複雜結構,讓我們自動生成的資料集更加貼近實際。
  2. 專案方面
    對於沒有歷史版本的Web程式,我們沒有相應的漏洞程式碼作為樣本,用於訓練;對於有歷史版本,但是漏洞數量很少且分散的Web程式,我們也不能訓練出優秀的資料模型;
    對於不同 的web程式,由於編寫者的習慣,使用的框架等不同,導致其各自漏洞分佈也不同,為此某個應用程式的漏洞程式碼並不能作為另一個應用程式的機器學習的訓練樣本。
    有效措施:使用遷移學習,增加我們的資料集和最後模型的泛化能力。