![軟件安全PPT06:第四章 其他常見漏洞_第1頁](http://file4.renrendoc.com/view/e5216f3b5bcdf1761469a58d6a90b60d/e5216f3b5bcdf1761469a58d6a90b60d1.gif)
![軟件安全PPT06:第四章 其他常見漏洞_第2頁](http://file4.renrendoc.com/view/e5216f3b5bcdf1761469a58d6a90b60d/e5216f3b5bcdf1761469a58d6a90b60d2.gif)
![軟件安全PPT06:第四章 其他常見漏洞_第3頁](http://file4.renrendoc.com/view/e5216f3b5bcdf1761469a58d6a90b60d/e5216f3b5bcdf1761469a58d6a90b60d3.gif)
![軟件安全PPT06:第四章 其他常見漏洞_第4頁](http://file4.renrendoc.com/view/e5216f3b5bcdf1761469a58d6a90b60d/e5216f3b5bcdf1761469a58d6a90b60d4.gif)
![軟件安全PPT06:第四章 其他常見漏洞_第5頁](http://file4.renrendoc.com/view/e5216f3b5bcdf1761469a58d6a90b60d/e5216f3b5bcdf1761469a58d6a90b60d5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第四章軟件漏洞知識點五:格式化字符串漏洞知識點六:整數(shù)溢出漏洞知識點七:攻擊C++虛函數(shù)知識點八:其他類型漏洞知識點五:格式化字符串漏洞格式化串漏洞和普通的棧溢出有相似之處,但又有所不同,都是利用了程序員的疏忽大意來改變程序運行的正常流程。
首先,什么是格式化字符串呢,print()、fprint()等*print()系列的函數(shù)可以按照一定的格式將數(shù)據(jù)進行輸出,舉個最簡單的例子:printf("MyNameis:%s","bingtangguan")
執(zhí)行該函數(shù)后將返回字符串:MyNameis:bingtangguan
該printf函數(shù)的第一個參數(shù)就是格式化字符串,它來告訴程序?qū)?shù)據(jù)以什么格式輸出。1.格式化字符串定義printf()函數(shù)的一般形式為:printf(“format”,輸出表列),
format的結(jié)構(gòu)為:%[標志][輸出最小寬度][.精度][長度]類型其中類型有以下常見的幾種:
%d整型輸出,%ld長整型輸出,
%o以八進制數(shù)形式輸出整數(shù),
%x以十六進制數(shù)形式輸出整數(shù),
%u以十進制數(shù)輸出unsigned型數(shù)據(jù)(無符號數(shù))。
%c用來輸出一個字符,
%s用來輸出一個字符串,
%f用來輸出實數(shù),以小數(shù)形式輸出。
控制format參數(shù)之后結(jié)合printf()函數(shù)特性就可以進行相應攻擊。當格式化符號為%x時以16進制的形式輸出堆棧的內(nèi)容,為%s時則輸出對應地址所指向的字符串。特性一:格式化函數(shù)允許可變參數(shù)C語言中的格式化函數(shù)(*printf族函數(shù),包括printf,fprintf,sprintf,snprintf等)允許可變參數(shù),它根據(jù)傳入的格式化字符串獲知可變參數(shù)的個數(shù)和類型,并依據(jù)格式化符號進行參數(shù)的輸出。如果調(diào)用這些函數(shù)時,給出了格式化符號串,但沒有提供實際對應參數(shù)時,這些函數(shù)會將格式化字符串后面的多個棧中的內(nèi)容取出作為參數(shù),并根據(jù)格式化符號將其輸出。2.格式化字符串漏洞的利用—數(shù)據(jù)泄露調(diào)用時如果傳入”%x%x…%x”,則printf會打印出堆棧中的內(nèi)容,不斷增加%x的個數(shù)會逐漸顯示堆棧中高地址的數(shù)據(jù),從而導致堆棧中的數(shù)據(jù)泄漏。voidformatstring_func1(char*buf){charmark[]=“ABCD”;printf(buf);}下面以下述程序樣本為例,分析格式化字符串溢出的原理。#include<stdio.h>intmain(void){inta=1,b=2,c=3;charbuf[]="test";printf("%s%d%d%d\n",buf,a,b,c);return0;}編譯之后運行(Debug模式):test123增加一個printf()的format參數(shù),改為:printf("%s%d%d%d%x\n",buf,a,b,c),編譯后運行(Debug模式):
test12312C62E泄露內(nèi)存數(shù)據(jù)為什么輸出了一個12C62E?原因:函數(shù)調(diào)用,是要參數(shù)入棧的;printf函數(shù)會到入棧的參數(shù)位置去取參數(shù);在沒有給出%x的參數(shù)的時候,將自動將棧區(qū)參數(shù)的下一個地址作為參數(shù)輸入。#include<stdio.h>intmain(intargc,char*argv[]){charstr[200];fgets(str,200,stdin);printf(str);return0;}編譯后運行(Release模式)并輸入:AAAA%x%x%x%x我們成功讀到了AAAA:AAAA18FE84BB40603041414141(0x41就是ASCII的字母A的值)。思考:這個41414141是怎么讀到的?讀取任意內(nèi)存地址的數(shù)據(jù)讀取任意內(nèi)存地址的數(shù)據(jù)執(zhí)行printf(str)語句的時候,對比Debug模式和Relase模式的棧幀結(jié)構(gòu):charstr[200];fgets(str,200,stdin);printf(str);如果我們輸入AAAA%x%x%x%x返回結(jié)果為AAAA18FE84BB40603041414141那么輸入AAAA%x%x%x%s時,通過%s讀到的數(shù)據(jù)為讀到數(shù)值A(chǔ)AAA讀到數(shù)值0x41414141從地址0x41414141上讀到字符串從地址0x41414141上讀到整數(shù)ABCD提交單選題1分#特性二:利用%n格式符寫入數(shù)據(jù)更危險的是格式化符號%n,它的作用是將格式化函數(shù)輸出字符串的長度,寫入函數(shù)參數(shù)指定的位置。
%n不向printf傳遞格式化信息,而是令printf把自己到該點已打出的字符總數(shù)放到相應變元指向的整形變量中,比如printf(“Jamsa%n”,&first_count)將向整型變量first_count處寫入整數(shù)5。3.格式化字符串漏洞的利用—數(shù)據(jù)寫入Sprintf函數(shù)的作用是把格式化的數(shù)據(jù)寫入某個字符串緩沖區(qū)。函數(shù)原型為:
intsprintf(char*buffer,constchar*format,[argument]…);
觀察如下程序(Release模式):intformatstring_func2(intargc,char*argv[]){charbuffer[100];sprintf(buffer,argv[1]);}如果調(diào)用這段程序時用”aaaabbbbcc%n”作為命令行參數(shù),將會怎么樣?首先“aaaabbbbcc”寫入buffer;然后從堆棧中取下一個參數(shù),并將其當作整數(shù)指針使用,由于調(diào)用sprintf時沒有傳入下一個參數(shù),因而buffer中的前四個字節(jié)被當作參數(shù),這樣已輸出字串的長度10就被寫入內(nèi)存地址0x61616161處。結(jié)果:數(shù)值10就會被寫入地址為0x61616161(aaaa)的內(nèi)存單元。通過這種格式化字符串的利用方式,可以實現(xiàn)向任意內(nèi)存寫入任意數(shù)值。運行:Before:num=6666666666666666After:num=8特性三:自定義打印字符串寬度實驗:利用%n格式化符號和自定義打印字符串寬度,寫入某內(nèi)存地址任意數(shù)據(jù)#include<stdio.h>main(){intnum=66666666;printf("Before:num=%d\n",num);printf("%d%n\n",num,&num);printf("After:num=%d\n",num);}現(xiàn)在我們已經(jīng)知道可以利用%n向內(nèi)存中寫入值,如果我們寫的值(比如一個返回地址)非常大,怎么來構(gòu)造這樣的值?運行:Before:num=66666666
66666666After:num=100關(guān)于打印字符串寬度的問題,在格式符中間加上一個十進制整數(shù)來表示輸出的最少位數(shù),若實際位數(shù)多于定義的寬度,則按實際位數(shù)輸出,若實際位數(shù)少于定義的寬度則補以空格或0。我們把上一段代碼做一下修改并看一下效果:#include<stdio.h>main(){intnum=66666666;printf("Before:num=%d\n",num);printf("%100d%n\n",num,&num);printf("After:num=%d\n",num);}我們也可以使用%02333d這種形式。在打印數(shù)值右側(cè)用0補齊不足位數(shù)的方式來補齊,而不是空格。能寫入數(shù)據(jù)的格式化符號是%x%n%m%sABCD提交單選題1分知識點六:整數(shù)溢出漏洞整數(shù)溢出高級程序語言中,整數(shù)分為無符號數(shù)和有符號數(shù)兩類,其中有符號負整數(shù)最高位為1,正整數(shù)最高位為0,無符號整數(shù)則無此限制。常見的整數(shù)類型有8位、16位、32位以及64位等,對應的每種類型整數(shù)都包含一定的范圍。當對整數(shù)進行加、乘等運算時,計算的結(jié)果如果大于該類型的整數(shù)所表示的范圍時,就會發(fā)生整數(shù)溢出。(1)存儲溢出存儲溢出是使用另外的數(shù)據(jù)類型來存儲整型數(shù)造成的。例如,把一個大的變量放入一個小變量的存儲區(qū)域,最終是只能保留小變量能夠存儲的位,其他的位都無法存儲,以至于造成安全隱患。
(2)運算溢出運算溢出是對整型變量進行運算時沒有考慮到其邊界范圍,造成運算后的數(shù)值范圍超出了其存儲空間。
根據(jù)溢出原理的不同,整數(shù)溢出可以分為以下三類:
(3)符號問題整型數(shù)可分為有符號整型數(shù)和無符號整型數(shù)兩種。在開發(fā)過程中,一般長度變量使用無符號整型數(shù),然而如果程序員忽略了符號,在進行安全檢查判斷的時候就可能出現(xiàn)問題。
該函數(shù)將用戶輸入的數(shù)據(jù)拷貝到新的緩沖區(qū),并在最后寫入結(jié)尾符0。如果攻擊者將0xFFFFFFFF作為參數(shù)傳入len,當計算size時會發(fā)生整數(shù)溢出,malloc會分配大小為0的內(nèi)存塊(將得到有效地址),后面執(zhí)行memcpy時會發(fā)生堆溢出。整數(shù)溢出的樣例可通過下面的代碼了解。char*integer_overflow(int*data,unsignedintlen){ unsignedintsize=len+1; char*buffer=(char*)malloc(size); if(!buffer)returnNULL; memcpy(buffer,data,len); buffer[len]=’\’;returnbuffer;}整數(shù)溢出一般不能被單獨利用,而是用來繞過目標程序中的條件檢測,進而實現(xiàn)其他攻擊。分析如下實例:#include<iostream>#include<windows.h>#include<shellapi.h>#include<stdio.h>#include<stdlib.h>#defineMAX_INFO32767usingnamespacestd;voidfunc(){ShellExecute(NULL,"open","notepad",NULL,NULL,SW_SHOW);//打開記事本}voidfunc1(){ShellExecute(NULL,"open","calc",NULL,NULL,SW_SHOW);//打開計算器}intmain(){ void(*fuc_ptr)()=func; charinfo[MAX_INFO]; charinfo1[30000]; charinfo2[30000];
freopen("input.txt","r",stdin); cin.getline(info1,30000,''); cin.getline(info2,30000,'');
shortlen1=strlen(info1); shortlen2=strlen(info2); shortall_len=len1+len2;
if(all_len<MAX_INFO) { strcpy(info,info1); strcat(info,info2); } fuc_ptr(); return0;}short型整數(shù)表示范圍為-32768~32767,當len1+len2超過了short型整數(shù)的最大范圍后會變?yōu)橐粋€負數(shù),將滿足all_len<MAX_INFO的判斷條件,進而進入if的分支語句。于是繼續(xù)執(zhí)行if語句的時候,將info1與info2的內(nèi)容都寫進info中。
思考:如何實現(xiàn)fuc_ptr的覆蓋,改變程序執(zhí)行?知識點七:攻擊C++虛函數(shù)多態(tài)是面向?qū)ο蟮囊粋€重要特性,在C++中,這個特性主要靠對虛函數(shù)的動態(tài)調(diào)用來實現(xiàn)。C++類的成員函數(shù)聲明時,若使用關(guān)鍵字virtual進行修飾,則被稱為虛函數(shù)。虛函數(shù)的入口地址被統(tǒng)一保存在虛表(Vtable)中。對象在使用虛函數(shù)時,先通過虛表指針找到虛表,然后從虛表中取出最終的函數(shù)入口地址進行調(diào)用。C++面向?qū)ο笳Z言的漏洞C++虛函數(shù)和類在內(nèi)存中的位置關(guān)系如圖所示:(1)虛表指針保存在對象的內(nèi)存空間中,緊接著虛表指針的是其他成員變量;(2)虛函數(shù)入口地址被統(tǒng)一存在虛表中。C++面向?qū)ο笳Z言的漏洞對象使用虛函數(shù)時通過(1)調(diào)用虛表指針找到虛表,然后(2)從虛表中取出最終的函數(shù)入口地址進行調(diào)用。如果虛表里存儲的虛函數(shù)指針被篡改,程序調(diào)用虛函數(shù)的時候就會執(zhí)行篡改后的指定地址的shellcode,就會發(fā)動虛函數(shù)攻擊。通過下述代碼來復現(xiàn)虛函數(shù)攻擊。攻擊虛函數(shù)charshellcode[]=“xFC\x68\x6A…..\xA4\x8B\x42\x00”;classFailwest{public:charbuf[200];virtualvoidtest(void){cout<<"ClassVtable::test()"<<endl;};};
Failwestoverflow,*p;
voidmain(void){char*p_vtable;p_vtable=overflow.buf–4;intlen=strlen(shellcode);__asmint3;//人為增加一個斷點
p_vtable[0]=0x54;p_vtable[1]=0x8c;p_vtable[2]=0x42;p_vtable[3]=0x00;strcpy(overflow.buf,shellcode);p=&overflow;p->test();}得到虛表指針:為虛表指針位于對象overflow成員變量charbuf[200]之前,程序中通過p_vtable=overflow.buf-4定位到這個指針。這是我們能利用的緩沖區(qū),這意味著,惡意代碼shellcode被存儲到了overflow.buf位置。我們希望通過調(diào)用test虛函數(shù)的時候,跳轉(zhuǎn)到這個位置去執(zhí)行惡意代碼。但是,怎么讓調(diào)用test虛函數(shù)的時候,通過虛表指針找到的虛函數(shù)指針就是我們期待的目標呢?2.修改虛函數(shù)指針:修改數(shù)組shellcode最后4位(虛表)來指向overflow.buf的內(nèi)存地址,即讓虛函數(shù)指針指向保存shellcode的overflow.buf區(qū)域。攻擊策略charshellcode[]=“xFC\x68\x6A…..\xA4\x8B\x42\x00”;classFailwest{public:charbuf[200];virtualvoidtest(void){cout<<"ClassVtable::test()"<<endl;};};
Failwestoverflow,*p;
voidmain(void){char*p_vtable;p_vtable=overflow.buf–4;……p_vtable[0]=0x54;p_vtable[1]=0x8c;p_vtable[2]=0x42;p_vtable[3]=0x00;…….}1.修改虛表地址:將對象overflow的虛表地址修改為數(shù)組shellcode的倒數(shù)第四個字節(jié)開始地址。充分利用overflow.buf這個緩沖區(qū):overflow.buf的地址為0x00428ba4,其倒數(shù)第四個字節(jié)開始地址為0x00428c54。Strlen里最后一個字符是0x00,需要加上。VCIDE,進行實際調(diào)試的時候,在語句“p->test();”處轉(zhuǎn)入反匯編,繼續(xù)單步調(diào)試,可以看到攻擊成功,彈出failwest的對話框:虛表指針保存在靜態(tài)數(shù)據(jù)區(qū)對象的內(nèi)存空間類的聲明區(qū)對象的虛函數(shù)區(qū)ABCD提交單選題1分知識點八:其他類型漏洞注入類攻擊都具備一個共同的特點:來自外部的輸入數(shù)據(jù)被當作代碼或非預期的指令、數(shù)據(jù)被執(zhí)行,從而將威脅引入到軟件或者系統(tǒng)。根據(jù)應用程序的工作方式,將代碼注入分為兩大類:二進制代碼注入,即將計算機可以執(zhí)行執(zhí)行的二進制代碼注入到其他應用程序的執(zhí)行代碼中。由于程序中某些缺陷導致程序的控制器被劫持,使得外部代碼獲得執(zhí)行機會,從而實現(xiàn)特定的攻擊目的;腳本注入,即通過特定的腳本解釋類程序提交可被解釋執(zhí)行的數(shù)據(jù)。由于應用在輸入的過濾上存在缺陷,導致注入的腳本數(shù)據(jù)被執(zhí)行。1.注入類漏洞下面介紹幾種Web場景下的代碼注入攻擊。SQL(Structuredquerylanguage,結(jié)構(gòu)化查詢語言)是操作數(shù)據(jù)庫數(shù)據(jù)的結(jié)構(gòu)化查詢語言,用于讀取、更新、增加或刪除數(shù)據(jù)庫中保存的信息。應用程序通過SQL語言來完成后臺數(shù)據(jù)庫中的數(shù)據(jù)的增加、刪除、修改和查詢。SQL注入是將Web頁面的原URL、表單域或數(shù)據(jù)包輸入的參數(shù),修改拼接成SQL語句,傳遞給Web服務器,進而傳給數(shù)據(jù)庫服務器以執(zhí)行數(shù)據(jù)庫命令。如果Web應用程序的開發(fā)人員對用戶所輸入的數(shù)據(jù)不進行過濾或驗證就直接傳輸給數(shù)據(jù)庫,就可能導致拼接的異常SQL語句被執(zhí)行,獲取對數(shù)據(jù)庫的信息以及提權(quán),發(fā)生SQL注入攻擊。(1)SQL注入(1)SQL注入strKeyword=Request[“keyword”];sqlQuery=
“SELECT*FROMArticlesWHEREKeywordsLIKE‘%”+strKeyword+“%’”;Hack’;DROPTABLEAritcles;--SELECT*FROMAritclesWHEREKeywordsLIKE‘%hack’;DROPTABLEAritcles;--%’--是注釋符,結(jié)果是以中間的分號為標志分成兩個部分,執(zhí)行完“SELECT*FROMAritclesWHEREKeywordsLIKE‘%hack’”后,將執(zhí)行”DROPTABLEAritcles;”操作系統(tǒng)命令注入攻擊(OSCommandInjection)是指通過Web應用,執(zhí)行非法的操作系統(tǒng)命令達到攻擊的目的。大多數(shù)Web服務器都能夠使用內(nèi)置的API與服務器的操作系統(tǒng)進行幾乎任何必需的交互,比如PHP中的system、exec和ASP中的wscript類函數(shù)。如果正確使用,這些API可以豐富Web應用的功能。但是,如果應用程序向操作系統(tǒng)命令程序傳送用戶提交的輸入,而且沒有對輸入進行過濾和檢測,就可能遭受命令注入攻擊。許多定制和非定制web應用程序中都存在這種命令注入缺陷。在為企業(yè)服務器或防火墻、打印機和路由器之類的設備提供管理界面的應用程序中,這類缺陷尤其普遍。(2)操作系統(tǒng)命令注入常用的ASP/PHP/JSP等web腳本解釋語言支持動態(tài)執(zhí)行在運行時生成的代碼這種特點,可以幫助開發(fā)者根據(jù)各種數(shù)據(jù)和條件動態(tài)修改程序代碼,這對于開發(fā)人員來說是有利的,但這也隱藏著巨大的風險。這種類型的漏洞主要來自兩個方面:(1)合并了用戶提交數(shù)據(jù)的代碼的動態(tài)執(zhí)行。攻擊者通過提交精心設計輸入,使得合并用戶提交數(shù)據(jù)后的代碼蘊含設定的非正常業(yè)務邏輯來實施特定攻擊。(2)根據(jù)用戶提交的數(shù)據(jù)指定的代碼文件的動態(tài)包含。多數(shù)腳本語言都支持使用包含文件(includefile),這種功能允許開發(fā)者把可重復使用的代碼插入到單個文件中,在需要的時候再將它們包含到相關(guān)代碼文件中。如果攻擊者能修改這個文件中的代碼,就讓受此攻擊的應用執(zhí)行攻擊者的代碼
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初級公司信貸-2019下半年初級銀行從業(yè)資格考試《公司信貸》真題
- 設計人性化的商場休息區(qū)域
- 2024-2025學年八省聯(lián)考考前適應化訓練(一)物理物理試卷(解析版)
- 綠色服務協(xié)議書
- 2025年江蘇省普通高中學業(yè)水平合格性考試模擬英語試題(二)英語試題(解析版)
- 自強自立申請書
- 電子競技行業(yè)的技術(shù)創(chuàng)新與產(chǎn)業(yè)鏈構(gòu)建
- 外研版高中英語選擇性必修第四冊UNIT2 Period7課件
- 中國批發(fā)和零售業(yè)行業(yè)分析報告
- 藥店醫(yī)保定點申請書
- 小學校長任期五年工作目標(2024年-2029年)
- 醫(yī)院培訓課件:《猴痘流行病學特點及中國大陸首例猴痘病例調(diào)查處置》
- 氫氣-安全技術(shù)說明書MSDS
- 產(chǎn)科護士臨床思維能力培養(yǎng)
- 北師大版六年級下冊數(shù)學全冊表格式教案
- 開曼群島公司法2024版中文譯本(含2024年修訂主要內(nèi)容)
- 市政工程人員績效考核制度
- 公園景區(qū)安全生產(chǎn)
- 2024年社會工作者(中級)-社會綜合能力考試歷年真題可打印
- 九年級化學下冊 第12單元 化學與生活教案 (新版)新人教版
- 后腹腔鏡下輸尿管切開取石術(shù)
評論
0/150
提交評論