sqli-labs(十四)(宽字节注入)
数据库使用gbk编码的时候,会将两个字符合并成一个中文。
写在前面吧,对php的代码审计也会有帮助
直接使用 set character_set_client=gbk 或者是常见的mysql_query("SET NAMES gbk");
都会存在款字节注入。
官方推荐使用Mysql_set_charset('gbk','$conn'),但是也不是完全就没有问题了
推荐使用mysql_query("SET NAMES gbk");
后set character_set_client=binary。
第三十二关:
这关是宽字节注入漏洞,特殊值字符如单引号都会被转义 ' -> \'
原理我有点说不清楚:通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。在php中,我们可以通过输出echo strlen("中");页面编码为gbk时输入2,utf-8时输入3;mysql在使用GBK编码的时候,会认为两个字符为一个汉字,例如%df%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我们在过滤 ' 的时候,往往利用的思路是将 ' 转换为 \' 。所以如果我们输入%df%27(%27就是单引符号会被转义成\' 也就是%5c%27),在后台%df会将%5c“吃掉”,组成一个汉字(%df%5c是一个汉字)。
输入?id=1%df%27,页面会报错说明单引符号起作用了。
输入?id=%df%27 union select 1,2,3 %23
第三十三关:
后台使用的addslashes()做的过滤,绕过手法和上面完全一样
第三十四关:
和第三十三关一样,只是将get请求换成了post请求。
第三十五关:
连引号都不需要用了,直接联合注入就好,不知道这关为什么要这样,没摸清用意。
第三十六关:
使用的是mysql_real_eacape_string(),会比addslashes多过滤些东西
还是可以使用宽字节注入。
第三十七关:
将第三十六关的get请求转成了post请求。