php宽字节注入,SQL注入之宽字节注入(MySQL)

0x00 应用场景

在注入时通常会使用单引号、双引号等特殊字符。在应用中,通常为了安全,开发者会开启php的magic_quotes_gpc,或者使用addslashes、mysql_real_escape_string等函数对客户端传入的参数进行过滤,则注入的单引号或双引号就会被"\"转义,但是,如果服务端的数据库使用的是GB2312、GBK、GB18030等宽字节的编码时,则依然会造成注入。

0x01 测试代码

$conn = mysql_connect('localhost','root','root');

mysql_select_db('messages',$conn);

if (isset($_GET['id'])) {

$id = addslashes($_GET['id']); //转义id

$sql = "select * from msg where id='$id';";

echo $sql."
";

$result = mysql_query($sql);

$rows = @mysql_fetch_assoc($result);

if ($rows) {

echo '

foreach ($rows as $key => $value) {

echo '

';

echo '

'.$key.'----'.$value.'';

echo '

';

}

echo '

';

} else {

echo mysql_error();

}

} else {

echo "please input id.";

}

?>

php宽字节注入,SQL注入之宽字节注入(MySQL)_第1张图片

0x02 宽字节注入原理

当MySQL使用的是GBK编码时,0xbf5c会被当做一个字符(双字节字符),其中5c是"\"

当注入语句为http://127.0.0.1/test.php?id=2%bf'时

在数据库中bf会和转义符"\"形成一个双字节字符"縗",从而单引号逃逸

php宽字节注入,SQL注入之宽字节注入(MySQL)_第2张图片

php宽字节注入,SQL注入之宽字节注入(MySQL)_第3张图片

若未作声明则文章版权归本人(@reber)所有,转载请注明原文链接:

你可能感兴趣的:(php宽字节注入)