数据库
首页 > 数据库> > sql注入-宽字节注入

sql注入-宽字节注入

作者:互联网


title: sql注入-宽字节注入

尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范。但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如gbk,作为自己默认的编码类型。也有一些cms为了考虑老用户,所以出了gbk和utf-8两个版本。我们就以gbk字符编码为示范,拉开帷幕。gbk是一种多字符编码,具体定义自行百度。但有一个地方尤其要注意:
通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。在php中,我们可以通过输出
echo strlen(“和”);
来测试。当将页面编码保存为gbk时输出2,utf-8时输出3。除了gbk以外,所有ANSI编码都是2个字节。ansi只是一个标准,在不用的电脑上它代表的编码可能不相同,比如简体中文系统中ANSI就代表是GBK。

宽字节注入的原理:mysql 在使用 GBK 编码的时候,会认为两个字符为一个汉字,例如%aa%5c 就是一个汉字(前一个 ascii 码大于 128 才能到汉字的范围)。我们在过滤 ’ 的时候,往往利用的思路是将 ‘ 转换为 \’ (转换的函数或者思路会在每一关遇到的时候介绍)。因此我们在此想办法将 ‘ 前面添加的 \ 除掉,一般有两种思路:

1、%df 吃掉 \ 具体的原因是 urlencode(‘) = %5c%27,我们在%5c%27 前面添加%df,形成%df%5c%27,而上面提到的 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,此事%df%5c 就是一个汉字,%27 则作为一个单独的符号在外面,同时也就达到了我们的目的。

2、将 \’ 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 的情况,后面的%5c 会被前面的%5c给注释掉。这也是 bypass 的一种方法。

实站宽字节注入靶场:

http://127.0.0.1/sqli-labs/Less-32/?id=-1%df%27union%20select%201,user(),3--+

这里的%27是单引号(’),数据库会自动实施转义,将单引号转义为%5c%27(’)在前面加%df与%5c形成一个汉字,从而留下%27(单引号)进行闭合。

回显表示我们绕过了对于 ’ 的防护,接下来看一下源码。

可以看到源码对于单引号(’),反斜杠()进行转义,单引号转为 ’ ,反斜杠转为 \ ,双引号转为 "\ 。所以我们选择第一个思路,利用%df与%5c组成一个汉字吃掉%5c。

从回显也可看到%df%5c变成了一个字符。

显错注入

获取所有数据库与当前使用数据库

获取表,这里需要注意一点,这里table_schema='security’中对单引号过滤的方式%df%27和%**%5c%5c%27好像起不了作用,所以这里我用database()代替。

http://127.0.0.1/sqllib/less-32/?id=-1%df%27union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+


得到表,爆出数据。

addslashes()函数

函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(’)
双引号(")
反斜杠(\)
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。Addslashes()函数和之前实现的功能基本一致的,所以我们依旧可以利用%df 进行绕过。
Notice:使用 addslashes(),我们需要将 mysql_query 设置为 binary 的方式,才能防御此漏洞。

Mysql_query(“SET character_set_connection=gbk,character_set_result=gbk,character_set_client=binary”,$conn);

以上就是宽字节注入的基本内容。

标签:编码,27,字节,gbk,5c%,sql,5c,注入
来源: https://blog.csdn.net/mochu7/article/details/100039129