關(guān)于服務(wù)器軟件漏洞測試程序的設(shè)計與實現(xiàn)
網(wǎng)絡(luò)安全是當(dāng)前的熱門話題,互聯(lián)網(wǎng)安全性差的重要表現(xiàn)是服務(wù)器軟件大多存在漏洞,黑客的入侵行為大多是利用服務(wù)器漏洞實現(xiàn)的,F(xiàn)在,筆耕論文新浪博客,每天都有新的服務(wù)器軟件出現(xiàn),但這些軟件基本上都存在著漏洞,按照傳統(tǒng)的測試方法,依靠測試人員去分析代碼來完成測試,顯然是滿足不了需求的。網(wǎng)絡(luò)服務(wù)器軟件的漏洞測試是一個十分重要的問題,設(shè)計一個較為自動化、通用的漏洞測試工具是十分必要的。
一般漏洞研究方法是先熟悉軟件功能,分析服務(wù)協(xié)議,檢查程序代碼,然后再推測什么情況下會出現(xiàn)漏洞。這是一個工作量很大的過程,而且開發(fā)出來的測試程序也是針對特定軟件,不能通用。我們的測試軟件要做到通用,就要找出網(wǎng)絡(luò)服務(wù)器軟件的共同特性,采用易于配置,易于擴(kuò)展的結(jié)構(gòu)。
1.網(wǎng)絡(luò)服務(wù)的共性及漏洞產(chǎn)生原因
網(wǎng)絡(luò)服務(wù)基本上都是基于客戶機(jī)-服務(wù)器模型。
請求數(shù)據(jù)包
響應(yīng)數(shù)據(jù)報
圖1
客戶機(jī)發(fā)出請求數(shù)據(jù)包,服務(wù)器返回響應(yīng)數(shù)據(jù)包,即Request-Response方式。服務(wù)的共性就在于客戶機(jī)與服務(wù)器通過數(shù)據(jù)包進(jìn)行通信。每個服務(wù)都有自己的應(yīng)用層協(xié)議。服務(wù)器軟件的應(yīng)用層協(xié)議決定了服務(wù)器對請求數(shù)據(jù)包里的內(nèi)容怎么解釋,所以協(xié)議也就體現(xiàn)在數(shù)據(jù)包中。服務(wù)器軟件的漏洞一般是因為服務(wù)器對異常的請求數(shù)據(jù)包不能正確響應(yīng)。對于異常的請求數(shù)據(jù)包,像數(shù)據(jù)包里有太長的文件名或文件目錄路徑包含特殊字符等,如果服務(wù)器軟件不能正確處理,就可能導(dǎo)致緩沖區(qū)溢出、泄露服務(wù)器重要信息、拒絕服務(wù)等問題,使得入侵者有機(jī)可乘。如IIS服務(wù)器的UNICODE編碼漏洞,對于未打補丁的IIS服務(wù)器,如果入侵者輸入類似的請求,IIS服務(wù)器會將文件路徑中的%255c解釋為“/”,繞過系統(tǒng)安全策略,在服務(wù)器上執(zhí)行dir 命令,并將結(jié)果返回給客戶端。利用這種方法,可在服務(wù)器上執(zhí)行任何系統(tǒng)命令,能輕而易舉的控制整個服務(wù)器。我們的測試程序就是要能自動生成各種可能導(dǎo)致服務(wù)器不正常工作的請求數(shù)據(jù)包,并分析返回的響應(yīng)信息,找出漏洞所在。
2.測試程序的設(shè)計方案
為了通用,測試程序不能過多涉及到具體協(xié)議,而測試數(shù)據(jù)包的格式又要符合具體協(xié)議,這是一個矛盾。我們采用樣本包和動態(tài)鏈接庫的方法來解決這個矛盾。樣本包,即有代表性的數(shù)據(jù)包,依www服務(wù)為例,請求數(shù)據(jù)包“GET /pub/index.htm HTTP/1.1”可以很好的代表一類請求,就可以作為一個樣本包。如果只對這個樣本包中的某個數(shù)據(jù)域進(jìn)行變換,則生成數(shù)據(jù)包的格式一般也是滿足www服務(wù)通信協(xié)議的。對于一個具體服務(wù),它的協(xié)議體現(xiàn)在通信所用的數(shù)據(jù)包中,我們可以收集一個足以體現(xiàn)該服務(wù)協(xié)議的樣本包集,采用一個腳本來描述這些樣本包,要測試不同的服務(wù)軟件,只須編寫與之對應(yīng)的腳本即可。測試程序只對腳本進(jìn)行處理,不必與具體協(xié)議相關(guān),也就實現(xiàn)了通用性。整個測試程序的系統(tǒng)框圖如圖2所示,測試數(shù)據(jù)包生成模塊處理腳本,生成測試數(shù)據(jù)包,發(fā)送給服務(wù)器;響應(yīng)信息分析模塊分析返回信息,并將分析結(jié)果保存在記錄文件中。
腳本
記錄文件
圖2
2.1腳本
腳本是對樣本包集的描述,服務(wù)器軟件的協(xié)議體現(xiàn)在腳本中。測試數(shù)據(jù)包就是對樣本包的某個域進(jìn)行變換后得到的數(shù)據(jù)包。
為了便于程序處理,定義了幾個關(guān)鍵字:
SAMPS , 樣本包開始;ITEM , 數(shù)據(jù)項; SAMPE ,樣本包結(jié)束; RESULT ,返回結(jié)果特征串;
“ ; ”,注釋,如果一行以 “;” 打頭,則這一行是注釋行。
腳本中依次列出各個樣本包,每個樣本包分成幾個數(shù)據(jù)域,每個數(shù)據(jù)域用一個數(shù)據(jù)項來表示。
GET /pub/index.htm HTTP/1.1的腳本描述為:
SAMPS
ITEM COMM GET
ITEM PATH /pub/
ITEM FILE index.htm
ITEM VER HTTP/1.1
RESULT …
SAMPE
每個數(shù)據(jù)項由三部分組成,以第一個數(shù)據(jù)項ITEMS COMMI GET 為例: ITEMS,關(guān)鍵字,標(biāo)識數(shù)據(jù)項開始(每個數(shù)據(jù)項占一行,因此無須關(guān)鍵字標(biāo)識數(shù)據(jù)項結(jié)束);COMM:數(shù)據(jù)項類型名,數(shù)據(jù)項類型名決定了它的變換處理函數(shù);GET: 數(shù)據(jù)項的內(nèi)容。
2.2測試數(shù)據(jù)包生成模塊
測試數(shù)據(jù)包生成模塊是整個測試工具的關(guān)鍵所在,只有生成最可能導(dǎo)致服務(wù)器出問題的請求數(shù)據(jù)包,才能發(fā)現(xiàn)服務(wù)器軟件的漏洞所在。但又不能產(chǎn)生過多的數(shù)據(jù)包,使得測試效率太低。從統(tǒng)計測試的角度來說,就是要生成最可能導(dǎo)致服務(wù)器出錯的數(shù)據(jù)包的樣本集。
測試數(shù)據(jù)包生成模塊對腳本的處理過程為:從腳本中讀出一個樣本包,腳本處理函數(shù)構(gòu)造描述樣本包的鏈表,鏈表的結(jié)構(gòu)為:
typedef struct RULELIST
{
rulenode* rulelisthead;
rulenode* rulelistend;
}RULELIST;
樣本包中的每一項為鏈表中的一個節(jié)點rulenode;
結(jié)點rulenode的定義為
typedef struct _rulenod
{
char type[8]; //數(shù)據(jù)項類型名
char item[128]; //數(shù)據(jù)項內(nèi)容
_rulenode *nextnode; //指向下一個結(jié)點的指針
}rulenode;
構(gòu)造好鏈表后,對該樣本包里一個數(shù)據(jù)項的內(nèi)容進(jìn)行變換,而保持其它數(shù)據(jù)項不變,生成測試數(shù)據(jù)包,發(fā)送給服務(wù)器,分析返回信息,將測試結(jié)果寫入記錄文件,處理完該樣本包的所有數(shù)據(jù)項后,釋放鏈表,讀出下一樣本包,重復(fù)上面的處理過程,直至腳本結(jié)束。
模塊中對數(shù)據(jù)項內(nèi)容進(jìn)行變換的處理函數(shù)做成DLL動態(tài)鏈接庫,調(diào)用時根據(jù)數(shù)據(jù)項類型名進(jìn)行調(diào)用。這樣使得該測試程序易于擴(kuò)展,如果被測試軟件的數(shù)據(jù)包中有原測試程序未定義的數(shù)據(jù)項類型,只需在腳本中加入新的數(shù)據(jù)項類型, 同時將對應(yīng)的處理函數(shù)做成DLL動態(tài)鏈接庫的形式,拷貝至測試程序目錄下即可,而原有的程序一點也不必改動。
2.3響應(yīng)信息分析模塊
響應(yīng)信息分析模塊主要對返回信息進(jìn)行特征串搜索,記錄下服務(wù)器軟件出現(xiàn)異常時的情況。特征串定義在腳本中,特征串搜索采用Boyer-Moore字符串匹配算法.如果返回信息中有匹配的字符串,就意味著服務(wù)器可能出錯.例如,IIS 返回 “The remote procedure call failed ” ,就是RPC 服務(wù)出現(xiàn)錯誤。由于很多情況下返回信息很難預(yù)料,即便采用人工智能的方法也難判斷服務(wù)器到底出了什么問題。所以響應(yīng)信息分析模塊只是檢測異常,將異常記錄下來,進(jìn)一步的分析判斷還需要人工介入。
本文編號:6512
本文鏈接:http://www.wukwdryxk.cn/kejilunwen/jisuanjikexuelunwen/6512.html