パスワードを忘れた? アカウント作成
11007534 story
セキュリティ

ECサイトの本番環境のセキュリティ診断で全ユーザーのパスワードが一時初期化される 45

ストーリー by hylom
SQLインジェクションはデータを盗むためだけのものではありません 部門より

とあるWebアプリケーションに対し脆弱性診断を行ったところ、そのWebアプリケーションの全ユーザーアカウントのパスワードが初期化されるというトラブルが発生した話話題になっている。

診断対象のシステムは本番稼動環境だったとのことで、一歩間違えれば大問題に発展するところであったが、幸い診断の実行前にデータベースのバックアップが取られていたとのことで、大事には至らなかったという。

興味深いのは、このパスワードリセットがSQLインジェクションによって引き起こされたという点だ。具体的には、ユーザーがパスワードを忘れた際にパスワードをリセットする部分にバグがあり、そこで入力させられるメールアドレスに「'+'」という文字列を含んだ文字列を指定すると、すべてのユーザーのパスワードがリセットされるようになっていたという。

このシステムではSQLインジェクション対策が適切に行われておらず、このようなメールアドレスを指定すると、「'+'」という文字列が含まれたままでSQL文が発行されてしまっていたようだ。MySQLでは文字列に対し「+」演算子を使用すると、文字列を数値として評価してしまうという「暗黙の型変換」が発生する。その結果where句内が適切に機能せず、すべてのアカウントを対象に操作が実行されてしまったという話のようだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by iwakuralain (33086) on 2014年05月27日 20時29分 (#2609644)

    本番環境でやってるってことだよ

    • by Anonymous Coward

      リンク先のスライドくらい読めよ。もちろんテスト環境を用意すべきと進言したが一蹴されたって書いてるだろ。で、この事件が起きたら一瞬で用意されたそうな。やっぱり愚者は経験にしか学べないのだな。

      • by Anonymous Coward

        読んだ上での突っ込みで、一蹴された程度で諦めたらそりゃこうなるだろって言う感想しか持てないんだがな。類友だろう

  • よかったね (スコア:0, すばらしい洞察)

    by Anonymous Coward on 2014年05月27日 18時40分 (#2609592)

    まさに脆弱性診断サマサマじゃないですか。
    本番稼働前だし、なんの問題も無いと思います。

    試験で不具合見つかったとして、それってトラブル発生っていうんですか?

    • by Anonymous Coward on 2014年05月27日 18時44分 (#2609593)

      gmailのアドレスで、アカウント名の後ろに +XXX って付けてるのだが、
      同様なミスが、他のサイトにあるかもと思うと怖いな・・・

      親コメント
      • by Anonymous Coward

        つーか、メールアドレスに+が使えないサービスの方が多い感じ

        • by Anonymous Coward

          どこだったか覚えてないけど、登録は出来るけど、いざそれでログインしようとするとダメ、ってところあったな・・・

          • by Anonymous Coward

            「すぴばるイラスト部」とか

          • by Anonymous Coward

            あるある。不要なメールが来てうっとうしいから登録解除しようと思ったらそれもできなくて、迷惑メールフォルダー直行にしてる。

          • by Anonymous Coward

            ログイン画面では+をエスケープしないと駄目なサービスが確かにありました。
            なんだっけかなー。URLエンコードで通ったのでまだよかった・・・。

      • by Anonymous Coward

        gmailはいつになったら、_使えるようになるんだ。

        • by Anonymous Coward

          .は使えるのにね。
          他で使えないものが使えるのに、どうして他で使えるものを使えなくしてるんだろう?
          攻撃リスクになるから他サービスと同じユーザー名を使ってほしくないのかな?

          • by Anonymous Coward

            単に技術力がないからでしょ。

            Gmail以外にPostfixも拡張アドレスには '+' を使うよねぇ。

    • by Anonymous Coward

      >本番稼働前
      どこにそんなこと書いてあります?

      > かなり前に作られていた
      とか書いてあるし、

      >テストサイトで の実施を勧めたが、「そんなもんねえから本番でやって」
      >作業の再開と原因究明のために、速攻でテスト環 境が構築
      稼動前だったら本番でやらない理由が(あまり)ないですよね

    • by Anonymous Coward

      本番稼働中に「診断」で攻撃成功なんて、
      通行止めせずに石橋を叩いて壊すようなもんじゃないですか…。

  • by Anonymous Coward on 2014年05月27日 18時51分 (#2609596)

    なんか「+」で異常動作するのが盲点だったように書かれているけど、
    原因はシングルクォートのエスケープ漏れという基本中の基本だから。
     

    • by Anonymous Coward

      今時、そんなエスケープ処理を自前でやらねーだろ。
      バインド変数使うだろ。

      まぁ素人に毛が生えた程度の奴らはsqlに外部から入ってきた変数を直書きしている奴らをみるけど
      (某大手質問サイトで今システムを作ってますとかいう奴らによく見る。こいつらサービスは絶対に使いたくないなと傍観していますが)

      • 今時、そんなエスケープ処理を自前でやらねーだろ。バインド変数使うだろ。

        それはそうだけど、今回のバグをどう表現するかっていうと、自分も安易に「エスケープ漏れ」とか言っちゃうなー。これに限らず生のコードを実行しちゃう系のものを一切合切。対策として「きちんとエスケープする」ではなく「バインド変数を使う」にはなるんだけどさ。

        --
        LIVE-GON(リベゴン)
        親コメント
        • by Anonymous Coward

          どうみても後半の文句を言いたかっただけじゃない
          冒頭部分に真面目に答えても意味ないよ

    • by Anonymous Coward

      今時強制的にPreparedStatement使わせないFWなんて存在するのかよ、
      と思ってネタ元見てみたらかなり古いお手製ECってだけだったでござる。
      こんなありふれたWEBアプリケーションの古典的失敗談をいまさら記事にすることなの?

      • by Anonymous Coward on 2014年05月27日 19時26分 (#2609611)

        こんなありふれたWEBアプリケーションの古典的失敗談をいまさら記事にすることなの?

        脆弱性の内容ではなくて、脆弱性診断を依頼する側にテストサイトでの実施の重要性を認識してもらうための定期ネタとしての価値があると思う。

        親コメント
        • by Anonymous Coward

          要件として稼働環境に対してライブテストしてほしいってのはあるでしょ。
          常に完全に同一を保証できるテスト環境が存在するとは限らないんだし。
          SQLインジェクションを検知するだけなら参照系の命令でテンプレ作っとけってこと。
          客に対する注意喚起じゃなく、あくまでテスト者の失敗談であって、
          本番でテストを実施する際に注意すべき項目だよ。

          テスト用メールアカウントとして存在しないであろうてきとーなドメインでテストしたら
          実際に実在する誰かにメールが飛んじゃったなんていうことがあるから
          必ず使われていないことが保障されてるexample.com使えって
          あるある失敗談としておもしろおかしく先輩に教わるのと同じレベルの話。

          • by Anonymous Coward

            ちょっと的外れじゃないですか。
            パスワードリセットはシステムに備わっている機能なので参照系の命令云々は関係ないですよね。
            どちらかというと入力値が条件文として不適切だったという方が正しいです。

          • by Anonymous Coward

            いやいや客に対する注意喚起にも使えるでしょ。
            本番環境でやった理由はテスト環境構築を省いてコストを削減することなんだけど、それのリスクも正しく認識してもらわないと。
            というか、多少なりともリスクを認識してたからこそバックアップをとってたと思うし。
            まぁこの程度は想定の範囲内で大したリスクではない、と言うなら別に良いのでしょうけど、
            皆が皆そうだとは思えないんで。

    • by Anonymous Coward

      昔のシステムならそらありえるわな。
      最近作られたようなのだとプリペアするのが当たり前当たり前当たり前!なんだから
      普通のインジェクションが入り込む余地がない。
      Webシステム系に入ったばかりで右も左もわからないような時期ですら
      SQL文への代入はプリペアするなんて常識だったし。
      WebのHello Worldレベルの基本。

      • by Anonymous Coward

        ODBCの初期の頃はドライバの挙動がおかしいDB型が変などなどの理由で
        あえて使わなかったりもしたけど

        ログに出す際はバインド変数からSQL文に展開したりするけどね

    • by Anonymous Coward

      今時、
      >原因はシングルクォートのエスケープ漏れという基本中の基本だから。
      こんな突っ込みをする奴がいるとは
      基本中の基本はプリペアードステートメントを使って処理をしてなかったことだろ。
      何が、エスケープ処理だよ。何年前の基本中の基本だ?

      おまえは二度とDB接続をするプログラミングをするな。

      • 「プリぺアステートメントを使わない」=「エスケープ漏れ」
        ってことなんじゃないの?
        色々方法はあるんだし。
        まぁ落ち着けや。

        親コメント
      • by sasasa (5925) on 2014年05月28日 2時16分 (#2609781)

        prepared statmentの方が確実なのは分かる。(MySQLなどは文字コードによってエスケープ対象が変わったりするので)

        でもprepared statmentにすると実行したSQL自体の生ログが吐けないことがあるので、デバッグや問題発生時の原因究明に困ることってない?
        MySQLだったらバイナリログとかあるんだけど、他のDBMSだとどうしてるのか教えてほしい。

        親コメント
      • by Anonymous Coward

        ちょっと知ったかしてる新人はこれだから困る。

        • by Anonymous Coward

          新人は育てればいいだけだが
          いい歳なのに人を罵倒するだけのためにコメントするような奴が一番仕事していて困る

      • by Anonymous Coward

        ライブラリー側でパースしているやつなら、プリペアードステートメントを使っていてもSQLインジェクションされるらしいですよ
        某システムはきちんとプリペアードステートメントを使っている
        でも、第三者に攻撃を依頼したら、できてしまった
        調べてみたら、ライブラリー側でプリペアードステートメントからSQLに復元する処理に漏れがあるのが原因だった
        なんてこともあるんで

    • by Anonymous Coward

      エスケープ漏れの前に、メアドとして正しいか確認しないの?

      シングルクオートとか+がドメイン部にあったらその時点で弾けよと思う

  • by Anonymous Coward on 2014年05月27日 20時58分 (#2609658)

    内容とまったく関係ない話で大変申し訳ないのだが、
    引用されているスライドが、なんというか、すごく痛いです。

    • by miyuri (33181) on 2014年05月27日 21時01分 (#2609660) 日記

      アレは、SQLインなんとかって言いたいだけなんだろうなと。

      親コメント
    • by Anonymous Coward

      えっ、この界隈ではわりと一般的じゃね?
      むしろ痛くないスライドを観たことがないが・・・

    • by Anonymous Coward

      あれが痛いと分かるのは痛い人
      そして、痛い人があれは痛いと指摘する様は、
      痛さが分からない人からみると、かなり痛い光景になる

      だから、無視するか、ノリ突っ込みが正解で、
      マジレスは負け

      たぶん、そういう人格の脆弱性診断

    • by Anonymous Coward

      「(このような地味な検証作業を)ひたすら繰り返す苦行です」と、身もふたもない話のスライドですから…
      開き直りでもしないと、やってられないのかもなと

  • >文字列を数値として評価してしまうという「暗黙の型変換」
    mysqlのこれってものすごく筋としても設計としても悪くないかい。

    mysql使ったこと無いんだが、代入先が文字列ならそんなもの動いてもらっちゃ困るだろう。

    a=’1+3’ってやったら aには4が入るってことか?aが文字列のフィールドか変数として。
    じゃ、”式そのものを代入したい時はどうすんだ?”

    • > a=’1+3’ってやったら aには4が入るってことか?

      まったく違う。まあ、タレコミをよく読んでほしいんだが、実際に注入したのは「+」ではなく「'+'」(シングルクオート付きの文字列)であることに注意。

      文字列同士の演算として、'1'+3 とやっても、文字列「1」を数値「1」に変換してから演算するので、結果は4になる、というのが暗黙の型変換なわけだけど、さらに、「'A'+3」とやると、文字列「A」を数値「0」に変換するので、結果が3になる、というのが今回問題とされている挙動。

      問題のアプリケーションは、そのSQL中で「email = '入力したメールアドレス'」というような、DBカラムと入力したメールアドレスの比較演算を行っていると推測されています。

      そんな処理をしているパスワードリセット用フォームに、メールアドレス「foo@exa'+'mple.com」という文字列を入力して実行すると、
      「email = 'foo@exa'+'mple.com'」というSQLが作られる
      →「'foo@exa'+'mple.com'」は、「'foo@exa'」も「'mple.com'」も、普通の数値に変換できないので、暗黙の型変換の結果は「0+0」という式になり、右辺の演算結果は数値「0」になる
      →SQLの条件は、「email=0」という条件式になる
      →右辺が数値型なので、DBのemailカラムの内容(文字列)を数値に暗黙の型変換してから0と比較することになる
      →たいていのメールアドレス文字列は、数値と評価出来ないので、この型変換で0になる
      →「0=0」という比較を行うことになり、」全てのDBレコードがこの条件に合致することになる
      という流れで、「全ユーザーが条件合致してパスワードリセットされる」ことになったと推測されているわけです。

      このようなSQLインジェクション的文字列を「フォームに入力してみる」のはごく標準的な脆弱性チェックです。
      これで「診断者が悪い」と言うのは問題の見方を間違えてます。

      #MySQLの挙動が悪いとは一概には言えないというか、それはそれで便利なんですよね。。
      #Oracleなんかは、1データでも演算に失敗したらSQL文全体が失敗する、という挙動なんだけど、かなり不便です。

      親コメント
  • by Anonymous Coward on 2014年05月28日 14時03分 (#2610040)

    漫画とかゲームの画像をバリバリ使ってるけど、権利関係大丈夫なの?
    セキュリティで商売されてるくらいだから、ちゃんとクリアしてるんだと思いますが。

typodupeerror

「毎々お世話になっております。仕様書を頂きたく。」「拝承」 -- ある会社の日常

読み込み中...