sql注入_1-8_宽字节注入
文章目錄
- 一.sql_寬字節(jié)注入概念
- 二.sql_寬字節(jié)注入源碼分析
- 三.sql_寬字節(jié)注入演示
- 四.sql_寬字節(jié)注入總結(jié)
一.sql_寬字節(jié)注入概念
1.了解寬字節(jié)注入前,必須先了解字符集編碼:點擊這里
2.gbk占用兩個字節(jié),ascll占用一個字節(jié),php編碼為gbk,
函數(shù)執(zhí)行添加的是ascll編碼,
mysql默認字符集是gbk等寬字節(jié)字符集。
%DF’ :會被PHP當中的addslashes函數(shù)轉(zhuǎn)意%DF\’,"\" 既是url中的"%5C", 也就會被轉(zhuǎn)成"%DF%5C%27",如果網(wǎng)站的字符集是GBK,mysql也是gbk,就認為%DF%5C%27是一個寬字節(jié),也就是"縗"
我們理清一下思路
<1>.既然被addslashes函數(shù)轉(zhuǎn)意,多了一個,所以我們就要想辦法去掉他,或者讓他無法轉(zhuǎn)義’
.<2>mysql使用gbk編碼時,兩個字符是一個漢字(也就是一個漢字占2個字節(jié))
<3>.當我們使用%DF’ 時,就變?yōu)榱?font color="blue">%DF%5C%27,而%DF%5C,剛好是兩個字符,這兩個字符合起來也就變成了中文"縗",此時我們發(fā)現(xiàn)我們就逃出了\ ,所以我們就可以進行探測了
3.最常用的寬字節(jié)注入利用%df,只要ascii碼大于128就可以了,比如ASCII碼為129(十進制)轉(zhuǎn)化為十六進制,
gbk首字母對應(yīng)0x81-0xFE ,尾部對應(yīng)0x40-0xFE(除了0x7F)
所以只要在這個范圍都可以,比如0xbf 一樣可以,也就是%bf’
二.sql_寬字節(jié)注入源碼分析
1.介紹兩個函數(shù)
這里是借鑒大佬的總結(jié)
addslashes()函數(shù),這個函數(shù)在遇到意前,添加反斜杠\,
預(yù)定義:單引號’ 、雙引號"、反斜杠\、和空值,這個函數(shù)有一個特點,雖然加\轉(zhuǎn)義,但是\并不會插入數(shù)據(jù)庫中, 這個函數(shù)的功能和魔術(shù)引號完全相同,當打開了魔術(shù)引號時,不應(yīng)該使用這個函數(shù)。
mysql_real_escape_string()函數(shù),這個函數(shù)用來轉(zhuǎn)義sql語句中的特殊字符x00 ,\n,\r,,等
魔術(shù)引號:當打開時,所有的單引號’、雙引號"、反斜杠\ 和 NULL 字符都會被自動加上一個反斜線來進行轉(zhuǎn)義,這個和 addslashes()函數(shù)的作用完全相同。所以,如果魔術(shù)引號打開了,就不要使用addslashes()函數(shù)了。一共有三個魔術(shù)引號指令。
magic_quotes_gpc 影響到 HTTP 請求數(shù)據(jù)(GET,POST 和 COOKIE)。不能在運行時改變。在 PHP 中默認值為 on。
參見 get_magic_quotes_gpc()。 magic_quotes_runtime 如果打開的話,大部份從外部來源取得數(shù)據(jù)并返回的函數(shù),包括從數(shù)據(jù)庫和文本文件,所返回的數(shù)據(jù)都會被反斜線轉(zhuǎn)義。該選項可在運行的時改變,在 PHP 中的默認值為 off。
參見 set_magic_quotes_runtime() get_magic_quotes_runtime()。 magic_quotes_sybase 如果打開的話,將會使用單引號對單引號進行轉(zhuǎn)義而非反斜線。此選項會完全覆蓋 magic_quotes_gpc。如果同時打開兩個選項的話,單引號將會被轉(zhuǎn)義成 ‘’。而雙引號、反斜線 和 NULL 字符將不會進行轉(zhuǎn)義。 如何取得其值參見 ini_get()
2.看看 less-33 源碼
1.使用了addslashes函數(shù)過濾
2.使用了gbk編碼
3.傳入sql語句
3.看看less-32源碼
可以看到轉(zhuǎn)義了固定字符
問題來了,當程序員使用了gbk編碼時,并且過濾不全面時,是很有可能被繞過的,所以最好使用預(yù)編譯來防御,
好,既然我們看了源碼,我們往下測試less-33,less-32
三.sql_寬字節(jié)注入演示
打開less-33
輸入?id=1’
看看語句,發(fā)現(xiàn)和我們學(xué)的概念一模一樣
因為addslashes函數(shù),而多了個\
想辦法去掉他,
使用%df’
在url中就變?yōu)榱?DF%5C%27
所以兩個字節(jié)算一個漢字,所以就變成了 縗’
就繞過了
就報錯了
所以應(yīng)該存在寬字節(jié)注入
我們使用–+閉合
返回正常
因此,更加證明存在寬字節(jié)注入
使用order by 推測字段,3時返回正常,所以存在3個字段
使用union select 聯(lián)合查詢語句,爆出存在注入的字段
加入database()
可以看到數(shù)據(jù)庫名就出來了
接下就可以繼續(xù)探測了,具體 就不寫了
我們打開less-32
使用其他gbk編碼范圍的探測
一樣報錯
說明可能存在寬字節(jié)注入
–+閉合
正常
再次證明存在
接著就可以使用其他sql語句探測了
四.sql_寬字節(jié)注入總結(jié)
1.當發(fā)現(xiàn)寬字節(jié)注入時可以使用sqlmap探測在參數(shù)后面加一個%df就可以。
2.寬字節(jié)注入的防御,應(yīng)該使用預(yù)編譯方法,否則,很有可能被繞過
總結(jié)
以上是生活随笔為你收集整理的sql注入_1-8_宽字节注入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql注入_1-7_绕过注入
- 下一篇: dvwa_xss_储存型