宽字节注入

发布于 2022-03-16  68 次阅读


首先了解一下编码

GBK编码    GBK全称《汉字内码扩展规范》,GBK 编码中,中文字符占 2 个字节,英文字符占 1 个字节;
UTF-8编码  UTF-8 编码中,中文字符占 3 个字节,英文字符占 1 个字节;

当网站使用的是GBK编码,并且用户的参数可以传到数据库中,就可能存在宽字节注入。

了解PHP中相关函数(魔术引号)

magic_quotes_gpc(魔术引号开关)

(GPC, Get/Post/Cookie)

该函数可以将从页面用户提交的信息,有GET、POST、COOKIE的值,并将其中的特殊字符进行转义

比如 '会被替换成\'

什么是宽字节?

宽字节就是两个以上的字节。

宽字节注入的原理?

宽字节注入是在当网站采用的是GBK编码的时候,并且后端对于用户的输入进行了转义字符函数时,通过注入的参数与转义字符\进行组合,形成了宽字节字符,从而使得用户\失效,达到注入的目的。

举例:

sql语句select * from uesrs where username='$username' and password='$password'

当注入$username=admin''时就会被转义成$username=admin\''

如果我们输入的时$username=admin%df'',并且网站是GBK编码的时候,那么%df和转义字符\就会被当成一个汉字字符,而后面的单引号就会生效

这是为什么呢?就是GBK编码的问题,因为\的url编码是%5c,加上%df组成%df%5c而这个在GBK编码中就是汉字

当然也不一定非得是%df,也可以是其他的字符,只要使得其和转义字符组成一个字符就可以

image-20211208212447540

如图,也可以使用%de,则组成的汉字就是

了解了宽字节注入的原理,开始进行靶场实操。

靶场实操

0x00 Rank 1

image-20211208212844374

第一关get传参,看一下特殊字符转义的效果

image-20211208213038570

可以看到我输入的单引号被替换\',这就是因为单引号被转义

然后传入%df

image-20211208213247288

可以看出,语句执行正常,说明转义字符失效了。正常的显错注入

image-20211208213401778

有三列

image-20211208213431158

2,3位置为显示位

image-20211208213457471

数据库名 widechar

image-20211208213615392

widechar数据库下存在两个表china_flag,user

查看china_flag表中字段

image-20211208214400329

查出两个字段Id,C_Flag,查看C_Flag数据

image-20211208215715356

第一关结束

源码分析

$username = '';
$password = '';
@$id = addslashes($_GET['id']);
@$sql = 'select *from user where id=\''.$id.'\'';
mysqli_select_db($conn,'****');// 不想让你们知道库名
mysqli_query($conn,"SET NAMES gbk"); //关键语句,设置编码mysql编码为GBK
$result = mysqli_query($conn,$sql);
while ($row = mysqli_fetch_array($result)){  
$username = $row['username'];
$password = $row['password'];
}
echo 'Your Login name:'.$username;
echo 'Your Password:'.$password;

0x01 Rank 2

image-20211208220940284

第二关闭合方式为双引号闭合加单括号("")

%df") union select 1,group_concat(C_Flag),3 from china_flag -- qwe
image-20211208221559252

0x02 Rank 3

image-20211208221619668

第三关是POST注入,闭合方式是('')

image-20211208222245648

尝试了一下,?????怎么没有闭合!抓包尝试一下

image-20211208231441539

啊,这样可以,嗯?竟然还是盲注!好吧,继续找数据

1%df') or 1=1 and length(database())=§1§ -- qwe
image-20211208232447959

数据库名长度为8

image-20211208233003589

数据库名是 119 105 100 101 99 104 97 114 即 widechar

image-20211208234327503

数据库中只有两个表

image-20211208233528336

第一个表 99 104 105 110 97 95 102 108 97 103 即 china_flag

image-20211208233939108

第二个表 117 115 101 114 user

1%df') or 1=1 and (select count(column_name) from information_schema.columns where table_schema=database() and table_name=(select table_name from information_schema.tables where table_schema=database() limit 1,1))=3 -- qwe
image-20211208234913828

有三个字段

image-20211209080222900

第一个字段 73 100 即 Id

image-20211209080435607

第二个字段 67 95 70 108 97 103 即 C_Flag,查该字段

image-20211209082847181

第一个数据 122 75 97 81 45 87 105 100 101 即 zKaQ-Wide

image-20211209082941600

第二个数据 122 75 97 81 45 67 65 73 75 即 zKaQ-CAIK

image-20211209083243759

第三个数据 122 75 97 81 45 75 122 106 43 109 122 即 zKaQ-Kzj+mz


本当の声を響かせてよ