匯編工具:http://www.ollydbg.de/
數(shù)據(jù)庫(kù)管理工具破解教程:http://www.itdecent.cn/p/e6665db44328
解密解碼工具:http://ctf.ssleye.com/
攻擊工具:http://www.ctftools.com/down/
攻防博客:
https://www.hackjie.com/blog
攻防平臺(tái)
https://adworld.xctf.org.cn/task
lsof -i TCP:3307
關(guān)閉SELinux:
setenforce 0
開(kāi)啟SELinux:
setenforce 1
棧溢出:棧溢出的原理是覆蓋函數(shù)的返回地。函數(shù)調(diào)用過(guò)程中,函數(shù)的返回地址保存在棧里面。所以棧溢出的思路就是把棧里面的返回地址覆蓋,然后替換成攻擊者想要的地址。因?yàn)闂J峭略黾拥?,先進(jìn)入棧的地址反而要大,這種機(jī)制更方便的提供了漏洞產(chǎn)生的可能性。
緩沖區(qū)溢出的危害:緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運(yùn)行失敗、系統(tǒng)關(guān)機(jī)、重新啟動(dòng),或者執(zhí)行攻擊者的指令,比如非法提升權(quán)限。
緩沖區(qū)漏洞對(duì)應(yīng)函數(shù):C/C++語(yǔ)言中像strcpy函數(shù)還有strcat()、sprintf()、vsprintf()、gets()、scanf() 以及在循環(huán)內(nèi)的getc()、fgetc()、getchar()等這些常見(jiàn)的函數(shù)都會(huì)造成緩沖區(qū)溢出漏洞。
mybatis中的#和$的區(qū)別:
1、#將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串,會(huì)對(duì)自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號(hào)。
如:where username=#{username},如果傳入的值是111,那么解析成sql時(shí)的值為where username="111", 如果傳入的值是id,則解析成的sql為where username="id".
2、$將傳入的數(shù)據(jù)直接顯示生成在sql中。
如:where username=${username},如果傳入的值是111,那么解析成sql時(shí)的值為where username=111;
如果傳入的值是;drop table user;,則解析成的sql為:select id, username, password, role from user where username=;drop table user;
3、#方式能夠很大程度防止sql注入,$方式無(wú)法防止Sql注入。
4、$方式一般用于傳入數(shù)據(jù)庫(kù)對(duì)象,例如傳入表名.
5、一般能用#的就別用$,若不得不使用“${xxx}”這樣的參數(shù),要手工地做好過(guò)濾工作,來(lái)防止sql注入攻擊。
6、在MyBatis中,“${xxx}”這樣格式的參數(shù)會(huì)直接參與SQL編譯,從而不能避免注入攻擊。但涉及到動(dòng)態(tài)表名和列名時(shí),只能使用“${xxx}”這樣的參數(shù)格式。所以,這樣的參數(shù)需要我們?cè)诖a中手工進(jìn)行處理來(lái)防止注入。
【結(jié)論】在編寫MyBatis的映射語(yǔ)句時(shí),盡量采用“#{xxx}”這樣的格式。若不得不使用“${xxx}”這樣的參數(shù),要手工地做好過(guò)濾工作,來(lái)防止SQL注入攻擊。
根據(jù)數(shù)據(jù)庫(kù)返回內(nèi)容是否回顯,可以將 SQL注入分為可回顯注入和不可回顯注入。從名字可以看到,可回顯注入意思是數(shù)據(jù)庫(kù)返回的結(jié)果可以在網(wǎng)頁(yè)前端看到。不可回顯是無(wú)法看到數(shù)據(jù)庫(kù)反饋結(jié)果,需要通過(guò)其他手段判斷(如時(shí)間延遲等)。
可回顯的注入
可回顯的注入包含聯(lián)合查詢注入和報(bào)錯(cuò)注入。下面分別介紹。
1. 聯(lián)合查詢注入
聯(lián)合查詢的名字來(lái)自他的查詢方式關(guān)鍵字 UNION。在sql語(yǔ)言的語(yǔ)法中,通過(guò)關(guān)鍵字 union可以將聯(lián)合查詢結(jié)果輸出。在可回顯的注入中,通過(guò)聯(lián)合查詢我們可以查詢出 數(shù)據(jù)庫(kù)信息、數(shù)據(jù)表信息、數(shù)據(jù)字段信息等,是比較簡(jiǎn)單易學(xué)、容易理解和上手的注入方法。當(dāng)一個(gè)網(wǎng)頁(yè)代碼有如下所示的查詢片段,并將查詢結(jié)果某種方式回顯到界面時(shí),可以進(jìn)行SQL聯(lián)合注入。
SELECT id FROM users WHERE user_id='$id'
在通常輸入的位置,我們進(jìn)行修改輸入以下參數(shù),
?id=-1'union+select+1+--+
因?yàn)閱我?hào),閉合了前面的單引號(hào),拼接后SQL查詢語(yǔ)句就變成了如下
SELECT id FROM users WHERE user_id='-1'union select 1 --'
服務(wù)器對(duì)于加好進(jìn)行了轉(zhuǎn)義,在用戶查詢頁(yè)面輸出了不充分查詢內(nèi)容。在select語(yǔ)句后面,可以查詢的內(nèi)容很多,獲取很多信息。通常需要染過(guò)一些特定字符。
2. 報(bào)錯(cuò)注入
報(bào)錯(cuò)注入的原理是利用數(shù)據(jù)庫(kù)的某些機(jī)制,通過(guò)人為制造錯(cuò)誤條件,將查詢結(jié)果通過(guò)錯(cuò)誤信心顯示出來(lái)。MySQL中通常用到 updatexml、floor 和 exp 三個(gè)函數(shù)。
首先了解下updatexml()函數(shù)
UPDATEXML (XML_document, XPath_string, new_value);
第一個(gè)參數(shù):XML_document是String格式,為XML文檔對(duì)象的名稱,文中為Doc
第二個(gè)參數(shù):XPath_string (Xpath格式的字符串) ,如果不了解Xpath語(yǔ)法,可以在網(wǎng)上查找教程。
第三個(gè)參數(shù):new_value,String格式,替換查找到的符合條件的數(shù)據(jù) 。
當(dāng)我們輸入一下語(yǔ)句時(shí),
select name from user where id=1 and updatexml(1,concat('~',(select database()),'~'),3);
因?yàn)?updatexml的 第一個(gè)和第三個(gè)參數(shù)不滿足 參數(shù)要求格式,導(dǎo)致concat 后括號(hào)的內(nèi)容以報(bào)錯(cuò)形式展示出來(lái)。
基于floor函數(shù)的報(bào)錯(cuò)原理,較為復(fù)雜,讀者可以參考 第四個(gè)連接。給幾個(gè)爆破數(shù)據(jù)庫(kù)的payload,
爆破數(shù)據(jù)庫(kù)版本信息:
?id=1'+and(select 1 from(select count('),concat(select(select(select concat(0x7e,
version(),0x7e))from information_schema.tables limit 0,1),floor(rand(0)*2)x from
information_schema.tables group by x)a)%23
爆破當(dāng)前用戶:
?id=1'+and(select 1 from(select count('),concat(select (select(select concat(Ox7e,
user(),0x7e))from information_schema.tables limit 0,1),floor(rand(0)*2))x from
linformation_schema.tables group by x)a)%23
爆破當(dāng)前使用的數(shù)據(jù)庫(kù):
?id=1'+and(select 1 from(select count("),concat(select(select(select concat(Ox7e,
database(),0x7e)from information schema.tables limit 0,1),floor(rand(0)*2)x from
information_schema.tables group by x)a)%23
基于exp函數(shù)報(bào)錯(cuò)的原因?yàn)橐绯鰣?bào)錯(cuò)。
使用的payload 如下:
2id=1'and exp(-(select*from(select user())x))%23
不可回顯的注入
不可回顯的注入,通常是因開(kāi)發(fā)者將報(bào)錯(cuò)信息屏蔽或者正確與否存在同樣的回顯導(dǎo)致的,有布爾盲注和基于時(shí)間盲注兩種。下面分別介紹。
布爾盲注通常使用有些判斷真假的語(yǔ)句來(lái)進(jìn)行判定。通常在查詢語(yǔ)句后面 添加 and 1=1和 and 1=2 。 因?yàn)?1=1 不影響運(yùn)行,但是1=2為假,沒(méi)有正常的回顯。布爾盲注時(shí)通常用到的函數(shù)進(jìn)行了一些總結(jié)
1.截取函數(shù)
substr() 函數(shù)是字符串截取函數(shù),在盲注中我們一般逐位獲取數(shù)據(jù),這時(shí)候就需要使用subtr函數(shù)按位截取。使用方法∶substr(str,start,length)。這里的str為被截取的字符串,start為開(kāi)始截取的位置,length為截substr()取的長(zhǎng)度。在盲注時(shí),我們一般只截取一位,如substruser(user(),1),這樣可以從user函數(shù)返回?cái)?shù)據(jù)的第一位開(kāi)始的偏移位置截取一位,之后我們只要修改位置參數(shù)即可獲取其他的數(shù)據(jù)
left()函數(shù)?是左截取函數(shù),lef的用法為lef(sr,length)。這里的str是被截取的字符串,length為被截取的長(zhǎng)度。在育注中可以使用len(user(),1)來(lái)左截取一位字符。但是,如果是lef(user(),2),則會(huì)將user()的前兩位都截取出來(lái),這樣的話,我們需要在匹配輸出的字符串之前增加前綴,把之前幾次的結(jié)果添加到這次的結(jié)果之前。
right()函數(shù)?是右截取函數(shù)。使用方法與lef 函數(shù)類似,可以參考left函數(shù)的用法rightO
2.轉(zhuǎn)換函數(shù)
ascii()函數(shù)?的作用是將字符串轉(zhuǎn)換為ASCII碼,這樣我們就可以避免在Paylod中出現(xiàn)單引號(hào)。使用方法為ascii(char),這里的char為一個(gè)字符,在盲注中一般為單個(gè)字母。如果 char為一串字符串,則返回結(jié)果ascii()將是第一個(gè)字母的ASCII碼。我們?cè)谑褂弥型ǔEcsubstr函數(shù)相結(jié)合,如 asci(substr(user(),1,1),這樣可以獲得user()的第一位字符的 ASCII碼
Hex()函數(shù)?可以將字符串的值轉(zhuǎn)換為十六進(jìn)制的值。在ascii函數(shù)被禁止時(shí),或者是需要將二進(jìn)制數(shù)據(jù)寫人hex()文件時(shí)可以使用該函數(shù),使用方法類似于 ascii函數(shù)
3.比較函數(shù)
if()函數(shù)?是盲注中經(jīng)常使用的函數(shù),if函數(shù)的作用與1=1和1=2的原理類似。如果我們要盲注的對(duì)象為假,則可以通過(guò)if的返回結(jié)果對(duì)頁(yè)面進(jìn)行控制。使用方法為if(cond,Ture_result,F(xiàn)alse_resut)其中,cond為判斷條件,Ture_result為真時(shí)的返回結(jié)果,F(xiàn)alse_result為假時(shí)的返回結(jié)果。
時(shí)間盲注是當(dāng)服務(wù)器拼接了我們注入的sql語(yǔ)句后,無(wú)論正確與否都會(huì)顯示同樣的回顯。錯(cuò)誤信息被過(guò)濾,可以通過(guò)頁(yè)面響應(yīng)時(shí)間進(jìn)行按位判斷數(shù)據(jù)。由于時(shí)間盲注的函數(shù)在數(shù)據(jù)庫(kù)中進(jìn)行,CTF比賽中為了避免服務(wù)器負(fù)載過(guò)高,時(shí)間盲注的題目比較少。
參考文獻(xiàn)
1.SQL語(yǔ)句入門?https://blog.csdn.net/AtlanSI/article/details/84845002
2.CTF特訓(xùn)營(yíng):技術(shù)詳解、解題方法與競(jìng)賽技巧?https://book.douban.com/subject/35120456/
3.?updatexml()報(bào)錯(cuò)注入_qq_37873738的博客-CSDN博客_updatexml
4. floor()報(bào)錯(cuò):https://www.cnblogs.com/sfriend/p/1