由于有些程序在设定的时候会有关于转义 \ 的严格的防护,此时任何的特殊字符都会被1对1转义,(\ 严格转义)所以此时就出现了绕过(Bypass)的概念, 绕过就是绕过防火墙等防护,使用来攻击的特殊字符能够逃出防护,进而使攻击语句闭合,实现攻击
宽字节注入——使用%df闭合转义符,突破严格防护
可以绕过的情形——当数据库的编码是GBK编码
GBK规定组成汉字的都是一些大字节,故可使用%df使它和转义符 \ 闭合成为一个汉字
(ASCII表示的是到07FH,而用于宽字节注入的这个%df按十进制d是13,f是15,所以称为大字节)GBK编码两个字节表示一个字符,一个字节有8个二进制位;其他编码一般是一个字节表示一个字符
原参数
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1
由于该网站做了严格防护,会1对1进行转义,又因为该网站是GBK编码(一般情况下,看不到代码只能猜)
使用 %df 可使它与转义符合成一个汉字————即此时完成了和转义符的闭合,后续注入如前所述
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df'
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df'-- -
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df'and 1=2 -- -
然后进行Union联合注入测试
测试过程中在爆列名时,由于注入点对特殊字符严格防护,故table_name="users"中的双引号会转义
此时可使用https://www.107000.com/下转换了的hex编码直接替换"users"
在最后爆账号密码的时候,表名不用处理
因为SQL语句只会处理赋值语句————也就是说,只有遇见a=xxx的时候才会1对1转义
在账号密码中间插入hex编码,0x3a————会被解析为冒号,但由于并不是对系统进行赋值,所以不影响
hex编码可表示一个字符串
故可使用在JSON序列化编码下转换了的hex编码直接替换"users"