說在開頭:文章是我通過查詢資料後按照自己的理解總結出來的,所以如果有說法不對的地方,歡迎大佬指正~
寬字節注入攻擊可以說是SQL注入的進階攻擊方式,在我之前列出的學習計劃體系中,前面的union聯合查詢注入攻擊、布爾盲注、報錯注入、時間盲注這幾種常見的SQL注入方式,在我之前的博客中已經分析過了,那麼今天在下面這些進階的SQL注入方式中,要翻牌的就是寬字節注入。
原理講解
接下來的講解,將以問答的方式來呈現我對寬字節注入的理解,希望讀我這篇文章的朋友也有所收穫。
1.什麼叫寬字節注入?
先不忙着深入分析,我們先從整體上知道寬字節注入到底是指什麼。按我的理解來總體概述一下:
【MySQL是用的PHP語言,然後PHP有addslashes()等函數,這類函數會自動過濾 ’ ‘’ null 等這些敏感字符,將它們轉義成’ ‘’ \null;然後寬字節字符集比如GBK它會自動把兩個字節的字符識別爲一個漢字,所以我們在單引號前面加一個%df,從而使單引號逃逸。】
2.什麼情況下存在寬字節注入?
寬字節的注入條件有兩個:
1.數據庫編碼設置成GB系列
- 這裏說的GB系列編碼,不是指PHP頁面的編碼,而是連接數據庫使用的編碼。
2.使用了轉義函數,將GET、POST、cookie傳遞的參數進行過濾,將單引號、雙引號、null等敏感字符用轉義符 \ 進行轉義。
- 常見的包括addslashes()、mysql_real_escape_string()函數。
- 轉義函數的轉義作用,就是我們常說的“過濾機制”。
當兩個條件都滿足時,纔會存在寬字節注入。
3.具體原理:
1.通過前面的SQL注入實驗可以發現,字符型的注入點我們都是用單引號來判斷的,但是當遇到addslashes()時,單引號會被轉義成 ’ ,導致我們用來判斷注入點的單引號失效。
所以我們的目的就是使轉義符 \ 失效、使單引號逃逸。
2.我們通過URL編碼來分析,首先先看看這些特殊符號的URL編碼:
3.我們的payload的是【%df '】,其原理是當MySQL在使用GBK編碼的時候,會認爲兩個字符是一個繁體漢字,然後讓我們的單引號%27成功逃逸:
至於字符、字符集、編碼、寬字節等的定義,我這裏就不花時間講了,我們的重點放在寬字節注入上。