搜索
查看: 2084|回复: 0

Mysql宽字节注入

[复制链接]

674

主题

981

帖子

2485

积分

管理员

本论坛第一帅

Rank: 9Rank: 9Rank: 9

积分
2485

热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2018-5-19 15:23:37 来自手机 | 显示全部楼层 |阅读模式
现在大多数的网站对于SQL注入都做了一定的方法,例如使用一些Mysql中转义的函数addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种是配置magic_quote_gpc,不过PHP高版本已经移除此功能。其实这些函数就是为了过滤用户输入的一些数据,对特殊的字符加上反斜杠“\”进行转义,这里讨论一下利用宽字节注入绕过这些函数。
字符集简介
GBK是一种多字符的编码,通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。当将页面编码保存为gbk时输出2,utf-8时输出3。除了gbk以外,所有ANSI编码都是2个字节。现在我们来研究一下SQL注入中,字符编码带来的问题。

开始测试
0x01 Mysql中宽字节注入
实例代码如下:
 <?php
//连接数据库部分,注意使用了gbk编码,把数据库信息填写进去
$conn = mysql_connect('localhost', 'root', '07191226') or die('bad!');
mysql_query("SET NAMES 'gbk'");
mysql_select_db('test', $conn) OR die("连接数据库失败,未找到您填写的数据库");
//执行sql语句
$id = isset($_GET[zxsq-anti-bbcode-'id']) ? addslashes($_GET[zxsq-anti-bbcode-'id']) : 1;
$sql = "SELECT * FROM news WHERE tid='{$id}'";
$result = mysql_query($sql, $conn) or die(mysql_error()); //sql出错会报错,方便观察
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="gbk" />
<title>新闻</title>  
</head>
<body>
<?php
$row = mysql_fetch_array($result, MYSQL_ASSOC);
echo "<h2>{$row[zxsq-anti-bbcode-'title']}</h2><p>{$row[zxsq-anti-bbcode-'content']}<p>\n";
mysql_free_result($result);
?>
</body>
</html>
 <?php
//连接数据库部分,注意使用了gbk编码,把数据库信息填写进去
$conn = mysql_connect('localhost', 'root', '07191226') or die('bad!');
mysql_query("SET NAMES 'gbk'");
mysql_select_db('test', $conn) OR die("连接数据库失败,未找到您填写的数据库");
//执行sql语句
$id = isset($_GET[zxsq-anti-bbcode-'id']) ? addslashes($_GET[zxsq-anti-bbcode-'id']) : 1;
$sql = "SELECT * FROM news WHERE tid='{$id}'";
$result = mysql_query($sql, $conn) or die(mysql_error()); //sql出错会报错,方便观察
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="gbk" />
<title>新闻</title>  
</head>
<body>
<?php
$row = mysql_fetch_array($result, MYSQL_ASSOC);
echo "<h2>{$row[zxsq-anti-bbcode-'title']}</h2><p>{$row[zxsq-anti-bbcode-'content']}<p>\n";
mysql_free_result($result);
?>
</body>
</html>

在这个语句中,使用了addslashes函数,将我们输入的$id进行了转义。
现在我们对这个脚本进行SQL注入测试,先加上一个单引号:
|center

正常的显示,没有报错,说明addslashes起到了作用,我们的单引号被转义了,没有起到作用。这个时候如果想要逃过addslashes的限制,我们有两种办法:

1.想办法让\前再加一个\,这样就成了\‘,\被转义,‘逃出了限制;
2.先办法把\弄没有。
这里就可以利用宽字节注入来进行绕过,mysql在使用GBK编码的时候,会认为两个字符是一个汉字,当我们输入%df的时候:
|center
发现出现了报错,说明我们的语句已经影响了正常语句的执行了,可以注入了。这里为什么加一个%df就可以了呢?因为这是mysql的一种特性,GBK是多字节编码,它认为两个字节就代表一个汉字,在%df加入的时候会和转义符\,即%5c进行结合,变成了一个“摺保???右萘顺隼础
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表