php中MYSQL数据库,如果是GBK编码.一定要小心GBK宽字节编码漏洞
宽字节注入
sql注入中的宽字节国内最常使用的gbk编码,这种方式主要是绕过addslashes等对特殊字符进行转移的绕过。反斜杠()的十六进制为%5c,在你输入%bf%27时,函数遇到单引号自动转移加入\,此时变为%bf%5c%27,%bf%5c在gbk中变为一个宽字符“縗”。%bf那个位置可以是%81-%fe中间的任何字符。不止在sql注入中,宽字符注入在很多地方都可以应用
看代码 inject.php文件
$sql = "SELECT * FROM user WHERE user='{$user}'";
$rs = $db->select($sql);
正常情况下 magic_quote_gpc 为ON,如果输入
http://www.phpff.com/safe/inject.php?user=11′ and 1=2 #
SQL语句就会变成
SELECT * FROM user WHERE user='1\' and 1=2 #'
自动加上了\转义,如果构造特殊的宽字节编码呢?
http://www.phpff.com/safe/inject.php?user=11%df%27 and 1=2 #
SQL语句就变成
SELECT * FROM user WHERE user='11運' and 1=2#'
是不是注入上了。
那么11%df会被解析成 11運,而 %27被邪恶的解析成 '就绕过了gpc转义,就构造注入了
解决办法:
1.把原来的set names gbk 改成
mysql_set_charset("gbk", $this->conn);
2.使用mysql_real_escape_string过滤参数
$user = mysql_real_escape_string($user);