大部分的溢出攻擊是由于不良的編程習(xí)慣造成。現(xiàn)在常用的C和C++語(yǔ)言因?yàn)閷捤傻某绦蛘Z(yǔ)法限制而被廣泛使用,它們?cè)跔I(yíng)造了一個(gè)靈活高效的編程環(huán)境的同時(shí),也在代碼中潛伏了很大的風(fēng)險(xiǎn)隱患。
為避免溢出漏洞的出現(xiàn),在編寫程序的同時(shí)就需要將安全因素考慮在內(nèi),軟件開(kāi)發(fā)過(guò)程中可利用多種防范策略,如編寫正確的代碼,改進(jìn)C語(yǔ)言函數(shù)庫(kù),數(shù)組邊界檢查,使堆棧向高地址方向增長(zhǎng),程序指針完整性檢查等,以及利用保護(hù)軟件的保護(hù)策略,如StackGuard對(duì)付惡意代碼等,來(lái)進(jìn)行保證程序的安全性。
目前有幾種基本的方法保護(hù)緩沖區(qū)免受溢出的攻擊和影響:
①規(guī)范代碼寫法,加強(qiáng)程序驗(yàn)證。
②通過(guò)操作系統(tǒng)使得緩沖區(qū)不可執(zhí)行,從而阻止攻擊者植入攻擊代碼。
③利用編譯器的邊界檢查來(lái)實(shí)現(xiàn)緩沖區(qū)的保護(hù)。
④在程序指針失效前進(jìn)行完整性檢查。
IIS應(yīng)用軟件系統(tǒng)的安全性
IIS4.0和5.0版本曾經(jīng)出現(xiàn)過(guò)嚴(yán)重的緩沖區(qū)溢出漏洞,在上面介紹了軟件系統(tǒng)攻擊技術(shù)和防范技術(shù)后,從IIS的安全性入手,簡(jiǎn)要介紹應(yīng)用軟件的安全性防范措施。
IIS是Windows系統(tǒng)中的Internet信息和應(yīng)用程序服務(wù)器,利用IIS可以配置Windows平臺(tái)方便地提供并且和 Windows系統(tǒng)管理功能完美融合在一起,使系統(tǒng)管理人員獲得和Windows完全一致的管理。
為有效防范針對(duì)IIS的溢出漏洞攻擊,首先需要對(duì)IIS了解其緩沖區(qū)溢出漏洞所在之處,然后進(jìn)行修補(bǔ)。IIS4.0和IIS5.0的應(yīng)用非常廣,但由于這兩個(gè)版本的IIS存在很多安全漏洞,它的使用也帶來(lái)了很多安全隱患。
IIS常見(jiàn)漏洞包括:idc&ida 漏洞、“.htr”漏洞、NT Site Server Adsamples漏洞、.printer漏洞、Unicode解析錯(cuò)誤漏洞、Webdav漏洞等。因此,了解如何加強(qiáng)Web 服務(wù)器的安全性,防范由IIS漏洞造成的入侵就顯得尤為重要。
例如,缺省安裝時(shí),IIS支持兩種腳本映射:管理腳本(.ida文件)、Internet數(shù)據(jù)查詢腳本(.idq文件)。這兩種腳本都由idq.dll來(lái)處理和解釋。而idq.dll在處理某些URL請(qǐng)求時(shí)存在一個(gè)未經(jīng)檢查的緩沖區(qū),如果攻擊者提供一個(gè)特殊格式的URL,就可能引發(fā)一個(gè)緩沖區(qū)溢出。
通過(guò)精心構(gòu)造發(fā)送的數(shù)據(jù),攻擊者可以改變程序執(zhí)行流程,從而執(zhí)行任意代碼。當(dāng)成功地利用這個(gè)漏洞入侵系統(tǒng)后,攻擊者就可以在遠(yuǎn)程獲取“Local System”的權(quán)限了。
在“Internet服務(wù)管理器”中,右擊網(wǎng)站目錄,選擇“屬性”,在網(wǎng)站目錄屬性對(duì)話框的“主目錄”頁(yè)面中,點(diǎn)擊“配置”按鈕。在彈出“應(yīng)用程序配置”對(duì)話框的“應(yīng)用程序映射”頁(yè)面,刪除無(wú)用的程序映射。
在大多數(shù)情況下,只需要留下.asp一項(xiàng)即可,將.ida、.idq、.htr等全部刪除,以避免利用.ida、.idq等這些程序映射存在的漏洞對(duì)系統(tǒng)進(jìn)行攻擊。
軟件系統(tǒng)攻擊技術(shù).
常見(jiàn)的利用軟件缺陷對(duì)應(yīng)用軟件系統(tǒng)發(fā)起攻擊的技術(shù)包括:緩沖區(qū)溢出攻擊、堆溢出攻擊、棧溢出攻擊、格式化串漏洞利用等,在上述漏洞利用成功后,往往借助于shellcode跳轉(zhuǎn)或者執(zhí)行攻擊者的惡意程序。
緩沖區(qū)溢出利用
如果應(yīng)用軟件存在緩沖區(qū)溢出漏洞,可利用此漏洞實(shí)施對(duì)軟件系統(tǒng)的攻擊。緩沖區(qū)是內(nèi)存中存放數(shù)據(jù)的地方。在程序試圖將數(shù)據(jù)放到機(jī)器內(nèi)存中的某一個(gè)位置的時(shí)候,如果沒(méi)有足夠的空間就會(huì)發(fā)生緩沖區(qū)溢出。
攻擊者寫一個(gè)超過(guò)緩沖區(qū)長(zhǎng)度的字符串,程序讀取該段字符串,并將其植入到緩沖區(qū),由于該字符串長(zhǎng)度超出常規(guī)的長(zhǎng)度,這時(shí)可能會(huì)出現(xiàn)兩個(gè)結(jié)果:一是過(guò)長(zhǎng)的字符串覆蓋了相鄰的存儲(chǔ)單元,導(dǎo)致程序出錯(cuò),嚴(yán)重的可導(dǎo)致系統(tǒng)崩潰;另一個(gè)結(jié)果就是利用這種漏洞可以執(zhí)行任意指令,從而達(dá)到攻擊者的某種目的。
程序運(yùn)行的時(shí)候,將數(shù)據(jù)類型等保存在內(nèi)存的緩沖區(qū)中。為了不占用太多的內(nèi)存,一個(gè)由動(dòng)態(tài)分配變量的程序在程序運(yùn)行時(shí)才決定給它們分配多少內(nèi)存空間。如果在動(dòng)態(tài)分配緩沖區(qū)中放入超長(zhǎng)的數(shù)據(jù),就會(huì)發(fā)生溢出。
這時(shí)候程序就會(huì)因?yàn)楫惓6祷兀绻粽哂米约汗舸a的地址覆蓋返回地址,這個(gè)時(shí)候,通過(guò)eip改變返回地址,可以讓程序轉(zhuǎn)向攻擊者的程序段,如果在攻擊者編寫的 shellcode里面集成了文件的上傳、下載等功能,獲取到 root權(quán)限,那么就相當(dāng)于完全控制了被攻擊方。也就達(dá)到了攻擊者的目的。
棧溢出利用
程序每調(diào)用一個(gè)函數(shù),就會(huì)在堆棧里申請(qǐng)一定的空間,我們把這個(gè)空間稱為函數(shù)棧,而隨著函數(shù)調(diào)用層數(shù)的增加,函數(shù)棧一塊塊地從高端內(nèi)存向低端內(nèi)存地址方向延伸。
反之,隨著進(jìn)程中函數(shù)調(diào)用層數(shù)的減少,即各函數(shù)調(diào)用的返回,函數(shù)棧會(huì)一塊塊地被遺棄而向內(nèi)存的高址方向回縮。
各函數(shù)的棧大小隨著函數(shù)的性質(zhì)的不同而不等,由函數(shù)的局部變量的數(shù)目決定。
進(jìn)程對(duì)內(nèi)存的動(dòng)態(tài)申請(qǐng)是發(fā)生在Heap(堆)里的。也就是說(shuō),隨著系統(tǒng)動(dòng)態(tài)分配給進(jìn)程的內(nèi)存數(shù)量的增加,Heap(堆)有可能向高址或低址延伸,依賴于不同CPU 的實(shí)現(xiàn)。
但一般來(lái)說(shuō)是向內(nèi)存的高地址方向增長(zhǎng)的。當(dāng)發(fā)生函數(shù)調(diào)用時(shí),先將函數(shù)的參數(shù)壓入棧中,然后將函數(shù)的返回地址壓入棧中,這里的返回地址通常是Call的下一條指令的地址。
例如定義buffer時(shí)程序可分配了24個(gè)字節(jié)的空間,在strcpy執(zhí)行時(shí)向buffer里拷貝字符串時(shí)并未檢查長(zhǎng)度,如果向buffer里拷貝的字符串如果超過(guò)24個(gè)字節(jié),就會(huì)產(chǎn)生溢出。
如果向buffer里拷貝的字符串的長(zhǎng)度足夠長(zhǎng),把返回地址覆蓋后程序就會(huì)出錯(cuò)。一般會(huì)報(bào)段錯(cuò)誤或者非法指令,如果返回地址無(wú)法訪問(wèn),則產(chǎn)生段錯(cuò)誤,如果不可執(zhí)行則視為非法指令。
堆溢出利用
堆內(nèi)存由分配的很多的大塊內(nèi)存區(qū)組成,每一塊都含有描述內(nèi)存塊大小和其它一些細(xì)節(jié)信息的頭部數(shù)據(jù)。如果堆緩沖區(qū)遭受了溢出,攻擊者能重寫相應(yīng)堆的下一塊存儲(chǔ)區(qū),包括其頭部。如果重寫堆內(nèi)存區(qū)中下一個(gè)堆的頭部信息,則在內(nèi)存中可以寫進(jìn)任意數(shù)據(jù)。然而不同目標(biāo)軟件各自特點(diǎn)不同,堆溢出攻擊實(shí)施較為困難。
格式化串漏洞利用
所謂格式化串,就是在*printf()系列函數(shù)中按照一定的格式對(duì)數(shù)據(jù)進(jìn)行輸出,可以輸出到標(biāo)準(zhǔn)輸出,即printf(),也可以輸出到文件句柄,字符串等,對(duì)應(yīng)的函數(shù)有fprintf,sprintf,snprintf, vprintf,vfprintf,vsprintf,vsnprintf等。能被黑客利用的地方也就出在這一系列的*printf()函數(shù)中。在正常情況下這些函數(shù)只是把數(shù)據(jù)輸出,不會(huì)造成什么問(wèn)題,但是*printf()系列函數(shù)有3條特殊的性質(zhì),這些特殊性質(zhì)如果被黑客結(jié)合起來(lái)利用,就會(huì)形成漏洞。
可以被黑客利用的*printf()系列函數(shù)的三個(gè)特性:參數(shù)個(gè)數(shù)不固定造成訪問(wèn)越界數(shù)據(jù);利用%n格式符寫入跳轉(zhuǎn)地址;利用附加格式符控制跳轉(zhuǎn)地址的值。
shellcode技術(shù)
緩沖區(qū)溢出成功后,攻擊者如希望控制目標(biāo)計(jì)算機(jī),必須用shellcode實(shí)現(xiàn)各種功能。
shellcode是一堆機(jī)器指令集,基于x86平臺(tái)的匯編指令實(shí)現(xiàn),用于溢出后改變系統(tǒng)的正常流程,轉(zhuǎn)而執(zhí)行shellocode代碼從而完成對(duì)目標(biāo)計(jì)算機(jī)的控制。
1996年Aleph One在Underground發(fā)表的論文給這種代碼起了一個(gè)shellcode的名稱,從而延續(xù)至今。