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.";
}
?>
0x02 宽字节注入原理
当MySQL使用的是GBK编码时,0xbf5c会被当做一个字符(双字节字符),其中5c是"\"
当注入语句为http://127.0.0.1/test.php?id=2%bf'时
在数据库中bf会和转义符"\"形成一个双字节字符"縗",从而单引号逃逸
若未作声明则文章版权归本人(@reber)所有,转载请注明原文链接: