天天看點

注入類漏洞檢測方法研究

作者:中國金融電腦

文丨國家開發銀行資訊科技部 董沛然

注入類漏洞是軟體漏洞中最為常見的一類,也是資訊安全領域的一個研究熱點。本文首先以SQL注入漏洞和指令注入漏洞為例,闡述注入類程式漏洞的原理、分類和危害,介紹注入類漏洞的起始點、爆發點、傳遞鍊等概念;其次從代碼安全掃描的角度分析傳統源代碼掃描方法的弊端和局限性,提出複合掃描引擎的概念,并詳細闡述其原理和優勢,針對不同引擎漏洞庫之間差異大的問題,從注入類漏洞的特點出發設計解決算法;最後對未來研究可能面臨的挑戰進行展望。

一、注入類漏洞的原理

所謂注入類漏洞,是指軟體不加識别地運作了惡意使用者(也稱“黑客”)精心設計的輸入内容,導緻系統運作錯誤,或洩露客戶資訊的一種漏洞。這類漏洞主要是由系統對使用者輸入的盲目信任引發的。

注入類漏洞主要包括:SQL注入、指令注入、XSS注入、XML注入、XPATH等類型。下面以最典型的SQL注入和指令注入為例,列舉兩個注入類漏洞案例,并分析說明其原理。

1.SQL注入漏洞

SQL注入漏洞,簡單地說就是利用程式代碼漏洞,繞過程式的權限,将SQL指令插入使用者請求的查詢字元串或者輸入域進行攻擊,其結果輕則獲得敏感資訊和資料,重則能夠控制伺服器。

SQL注入漏洞的利用方式有直接注入和二次注入兩種,前者是直接将代碼插入使用者輸入變量中,該變量與SQL指令串聯在一起,故稱之為直接注入;後者是将惡意代碼注入字元串中,該字元串存儲于資料庫表中,待程式讀取該庫表字元串的值時,被連接配接成動态SQL指令并執行惡意SQL。

下面是一個直接注入SQL漏洞的例子。以下代碼動态地構造并執行了一個SQL查詢,該查詢可以搜尋與指定客戶名稱相比對的交易記錄。

假設有如下C語言代碼段:

Receive_Input(&szCUSTOM_NAME);//接收使用者輸入的查詢條件——注入點

sprintf(szSQL,

sizeof(szSQL),

"select*

fromTABLE_TRANSACTION

whereCUSTOM_NAME='%s';",

szCUSTOM_NAME);//拼接SQL語句

Execute(szSQL);//執行SQL語句——爆發點

上述代碼的邏輯是:接收使用者在界面輸入的姓名,将其作為查詢條件拼接到SQL語句中,再在資料庫中完成查詢操作。

正常情況下,當使用者輸入客戶名稱“David”時,拼接成的SQL語句為:

select*fromTABLE_TRANSACTIONwhere

CUSTOM_NAME='David';

此時程式将産生正确的輸出。

但是當這段代碼被黑客攻擊時,如果黑客輸入的内容為:

';select*fromTABLE_TRANSACTIONwhere'1'='1

那麼拼接成的SQL語句将變為:

select*

fromTABLE_TRANSACTION

whereCUSTOM_NAME='';

select*

fromTABLE_TRANSACTION

where'1'='1';

這樣一來,将會有兩條SQL語句被執行,雖然前一條SQL語句是安全的,但後一條卻可以查詢出庫表中的所有記錄,進而導緻嚴重的資訊洩露。

在這個例子中,程式從使用者輸入資訊中擷取了szCUSTOM_NAME字段,在未經過濾的情況下,将其值直接以字元串拼接的方式拼接到一個SQL語句中,造成了SQL注入漏洞。

在這段程式中,直接從使用者輸入内容擷取資訊的代碼行Receive_Input(&szCUSTOM_NAME)稱為這個SQL注入漏洞的注入點。執行危險SQL語句的代碼行Execute(szSQL)稱為這個SQL注入漏洞的爆發點。從注入點到爆發點之間,所有涉及危險字元串szCUSTOM_NAME資訊指派的語句,稱為這個SQL注入漏洞的傳遞鍊。

2.指令注入漏洞

指令注入漏洞是指通過送出惡意構造的參數破壞指令語句的結構,達到非法執行指令的目的。指令注入漏洞常發生在有執行系統指令的Web應用中。

下面舉一個指令注入漏洞的例子。以下代碼在伺服器上動态地為使用者建立專用目錄,路徑名是使用者輸入的客戶名稱。

假設有如下PHP語言代碼段:

$customName=$POST["customName"];//接收使用者輸入——注入

$command="mkdir/home/application/custom_Directory/".$customName;//拼接指令

system($command);//執行危險指令——爆發點

其功能是接收使用者輸入的客戶名稱,然後在背景建立該客戶專屬的檔案路徑。

正常情況下,當使用者輸入客戶名稱“David”時,執行指令:

mkdir/home/application/custom_Directory/David

但是當被黑客攻擊時,如果黑客輸入的内容不是客戶名稱,而是如下字元串:

;rm-rf/

那麼拼接而成的指令變為:

mkdir/home/application/custom_Directory;rm-rf/

運作後将删除背景所有檔案。

如此看來上述代碼存在很大風險。

在本例中,同樣涉及注入點、爆發點、資料流的概念。從使用者輸入資訊擷取customName的代碼行$customName=$_POST["customName"]稱為這個指令注入漏洞的注入點。執行這個危險指令的代碼行system($command)稱為這個指令注入漏洞的爆發點。從注入點到爆發點之間,所有涉及危險字元串customName資訊指派的語句,稱為這個指令注入漏洞的傳遞鍊。

從以上兩個例子可以看出,注入類漏洞的本質是黑客通過引号、分号、斜杠、點号等特殊字元,閉合了原有的程式邏輯,使得使用者送出的參數和程式本來的邏輯互相幹擾。這樣一來,黑客送出的參數就不僅起到參數的作用,而且還進入程式邏輯中。黑客就是通過這樣的方式,把惡意代碼嵌入正常代碼中。

3.漏洞分級

根據注入類漏洞的可利用性和危害性,目前業界一般将其分為以下三類。

(1)高危漏洞

指可以直接被利用的漏洞,并且利用難度較低。這類漏洞被利用後可能對網站或伺服器的正常運作造成嚴重影響,對使用者财産及個人資訊造成重大損失。

(2)中危漏洞

指利用難度極高或需要滿足嚴格要求才能實作攻擊的漏洞,或漏洞本身無法被直接攻擊,但能為進一步攻擊起較大幫助作用的漏洞。

(3)低危漏洞

指無法直接實作攻擊,但可能造成一些非重要資訊洩露的漏洞,洩露的資訊可能讓攻擊者更容易找到其他安全漏洞。

二、傳統的源代碼掃描方法及弊端

IT技術日新月異,各種新型開發技術中的注入類漏洞也随之發生變化,漏洞攻擊的領域已經由傳統的網絡和系統層面上升到了應用層面,近期,越來越多的應用系統面臨此類攻擊威脅。為減少應用系統的風險隐患,避免軟體代碼編寫中可能出現的安全漏洞,提高應用系統自身安全防護能力,軟體開發者越來越依賴安全掃描工具去幫助快速查找、定位、修複和管理軟體代碼安全問題。源代碼安全掃描的主要價值在于能快速、準确地查找、定位代碼中存在的安全風險,進而提高軟體産品的安全性和可靠性。

目前,源代碼安全掃描主要包括抽象文法樹(AST)掃描、正則比對掃描、資料流路徑掃描三種。市場上的源代碼掃描工具多達數十種,主流的包括RIPS、VCG、FortifySCA等。源代碼掃描的原理和工具不是本文的重點讨論内容,但可以明确的是,每種掃描原理和工具都有自己的側重點,也都存在一定的誤報率和漏報率,是以僅使用一種掃描工具難以保證檢查結果的準确性和完整性。

此外,由于目前市場上的軟體應用系統規模日益龐大,源代碼安全掃描的工作量持續增加、複雜度不斷提高,通過手工執行掃描操作過程繁瑣、效率低下,非常不利于軟體品質管理,是以迫切需要提高代碼掃描的自動化程度,減少手工操作步驟,提高工作效率。

三、注入類漏洞的檢測方法

1.複合掃描引擎

為了解決上述問題,可将多種不同掃描工具內建起來對同一份代碼進行掃描,即複合掃描引擎。這樣做有兩個好處:一是提高檢查結果的品質。通過整合多個引擎的分析結果,實作互相驗證,提升缺陷檢出結果的準确性和完整性。二是提高工作效率。将不同的掃描工具實作內建,相比于先後操作多種工具,并對多份結果進行人工篩查,可以規避很多繁瑣的操作,進而提升工作效率。通過複合掃描引擎系統進行源代碼掃描的總體方案如圖1所示。

注入類漏洞檢測方法研究

圖1 通過複合掃描引擎系統進行源代碼掃描的總體方案

2.內建方法

搭建複合掃描引擎系統需要将多個單獨的掃描工具內建起來,具體分為三個方面:一是将多個掃描工具的界面進行內建,實作統一排程界面、自由選擇調起任一引擎發起掃描;二是漏洞庫的內建,需要将不同掃描工具的漏洞庫整合成統一的漏洞庫;三是将多個引擎的掃描結果合并,實作缺陷的內建審計,減少登入多個引擎分别檢視結果、分别排除誤報等工作的工作量。這三方面內建工作的主要方法如下。

(1)界面的內建

界面的內建本質上是開發一套界面來操作多個工具,主要涉及一些軟體工程、應用界面設計方面的工作,在此不作贅述。

(2)漏洞庫的內建

漏洞庫的內建主要靠人工的方式開展。在所有掃描工具中,掃描結果都會顯示漏洞類型和規則,是以每種工具涵蓋的漏洞庫都是公開、可讀的,并且每種工具能夠掃描出的漏洞種類數量有限。是以,軟體資訊安全的研究人員可将每種掃描工具的漏洞規則對應起來。例如,在不同掃描工具的漏洞庫中,SQL注入的漏洞命名通常是SQLInjection;指令注入漏洞在某些工具中被稱為CommandInjection,而在另一些工具中被稱為ResourceInjection。可由精通資訊安全的專業人員通過閱讀漏洞說明将這些漏洞規則對應起來,将其形成一個漏洞庫。

(3)掃描結果的內建

下面介紹一套可完成兩個掃描結果內建的算法。如前所述,每個注入類漏洞在代碼中均存在注入點、爆發點兩個代碼位置。對于甲、乙兩種掃描工具掃描出的結果——漏洞A、漏洞B,如果A和B在每種掃描工具上識别出的注入點、爆發點相同,且識别出的漏洞類型也相同(這個判斷依賴于漏洞庫的內建),那麼便可認定A和B為同一個漏洞,在內建結果中以一條漏洞結果顯示。

上述算法可用以下僞代碼描述:

擷取源代碼;

用工具甲掃描源代碼,得到掃描結果甲:result1;

用工具乙掃描源代碼,得到掃描結果乙:result2;

周遊掃描result1中的所有漏洞條目

{

擷取result1中,目前漏洞條目A;

周遊掃描result2中的所有漏洞條目

{

擷取result2中,目前漏洞條目B;

if(A.注入漏洞類型==B.注入漏洞類型

&&A.爆發點==B.爆發點

&&A.注入點==B.注入點)

then

将漏洞條目A寫入內建掃描結果:result_final

}

}

通過這種方式,所有內建掃描結果result_final中的漏洞條目,均為經過甲、乙兩種掃描工具确認的漏洞,進而大幅降低了誤報率。

對于隻被工具甲或乙中的一種工具掃描出來的漏洞,可以通過人工判讀的方式,識别其到底是否為确定性的漏洞,避免漏報漏洞。

四、總結與展望

本文通過兩個執行個體,介紹了注入類安全漏洞的原理、嚴重性和廣泛性,從安全測試的角度提出基于複合引擎的自動化代碼安全檢查系統的建構方法,并闡述了其優勢、原理和具體算法。

筆者認為,未來,防範軟體漏洞領域有七個研究方向:一是對軟體進行二進制代碼分析掃描;二是通過滲透測試發現漏洞;三是綜合利用白盒和黑盒技術進行漏洞分析;四是結合人工智能算法進行分析;五是對IaaS、雲平台等業界的新技術、新架構進行漏洞分析;六是對開源軟體進行漏洞分析;七是及時跟蹤CVE、CWE、OWASP等主流資訊安全組織釋出的漏洞庫。

本文來源于《中國金融電腦》2023年第1期

繼續閱讀