We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 12131
    • 9 Posts
    Web Login時のユーザ名が汚染されたままのようです

    request an accountの画面で、
    User name を、例えば<strong>strong
    としてWEBユーザー登録します。
    その名前でログインして、ブログ記事にコメントすると、それ以降が全部太字になります。

    それと、ユーザ名の文字数制限が、FORMのmaxlength="15" という指定だけの
    ようなので、やり方によっては長文のコードも入力可能な危険状態です。

    あと、コメント投稿後、ブラウザをリロードすると連続書き込み可能です。

    悪意を持ったWebユーザーなら、いろんな攻撃ができてしまいそうです shocked

    私の環境は、MODx0.9.2.1をクリーンインストールしたものに、NewsListing 6.4.2を入れただけです。
    UTF-8で運用してます。
    みなさまのバージョンではいかがでしょう?

    それと、コメントの消し方がわからない huh
      • 12131
      • 9 Posts
      自己レスですみません、
      ザッとソースを追ってみただけなので不確かですが、どうやらWebSignupの問題のようでした。
      0.9.2.1に同梱されてる、websignup.inc.phpですが、
      	$username = $modx->db->escape($_POST['username']);
      	$fullname = $modx->db->escape($_POST['fullname']);
      	$email = $modx->db->escape($_POST['email']);
      	$password = $_POST['password'];
      	$country = $_POST['country'];
      	$state = $_POST['state'];
      	$zip = $_POST['zip'];
      	$formcode = $_POST['formcode'];

      のようになってまして、『escape』は、dbapi.mysql.class.inc.phpの、
         function escape($s) {
            if (function_exists('mysql_real_escape_string') && $this->conn) {
               $s = mysql_real_escape_string($s, $this->conn);
            } else {
               $s = mysql_escape_string($s);
            }
      
            return $s;
         }

      のことだと思いますので、$username、$fullname、$emailに関してのみ、SQLインジェクションは防げてるとは思いますが、$country 、$state、$zipなどはSQLインジェクション攻撃可能です。
      あと、htmlやjavascriptのコードのエスケープや、文字数制限がなされてないようです。
      (emailの文字列チェックはされてました)
      適当に入力したemail宛に、ユーザ名として架空請求URL付きのメールを送信できてしまいます。
      ユーザ名やパスワードが、httpから始まるものを消すとかの処理も必要かもです。

      一般ユーザが入力できるFORMの値は、どんな値でも送信できてしまうので、全て疑ってかかるべきだと思います。
      力不足で、MODxのコードを書くときの決まりごとや英語力がないもので、これ以上は何にもできないところがお恥ずかしい限りです :’(
        • 8382
        • 253 Posts
        素晴らしいです。 shocked

        そういえば、MODxタグとjavascriptに関しては入力チェックしているようなのですが(例えば[[webuser]]は無効のはず)、HTMLタグは無警戒のようです。

        本当は、hide3さんから頑張ってコアチームに報告していただくのがいいと思うのですが、もしどうしてもという事であれば御依頼ください。相勤めます。 wink


          • 12131
          • 9 Posts
          お返事ありがとうございます laugh

          MODxタグとjavascriptに関しては入力チェックしているようなのですが(例えば[[webuser]]は無効のはず)
          おっしゃる通りでした、すみませんm(__)m

          本当は、hide3さんから頑張ってコアチームに報告していただくのがいいと思うのですが、もしどうしてもという事であれば御依頼ください。相勤めます。
          ありがたきお言葉、感謝しております。
          大変お手数で恐縮ですが、是非ともよろしくお願いいたします。
          現在、英語勉強中です。読むのも難しいですが、書くのは全然ダメダメです。
          ガンバルゾー grin

          あと、$state、$zipの文字数の制限に関しましてはDBの方で
          state varchar(5)
          zip varchar(5)
          となってて、長文は入らないようでした :’(
          (zipがvarchar(5)なのは日本的には短いので個別改造が必要かな)

          ユーザ名などは、
          username varchar(100)
          fullname varchar(100)
          っとなってまして、日本的には100は多すぎかなとも思いますが
          世界的に見ると有り得るのでしょうネ

          追伸、「コメントの消し方がわからない」って書きましたが、
          ドキュメントをフォルダにすることで編集できました shocked
            • 8382
            • 253 Posts
            hide3さん
            HTMLタグを名前欄に入れられる件は既に気づいた人がいたようです。 grin
            すぐにパッチリリースにはならないかもしれませんが、次のリリースでは直るでしょう、御安心を。

            郵便番号の件は報告しておきました。こちらはどうなるでしょう?まだわかりません。
            とりあえず結果のみ。


              • 12131
              • 9 Posts
              大変お手数かけました、ありがとうございました laugh
              英語での表現方法もメチャクチャ参考になりました shocked

              HTMLタグを名前欄に入れられる件は既に気づいた人がいたようです。
              FS#366 - XSS vulnerability through websignup
              http://modxcms.com/bugs/task/366
              ですね!恥ずかしっ :’(
              バグトラッキングシステムの存在を初めて知りました!
              気になる人は、上記FS#366に記述の通り
              FIX websignup.inc.php (line 26):
              =======================
              $username = $modx->db->escape($modx->stripTags($_POST['username']));
              $fullname = $modx->db->escape($modx->stripTags($_POST['fullname']));
              $email = $modx->db->escape($modx->stripTags($_POST['email']));
              $password = $modx->db->escape($modx->stripTags($_POST['password']));
              $country = $modx->db->escape($modx->stripTags($_POST['country']));
              $state = $modx->db->escape($modx->stripTags($_POST['state']));
              $zip = $modx->db->escape($modx->stripTags($_POST['zip']));
              $formcode = $_POST['formcode'];

              にしといたら安心ですネ!

              郵便番号の件もありがとうございましたm(__)m
              次回は英語で発言できるようがんばってみます!
                • 8382
                • 253 Posts
                hide3さん
                拙い表現なんで反面教師ぐらいになればと思います。 smiley

                標準スニペットなんで、問題が発生しなければ良し、でしょう。
                実際に使用するときは、日本語化したり、ユーザ名やパスワードなどは英数字のみに限ったりするでしょうから。