宽字节注入原理分析_1stPeak's Blog-CSDN博客_宽字节注入原理
原理: mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)
php的魔术引号(magic_quotes_gpc)开启,会在特殊字符(比如 ' , " , \ , null)前面加 \ ,导致闭合失败。
\ 作用:mysql中\后面接的字符代表本身字符的意思,比如 \%
SELECT txt1 FROM T1 WHERE txt1 LIKE '_a\%' //本身%代表通配符,但是前面加了\,%代表要找的是a%这个字符串
补充:PHP5.4.0及其之后PHP版本取消了魔术引号,之后转义都需要加上addslashes函数 (stripslashes删除反斜杠\)
魔术引号: 总结3:PHP中的魔术引号_hyh1123176978的博客-CSDN博客
实例:
sqli-32:
http://127.0.0.1/sqli/Less-32/?id=-1%df' union select 1,database(),3 --+
(记住union前面语句要错的,虽然这里我不知道id=1%df'为什么不行,我觉得转义之后为1运,应该不会找到id=1了吧,如果有大佬解答的话就多谢啦)
防御:
宽字节注入原理分析_1stPeak's Blog-CSDN博客_宽字节注入原理
客户端-连接层-服务器各自字符集名称:
转换场景:
(1)在PHP中使用mysql_query(“set names GBK”),3个字符集都为gbk,
%df%27=====(addslashes)======>%df%5c%27======(GBK)======>運’
(2)都为utf-8,但是url直接传入gbk编码
%e5%5c%27====(addslashes)====>e55c5c5c27====(iconv)====>e98ca65c5c27
防御方法:缺一不可
(1)使用mysql_set_charset(GBK)指定字符集
(2)使用mysql_real_escape_string进行转义
原理:mysql_real_escape_string与addslashes的不同之处在于其会考虑mysql_set_charset(GBK)指定的字符集,不会出现前面df和5c拼接为一个宽字节的问题
感谢本文章的链接的作者,侵权私我必删