mysql宽字节数_sql宽字节简介

本文介绍了MySQL宽字节注入的概念,强调了在SQL查询时GBK和UTF-8编码混淆导致的问题。通过示例代码解释了如何利用宽字节注入逃逸`addslashes()`函数的限制,并展示了简单的SQL注入原理。最后提到了通过注入获取数据的方法。
摘要由CSDN通过智能技术生成

宽字节注入其实在SQL注入是一个比较常见的注入,但是有时候很长时间没有遇到宽字节注入,突然出现了一个宽字节注入,就是返回去翻资料,还不如自己写篇文章记录一下。宽字节的注入,sqlmap也是无法识别出来的。

需要说明的是,本文的资料主要是来自于P神的浅析白盒审计中的字符编码及SQL注入,只是对其中内容稍有修改。

简介

在将sql宽字节注入之前,需要对字符编码有所了解,常见的gbk、utf-8、unicode编码,但这不是本文的重点,如果想详细了解字符编码的知识,可以参考文章,这篇文章应该说明得很清楚。

本质上sql的宽字节注入就是使用mysql进行SQL查询时,用错了gbk和utf-8的编码而导致出现的问题。通常来说,一个GBK编码的汉字占用2个字节,一个utf8的汉字占用3个字节。这样也可以换个说法,当使用GBK编码时,是将2个字节解释为一个汉字,当使用的是utf8的编码时,是将3个字节解释为一个汉字。

以上这就是宽字节注入的背景知识了。

实例代码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24<?php

//连接数据库部分,注意使用了gbk编码

$conn = mysql_connect('localhost', 'root', 'root') or die('bad!');

mysql_query("SET NAMES 'gbk'");

mysql_select_db('test', $conn) OR emMsg("连接数据库失败,未找到您填写的数据库");

//执行sql语句

$id = isset($_GET['id']) ? addslashes($_GET['id']) : 1;

$sql = "SELECT * FROM news WHERE tid='{$id}'";

$result = mysql_query($sql, $conn) or die(mysql_error());

?>

新闻

$row = mysql_fetch_array($result, MYSQL_ASSOC);

echo "

{$row['title']}

{$row['content']}

\n";

mysql_free_result($result);

?>

SQL 语句是 SELECT * FROM news WHERE tid='{$id}',就是根据文章的 id 把文章从

news 表中取出来。其中{$id},表示会解析$id的内容,同时还在外外面加上'',因为这是一个字符串的查询。

在查询之前存在addslashes()函数,此函数主要使用对单引号(’)、双引号(”)、反斜线(\)与 NUL(NULL 字符)进行转义,这样用户输入的单引号就无用了。如下所示:

be6dd1b675b96f2eade0ff9f3cf3e234.png

可以看出,在加了'之后,对最后的结果没有影响。

为什么会这样呢?在两种情况下的,SQL注入语句分别为:

1

2SELECT * FROM news WHERE tid='1'

SELECT * FROM news WHERE tid='1\''

通过转义符\将'进行转义,所以对结果没有影响。

逃逸addslashes

那么怎么逃过 addslashes 的限制?众所周知 addslashes 函数产生的效果就是,让’变成’\’,

让引号变得不再是“单引号”,只是一撇而已。一般绕过方式就是,想办法处理\’前面的\:

想办法给\前面再加一个’\’(或单数个即可),变成\\' ,这样\被转义了,'逃出了限制

想办法把\弄没有。

而宽字节注入的方式就是消除掉\。上面的代码中使用的是GBK编码,意味着是将2个字节看成一个汉字。如果我们传入的id为%df',结果为:

890cc64951c897140e83ac1bd1afe155.png

分析出现这个错误的原因。

输入了%df'会被addslashes转义为%df\'。\的hex编码为5c,最后就会变为%df%5c'。因为gbk编码认为2个字节是一个汉字,所以%df%5c就被解释为運,'就逃逸出来了。最后SQL语句就变为:

1SELECT * FROM news WHERE tid='運''

这样就会报错了,这就是一个简单的SQL注入的原理。

需要说明的是,本文是从P神的文章那里大量复制过来的,仅仅是为了记录和学习。如果相对宽字节注入更深层次的了解,可以去看P神的原文浅析白盒审计中的字符编码及SQL注入。

注入拿数据

在消灭了\之后,就可以通过进行SQL注入拿到数据了。

以上面的代码为例来进行说明,最终的payload为

1-1%df' union select 1,2,flag from flag%23

这样最终执行的SQL注入语句为:

1SELECT * FROM news WHERE id='-1運' union select 1,2,flag from flag#'

但是出现了如下的问题:

9b94cdf45687fbc8965af9c9b23240cb.png

这样应该是编码的问题,将flag使用hex编码一下。

最终使用-1%df' union select 1,2,hex(flag) from flag%23

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值