在php中,magic_quotes_gpc这个函数为on时,就开启了转义功能,另外addslashes和mysql_real_escape_string也可以实现转义功能。可转移的的内容包括:单双引号、反斜杠、NULL字符。
宽字节注入过滤原理:
php发送请求到mysql时经过一次gbk编码,php会获取到数据进行魔术引号的处理。因为gbk时双字节编码,所以我们提交的"%df"这个字符和转义的反斜杠组成了新的汉字,然后数据库处理时是根据GBK去处理的,这个时候单引号就逃逸了出来。
宽字节注入绕过原理:
我们提交的数据会被加入"\","\"的编码是"%5c",我们在前面加上"%df"就变成了”%df%5c“,这个时候就变成了繁体字"運",变成了一个多个字节的字符。
为什么最后的查询语句表名要用16进制编码?
因为要用到单引号,会对查询产生影响,单引号会被加上反斜杠。
宽字节注入不是报错注入,且宽字节注入适合所有场景。
'admin'处除了16进制绕过外还有什么方法?
还可以通过子查询的方式绕过,将原来查询的'admin'换成
(select table_schema from information_schema.tables where table_schema=database() limit 0,1)
解决思路
1.判断是否转义 2.使用字符让其与\形成一个汉字 3.判断是否存在SQL注入 4.判断有几个字段 5.爆破库名 6.爆破表名 7.爆破字段名 8.爆破字段值宽字节注入(一)
第一关:
输入单引号,发现被转义了
尝试闭合掉转义字符
判断是否存在SQL注入
http://inject2.lab.aqlab.cn/Pass-15/index.php?id=1%df' and 1=1-- qwe http://inject2.lab.aqlab.cn/Pass-15/index.php?id=1%df' and 1=2-- qwe
判断字段数
将china_flag要转成十六进制
第二关
判断是否有注入
在利用布尔盲注就可以了,或者是联合查询