SQL注入詳細講解概括—寬字節注入
1、寬字節注入原理
2、寬字節注入方法
一、寬字節注入原理
What is 寬字節?
字符大小為一個字節時為窄字節
字符大小為兩個及以上的字節為寬字節
英文26個字符所以1個字節就夠用了,而漢字字符數太多,一個字節顯然不夠用
寬字節注入原理
為了防止網站被SQL注入,一些網站開發人員會做一些防護措施,其中最常見的就是對一些特殊字符進行轉義
通過以前的文章,能夠了解到,sql注入非常關鍵的一步就是讓引號閉合和跳出引號,無法跳出引號 ,那么你輸入的內容就永遠在引號里,那么你輸入的東西永遠就是字符串,很顯然這不符合sql注入的要求,,
So,網站開發者也想到了這一步,於是乎,做個防護補救,>>>> 轉義,,對輸入的敏感內容、特殊字符進行轉義,,PHP里有個轉義符 “\” 反斜杠
PHP的防御函數
magic_qutes_gpc(魔術引號)
magic_qutes_gpc函數在php中的作用是解析用戶提交的數據,如有:post、get、cookie過來的數據增加轉義符“\” 以確保這些數據不會引起程序錯誤
轉義符的 作用:去除特殊意義,只把字符當作字符串進行理解
要理解注意的一個點,就是轉義符自動的出現在輸入的特殊字符前面:
輸單引號>>> ' >>> 有了轉義符 >>> \'
要注意轉義符是 出現在前面的,,非常重要,,有助於理解后面的內容
ok,,那么 我們輸入的引號被轉義之后只當作了一個字符串,無法實現包裹字符串的作用了
那么怎么解決,,讓轉義(\)失去轉義的作用,,
ok,,讓轉義失去作用的方法就是寬字節注入
so,,How does it lose its function?
Frist,you know,寬字節編碼
寬字節編碼就是 一個字符可能是好幾個字節
ok,,,想一個問題,,中國的漢字,,偏旁部首,,
eg:和 由禾+口 組成,
那么,禾+口 >>> 和 這個過程的兩個字組成了一個字,既沒有了禾的意思也沒有了口的意思 變成了和的意思
那 讓轉義符失去轉義作用的方法 於這個漢字方法 可以說是異曲同工之妙
\ >>> 轉義通過編碼是 >>> %5c
那么 找到一個與 %5c 的另一半 讓他們組成一個新字符不就 OK了嗎
哪個字節編碼能讓他們組成一個新字符呢 很多 eg:%df ......
>>> %df%5c
這兩個在一塊就組成了一個新的字符,准確的說是一個漢字,那么我們輸入的引號的特殊意義就存在,可以是包裹字符串的了
PS:只有是中文編碼的數據庫才可以這樣
二、寬字節注入方法
GET傳參的寬字節注入
so easy 在引號前加個%df 之后就進行正常的注入就行了
POST傳參的寬字節注入
需要借助工具burp,抓包,改包來進行
第一步,正常寫入注入語句 ,一般是在引號前寫一個字符,並知道此字符對應的ascii碼值,方便在包里找到輸入數據 ,我比較喜歡用小寫a >>>a對應的ascii碼值是61
第二步,打開burp進行抓包,在Proxy一欄下的Itercept,點擊Hex,找到你輸入的內容,綠框里就是,找到引號前的哪個字符,我寫的是a,對應的是61,,可以看到有兩個61,因為在這一行中,在我輸入的前面還有一個name 這里面有一個a 都是按順序一一對應來的,我們只需要修改第二的個61即可,,雙擊61,,改為df ,,回車,,放數據包,,搞定