數(shù)據(jù)安全治理關(guān)鍵技術(shù)之?dāng)?shù)據(jù)庫脫敏技術(shù)詳解
數(shù)據(jù)安全治理之API監(jiān)測系統(tǒng) ,解決API接口安全問題【安華金和】
新一代數(shù)據(jù)庫脫敏技術(shù),為敏感數(shù)據(jù)建立保護(hù)盾!
數(shù)據(jù)庫脫敏系統(tǒng)與金融行業(yè)案例解讀
數(shù)據(jù)安全治理建設(shè)思路的著力點(diǎn)——數(shù)據(jù)安全咨詢服務(wù)【安華金和】
數(shù)據(jù)庫防火墻功能有哪些?-數(shù)據(jù)安全-安華金和
數(shù)據(jù)安全關(guān)鍵技術(shù)之?dāng)?shù)據(jù)庫脫敏技術(shù)詳解【安華金和】
中國數(shù)據(jù)安全治理落地指導(dǎo)書籍《數(shù)據(jù)安全治理白皮書5.0》正式發(fā)布(附下載)
前文中我們對數(shù)據(jù)庫安全漏洞中最為常見的一種——緩沖區(qū)溢出漏洞進(jìn)行了簡單的概念介紹。在靜態(tài)數(shù)據(jù)溢出、棧溢出和堆溢出三種類型中,棧溢出和堆溢出相對來說更復(fù)雜,且危害范圍較大,在前文概念介紹的基礎(chǔ)上,本文對windows下的棧結(jié)構(gòu)進(jìn)行更直觀的介紹,通過構(gòu)造一段代碼示例,更清晰的演示棧結(jié)構(gòu)下的緩沖區(qū)溢出漏洞原理。
下面我們將構(gòu)造一段代碼,完成3個(gè)任務(wù):
1.演示W(wǎng)IN下棧的結(jié)構(gòu)
2.演示緩沖區(qū)溢出改變函數(shù)控制流程
3.演示緩沖區(qū)溢出覆蓋返回地址(劫持函數(shù))
下面的程序包含一個(gè)主函數(shù)main和另外一個(gè)子函數(shù)re_choose。re_choose函數(shù)用于把從main函數(shù)中取得的輸入字符串和存儲的字符串liusicheng做對比。如果輸入的字符串和存儲的字符串一致則返回0。如果不一致則可能返回1或者-1。同時(shí)還人為制造了一個(gè)緩沖區(qū)溢出點(diǎn)strcpy(buffer,input)。input有1024的空間,而buffer只有44的空間。只要input超過44則就會引發(fā)緩沖區(qū)溢出。main函數(shù)取re_choose返回值如果返回1或-1走if。如果返回0則走else。將用緩沖區(qū)溢出來讓返回1或者-1也走else。
#include <stdio.h>
#include <string.h>
#define ture_password "liusicheng"
int re_choose (char *input)
{
int result;
char buffer[44];
result = strcmp(input,ture_password);
strcpy(buffer,input); //緩沖注入點(diǎn)
return result;
}
void main()
{
int choose=0;
char input[1024];
scanf("%s",input);
choose=re_choose(input);
if (choose == 1 || choose == -1)
{
printf("error\n");
}
else
{
printf("ture\n");
}
}
編譯出上面代碼的release版,放入IDA pro中得到反編譯代碼。下圖是MAIN函數(shù)的流程結(jié)構(gòu)。清楚的看到main函數(shù)的整個(gè)控制流程和main函數(shù)的棧從建立到銷毀的全過程。棧主要用在函數(shù)調(diào)用上。進(jìn)程調(diào)用的開始會調(diào)用大量系統(tǒng)函數(shù),其中大量函數(shù)的地址是固定不變的(只和操作系統(tǒng)版本有關(guān)系),這些固定的函數(shù)將成為以后用于跳轉(zhuǎn)的平臺 。本文先不涉及這些函數(shù)。直接跳到main函數(shù)開始介紹。棧的結(jié)構(gòu)是4個(gè)字節(jié)為一層。如果超過4個(gè)字節(jié)。按照4個(gè)整數(shù)倍存儲。不足4個(gè)字節(jié)按照4個(gè)字節(jié)存儲。棧的主要操作只有2種push和POP。push是把寄存器的內(nèi)容壓入到棧中,pop是把棧中的內(nèi)容釋放掉。ebp是當(dāng)前棧幀的棧底,esp是當(dāng)前棧幀的棧頂。(注意由于棧是順序執(zhí)行的所以同一時(shí)間只有一個(gè)棧頂和一個(gè)棧底。但棧底一般不是整個(gè)系統(tǒng)棧的棧底,而只是當(dāng)前這個(gè)棧幀的棧底)。棧的結(jié)構(gòu)采用先進(jìn)先出,后進(jìn)后出的原則。所以當(dāng)創(chuàng)建一個(gè)棧的時(shí)候會遵循如下步驟:
1把上一個(gè)棧幀的棧底的指針壓入當(dāng)前棧保存起來(push ebp)。這一步其實(shí)是2步:第一步壓入返回地址,第二步壓入當(dāng)上一個(gè)棧幀的ebp。
2把上一個(gè)棧幀的棧底移動到上一個(gè)棧幀的棧頂(mov ebp,esp)。從此這個(gè)棧的棧底就確定且不會發(fā)生任何改變。棧頂esp會一直發(fā)生變化。
3接著分配局部函數(shù)(sub esp,404h)。本程序中2個(gè)變量1個(gè)是4字節(jié)1個(gè)是1024字節(jié)。加一起正好是0x404個(gè)字節(jié)。需要棧頂上移0x404。注意棧的方向和內(nèi)存相反。數(shù)據(jù)進(jìn)入內(nèi)存是從低地址向高地址寫,而棧則是從高地址向低地址寫。正是這種結(jié)構(gòu),給了后來數(shù)據(jù)改寫之前數(shù)據(jù)的機(jī)會。棧頂?shù)闹禃S著棧中數(shù)據(jù)隨時(shí)進(jìn)行調(diào)整。
注意:上圖中var_404= -404h、str1= -400h
同樣棧撤銷的時(shí)候基本可以按照棧建立的逆操作進(jìn)行。首先把棧底值覆蓋棧頂(mov esp,ebp)。接著棧中彈出當(dāng)前ebp的值(pop ebp)。然后跳轉(zhuǎn)EIP中存儲的上個(gè)函數(shù)的返回地址(retn),回到前一個(gè)棧幀中(上一個(gè)函數(shù)中)刪除返回地址行(add esp 4)。到此棧被完全撤銷。至此一個(gè)棧從建立到撤銷的全部過程已經(jīng)完成。我們除了關(guān)心一個(gè)棧的創(chuàng)建和消亡,更關(guān)心的就是棧是如何傳遞返回值和參數(shù)的。下圖是re_choose的反匯編圖:清楚的解釋了,在棧中是如何傳參和返回值的。
注上圖中 var_4= -4 、str1 = 8
main函數(shù)從 call sub_401000這句開始,創(chuàng)建子函數(shù)re_choose的棧幀,開始也是和main一樣的棧創(chuàng)建過程。直到執(zhí)行到 mov eax,[ebp+str1],這句就是大家最關(guān)心的傳參。在棧中固定不動的是棧底(ebp)。利用棧底為坐標(biāo)向高位內(nèi)存移動8個(gè)字節(jié)取值。取到存在main中的input。放入eax寄存器中傳入re_choose用于計(jì)算。同樣的機(jī)制看后半段 從re_choose中 (mov eax,[ebp+var_4])取棧底向低地址偏移4個(gè)字節(jié)的內(nèi)容。存在eax中,main把eax值存入ebp-404(mov [ebp+var_404],eax)這個(gè)地址中用于后續(xù)的判斷。至此棧的基本結(jié)構(gòu)基本操作已經(jīng)介紹完畢。棧緩沖區(qū)溢出的根源和棧的自身結(jié)構(gòu)密切相關(guān)。正是由于棧中數(shù)據(jù)是先存入的在內(nèi)存高地址,后入的在內(nèi)存低地址。所以給了后入的機(jī)會,一旦超過棧原本分配的長度則會直接覆蓋原先存在內(nèi)存高地址中的數(shù)據(jù)或指令。從而帶來不可預(yù)知的結(jié)果。
至于函數(shù)的參數(shù)傳入的順序是從左到右還是從右到左(局部變量int a,b 是先壓a還是先壓b),函數(shù)返回時(shí)恢復(fù)棧平衡是讓母函數(shù)作還是子函數(shù)作。這部分和函數(shù)調(diào)用約定相關(guān),主要的調(diào)用約定分為,_cdecl、_fastcall和_stdcall。一般VS默認(rèn)采用 _stdcall和windows api保持一致。stdcall規(guī)則要求:參數(shù)從右向左壓。(int a,b 先壓b)。函數(shù)退出的時(shí)候自己清理?xiàng)V械膮?shù)。(圖中經(jīng)常會看到一個(gè)參數(shù)后面沒用直接被add esp 4了)
至此,通過上面緩沖區(qū)溢出漏洞的實(shí)例演示,你應(yīng)該已經(jīng)了解了棧溢出的漏洞原理。后續(xù),我們將基于此實(shí)例,向大家介紹利用棧溢出漏洞的攻擊方式,以及隨之帶來的數(shù)據(jù)庫安全風(fēng)險(xiǎn)。通過這樣的實(shí)例演示,讓大家對此類漏洞原理產(chǎn)生深刻理解,并梳理出防護(hù)思路。