sql注入分類

匯編工具:http://www.ollydbg.de/

數(shù)據(jù)庫管理工具破解教程:http://m.itdecent.cn/p/e6665db44328

解密解碼工具:http://ctf.ssleye.com/

攻擊工具:http://www.ctftools.com/down/

攻防博客:

https://www.hackjie.com/blog

攻防平臺

https://adworld.xctf.org.cn/task

lsof -i TCP:3307

關(guān)閉SELinux:

setenforce 0

開啟SELinux:

setenforce 1

棧溢出:棧溢出的原理是覆蓋函數(shù)的返回地。函數(shù)調(diào)用過程中,函數(shù)的返回地址保存在棧里面。所以棧溢出的思路就是把棧里面的返回地址覆蓋,然后替換成攻擊者想要的地址。因為棧是往下增加的,先進入棧的地址反而要大,這種機制更方便的提供了漏洞產(chǎn)生的可能性。

緩沖區(qū)溢出的危害:緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運行失敗、系統(tǒng)關(guān)機、重新啟動,或者執(zhí)行攻擊者的指令,比如非法提升權(quán)限。

緩沖區(qū)漏洞對應(yīng)函數(shù):C/C++語言中像strcpy函數(shù)還有strcat()、sprintf()、vsprintf()、gets()、scanf() 以及在循環(huán)內(nèi)的getc()、fgetc()、getchar()等這些常見的函數(shù)都會造成緩沖區(qū)溢出漏洞。

mybatis中的#和$的區(qū)別:

1、#將傳入的數(shù)據(jù)都當成一個字符串,會對自動傳入的數(shù)據(jù)加一個雙引號。

如:where username=#{username},如果傳入的值是111,那么解析成sql時的值為where username="111", 如果傳入的值是id,則解析成的sql為where username="id".

2、$將傳入的數(shù)據(jù)直接顯示生成在sql中。

如:where username=${username},如果傳入的值是111,那么解析成sql時的值為where username=111;

如果傳入的值是;drop table user;,則解析成的sql為:select id, username, password, role from user where username=;drop table user;

3、#方式能夠很大程度防止sql注入,$方式無法防止Sql注入。

4、$方式一般用于傳入數(shù)據(jù)庫對象,例如傳入表名.

5、一般能用#的就別用$,若不得不使用“${xxx}”這樣的參數(shù),要手工地做好過濾工作,來防止sql注入攻擊。

6、在MyBatis中,“${xxx}”這樣格式的參數(shù)會直接參與SQL編譯,從而不能避免注入攻擊。但涉及到動態(tài)表名和列名時,只能使用“${xxx}”這樣的參數(shù)格式。所以,這樣的參數(shù)需要我們在代碼中手工進行處理來防止注入。

【結(jié)論】在編寫MyBatis的映射語句時,盡量采用“#{xxx}”這樣的格式。若不得不使用“${xxx}”這樣的參數(shù),要手工地做好過濾工作,來防止SQL注入攻擊。

根據(jù)數(shù)據(jù)庫返回內(nèi)容是否回顯,可以將 SQL注入分為可回顯注入和不可回顯注入。從名字可以看到,可回顯注入意思是數(shù)據(jù)庫返回的結(jié)果可以在網(wǎng)頁前端看到。不可回顯是無法看到數(shù)據(jù)庫反饋結(jié)果,需要通過其他手段判斷(如時間延遲等)。

可回顯的注入

可回顯的注入包含聯(lián)合查詢注入和報錯注入。下面分別介紹。

1. 聯(lián)合查詢注入

聯(lián)合查詢的名字來自他的查詢方式關(guān)鍵字 UNION。在sql語言的語法中,通過關(guān)鍵字 union可以將聯(lián)合查詢結(jié)果輸出。在可回顯的注入中,通過聯(lián)合查詢我們可以查詢出 數(shù)據(jù)庫信息、數(shù)據(jù)表信息、數(shù)據(jù)字段信息等,是比較簡單易學(xué)、容易理解和上手的注入方法。當一個網(wǎng)頁代碼有如下所示的查詢片段,并將查詢結(jié)果某種方式回顯到界面時,可以進行SQL聯(lián)合注入。

SELECT id FROM users WHERE user_id='$id'

在通常輸入的位置,我們進行修改輸入以下參數(shù),

?id=-1'union+select+1+--+

因為單引號,閉合了前面的單引號,拼接后SQL查詢語句就變成了如下

SELECT id FROM users WHERE user_id='-1'union select 1 --'

服務(wù)器對于加好進行了轉(zhuǎn)義,在用戶查詢頁面輸出了不充分查詢內(nèi)容。在select語句后面,可以查詢的內(nèi)容很多,獲取很多信息。通常需要染過一些特定字符。

2. 報錯注入

報錯注入的原理是利用數(shù)據(jù)庫的某些機制,通過人為制造錯誤條件,將查詢結(jié)果通過錯誤信心顯示出來。MySQL中通常用到 updatexml、floor 和 exp 三個函數(shù)。

首先了解下updatexml()函數(shù)

UPDATEXML (XML_document, XPath_string, new_value);

第一個參數(shù):XML_document是String格式,為XML文檔對象的名稱,文中為Doc

第二個參數(shù):XPath_string (Xpath格式的字符串) ,如果不了解Xpath語法,可以在網(wǎng)上查找教程。

第三個參數(shù):new_value,String格式,替換查找到的符合條件的數(shù)據(jù) 。

當我們輸入一下語句時,

select name from user where id=1 and updatexml(1,concat('~',(select database()),'~'),3);

因為 updatexml的 第一個和第三個參數(shù)不滿足 參數(shù)要求格式,導(dǎo)致concat 后括號的內(nèi)容以報錯形式展示出來。

基于floor函數(shù)的報錯原理,較為復(fù)雜,讀者可以參考 第四個連接。給幾個爆破數(shù)據(jù)庫的payload,

爆破數(shù)據(jù)庫版本信息:

?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

爆破當前用戶:

?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

爆破當前使用的數(shù)據(jù)庫:

?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ù)報錯的原因為溢出報錯。

使用的payload 如下:

2id=1'and exp(-(select*from(select user())x))%23

不可回顯的注入

不可回顯的注入,通常是因開發(fā)者將報錯信息屏蔽或者正確與否存在同樣的回顯導(dǎo)致的,有布爾盲注和基于時間盲注兩種。下面分別介紹。

布爾盲注通常使用有些判斷真假的語句來進行判定。通常在查詢語句后面 添加 and 1=1和 and 1=2 。 因為 1=1 不影響運行,但是1=2為假,沒有正常的回顯。布爾盲注時通常用到的函數(shù)進行了一些總結(jié)

1.截取函數(shù)

substr() 函數(shù)是字符串截取函數(shù),在盲注中我們一般逐位獲取數(shù)據(jù),這時候就需要使用subtr函數(shù)按位截取。使用方法∶substr(str,start,length)。這里的str為被截取的字符串,start為開始截取的位置,length為截substr()取的長度。在盲注時,我們一般只截取一位,如substruser(user(),1),這樣可以從user函數(shù)返回數(shù)據(jù)的第一位開始的偏移位置截取一位,之后我們只要修改位置參數(shù)即可獲取其他的數(shù)據(jù)

left()函數(shù)?是左截取函數(shù),lef的用法為lef(sr,length)。這里的str是被截取的字符串,length為被截取的長度。在育注中可以使用len(user(),1)來左截取一位字符。但是,如果是lef(user(),2),則會將user()的前兩位都截取出來,這樣的話,我們需要在匹配輸出的字符串之前增加前綴,把之前幾次的結(jié)果添加到這次的結(jié)果之前。

right()函數(shù)?是右截取函數(shù)。使用方法與lef 函數(shù)類似,可以參考left函數(shù)的用法rightO

2.轉(zhuǎn)換函數(shù)

ascii()函數(shù)?的作用是將字符串轉(zhuǎn)換為ASCII碼,這樣我們就可以避免在Paylod中出現(xiàn)單引號。使用方法為ascii(char),這里的char為一個字符,在盲注中一般為單個字母。如果 char為一串字符串,則返回結(jié)果ascii()將是第一個字母的ASCII碼。我們在使用中通常與substr函數(shù)相結(jié)合,如 asci(substr(user(),1,1),這樣可以獲得user()的第一位字符的 ASCII碼

Hex()函數(shù)?可以將字符串的值轉(zhuǎn)換為十六進制的值。在ascii函數(shù)被禁止時,或者是需要將二進制數(shù)據(jù)寫人hex()文件時可以使用該函數(shù),使用方法類似于 ascii函數(shù)

3.比較函數(shù)

if()函數(shù)?是盲注中經(jīng)常使用的函數(shù),if函數(shù)的作用與1=1和1=2的原理類似。如果我們要盲注的對象為假,則可以通過if的返回結(jié)果對頁面進行控制。使用方法為if(cond,Ture_result,F(xiàn)alse_resut)其中,cond為判斷條件,Ture_result為真時的返回結(jié)果,F(xiàn)alse_result為假時的返回結(jié)果。

時間盲注是當服務(wù)器拼接了我們注入的sql語句后,無論正確與否都會顯示同樣的回顯。錯誤信息被過濾,可以通過頁面響應(yīng)時間進行按位判斷數(shù)據(jù)。由于時間盲注的函數(shù)在數(shù)據(jù)庫中進行,CTF比賽中為了避免服務(wù)器負載過高,時間盲注的題目比較少。

參考文獻

1.SQL語句入門?https://blog.csdn.net/AtlanSI/article/details/84845002

2.CTF特訓(xùn)營:技術(shù)詳解、解題方法與競賽技巧?https://book.douban.com/subject/35120456/

3.?updatexml()報錯注入_qq_37873738的博客-CSDN博客_updatexml

4. floor()報錯:https://www.cnblogs.com/sfriend/p/1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容