![セキュリティ セキュリティ](https://srad.jp/static/topics/security_64.png)
ECサイトの本番環境のセキュリティ診断で全ユーザーのパスワードが一時初期化される 45
ストーリー by hylom
SQLインジェクションはデータを盗むためだけのものではありません 部門より
SQLインジェクションはデータを盗むためだけのものではありません 部門より
とあるWebアプリケーションに対し脆弱性診断を行ったところ、そのWebアプリケーションの全ユーザーアカウントのパスワードが初期化されるというトラブルが発生した話が話題になっている。
診断対象のシステムは本番稼動環境だったとのことで、一歩間違えれば大問題に発展するところであったが、幸い診断の実行前にデータベースのバックアップが取られていたとのことで、大事には至らなかったという。
興味深いのは、このパスワードリセットがSQLインジェクションによって引き起こされたという点だ。具体的には、ユーザーがパスワードを忘れた際にパスワードをリセットする部分にバグがあり、そこで入力させられるメールアドレスに「'+'」という文字列を含んだ文字列を指定すると、すべてのユーザーのパスワードがリセットされるようになっていたという。
このシステムではSQLインジェクション対策が適切に行われておらず、このようなメールアドレスを指定すると、「'+'」という文字列が含まれたままでSQL文が発行されてしまっていたようだ。MySQLでは文字列に対し「+」演算子を使用すると、文字列を数値として評価してしまうという「暗黙の型変換」が発生する。その結果where句内が適切に機能せず、すべてのアカウントを対象に操作が実行されてしまったという話のようだ。
最大の問題 (スコア:2)
本番環境でやってるってことだよ
Re: (スコア:0)
リンク先のスライドくらい読めよ。もちろんテスト環境を用意すべきと進言したが一蹴されたって書いてるだろ。で、この事件が起きたら一瞬で用意されたそうな。やっぱり愚者は経験にしか学べないのだな。
Re: (スコア:0)
読んだ上での突っ込みで、一蹴された程度で諦めたらそりゃこうなるだろって言う感想しか持てないんだがな。類友だろう
よかったね (スコア:0, すばらしい洞察)
まさに脆弱性診断サマサマじゃないですか。
本番稼働前だし、なんの問題も無いと思います。
試験で不具合見つかったとして、それってトラブル発生っていうんですか?
Re:よかったね (スコア:1)
gmailのアドレスで、アカウント名の後ろに +XXX って付けてるのだが、
同様なミスが、他のサイトにあるかもと思うと怖いな・・・
Re: (スコア:0)
つーか、メールアドレスに+が使えないサービスの方が多い感じ
Re: (スコア:0)
どこだったか覚えてないけど、登録は出来るけど、いざそれでログインしようとするとダメ、ってところあったな・・・
Re: (スコア:0)
「すぴばるイラスト部」とか
Re: (スコア:0)
あるある。不要なメールが来てうっとうしいから登録解除しようと思ったらそれもできなくて、迷惑メールフォルダー直行にしてる。
Re: (スコア:0)
ログイン画面では+をエスケープしないと駄目なサービスが確かにありました。
なんだっけかなー。URLエンコードで通ったのでまだよかった・・・。
Re: (スコア:0)
gmailはいつになったら、_使えるようになるんだ。
Re: (スコア:0)
.は使えるのにね。
他で使えないものが使えるのに、どうして他で使えるものを使えなくしてるんだろう?
攻撃リスクになるから他サービスと同じユーザー名を使ってほしくないのかな?
Re: (スコア:0)
単に技術力がないからでしょ。
Gmail以外にPostfixも拡張アドレスには '+' を使うよねぇ。
Re: (スコア:0)
>本番稼働前
どこにそんなこと書いてあります?
> かなり前に作られていた
とか書いてあるし、
>テストサイトで の実施を勧めたが、「そんなもんねえから本番でやって」
>作業の再開と原因究明のために、速攻でテスト環 境が構築
稼動前だったら本番でやらない理由が(あまり)ないですよね
Re: (スコア:0)
本番稼働中に「診断」で攻撃成功なんて、
通行止めせずに石橋を叩いて壊すようなもんじゃないですか…。
「+」は関係ない (スコア:0)
なんか「+」で異常動作するのが盲点だったように書かれているけど、
原因はシングルクォートのエスケープ漏れという基本中の基本だから。
Re: (スコア:0)
今時、そんなエスケープ処理を自前でやらねーだろ。
バインド変数使うだろ。
まぁ素人に毛が生えた程度の奴らはsqlに外部から入ってきた変数を直書きしている奴らをみるけど
(某大手質問サイトで今システムを作ってますとかいう奴らによく見る。こいつらサービスは絶対に使いたくないなと傍観していますが)
Re:「+」は関係ない (スコア:1)
それはそうだけど、今回のバグをどう表現するかっていうと、自分も安易に「エスケープ漏れ」とか言っちゃうなー。これに限らず生のコードを実行しちゃう系のものを一切合切。対策として「きちんとエスケープする」ではなく「バインド変数を使う」にはなるんだけどさ。
LIVE-GON(リベゴン)
Re: (スコア:0)
どうみても後半の文句を言いたかっただけじゃない
冒頭部分に真面目に答えても意味ないよ
Re:「+」は関係ない (スコア:1)
一行目についてはそうかもしれないけど、二行目について、書き込んだ当人だけが読むわけじゃないから意味ないとは思わないです。
LIVE-GON(リベゴン)
Re: (スコア:0)
今時強制的にPreparedStatement使わせないFWなんて存在するのかよ、
と思ってネタ元見てみたらかなり古いお手製ECってだけだったでござる。
こんなありふれたWEBアプリケーションの古典的失敗談をいまさら記事にすることなの?
Re:「+」は関係ない (スコア:1)
こんなありふれたWEBアプリケーションの古典的失敗談をいまさら記事にすることなの?
脆弱性の内容ではなくて、脆弱性診断を依頼する側にテストサイトでの実施の重要性を認識してもらうための定期ネタとしての価値があると思う。
Re: (スコア:0)
要件として稼働環境に対してライブテストしてほしいってのはあるでしょ。
常に完全に同一を保証できるテスト環境が存在するとは限らないんだし。
SQLインジェクションを検知するだけなら参照系の命令でテンプレ作っとけってこと。
客に対する注意喚起じゃなく、あくまでテスト者の失敗談であって、
本番でテストを実施する際に注意すべき項目だよ。
テスト用メールアカウントとして存在しないであろうてきとーなドメインでテストしたら
実際に実在する誰かにメールが飛んじゃったなんていうことがあるから
必ず使われていないことが保障されてるexample.com使えって
あるある失敗談としておもしろおかしく先輩に教わるのと同じレベルの話。
Re: (スコア:0)
ちょっと的外れじゃないですか。
パスワードリセットはシステムに備わっている機能なので参照系の命令云々は関係ないですよね。
どちらかというと入力値が条件文として不適切だったという方が正しいです。
Re: (スコア:0)
いやいや客に対する注意喚起にも使えるでしょ。
本番環境でやった理由はテスト環境構築を省いてコストを削減することなんだけど、それのリスクも正しく認識してもらわないと。
というか、多少なりともリスクを認識してたからこそバックアップをとってたと思うし。
まぁこの程度は想定の範囲内で大したリスクではない、と言うなら別に良いのでしょうけど、
皆が皆そうだとは思えないんで。
Re:「+」は関係ない (スコア:3, すばらしい洞察)
いいからネタ元読め。
これ以上恥を晒すな。
脆弱性診断の段階で(調査だけにも関わらず)発生させてしまった事例、
というのがトピックスであって、脆弱性そのものに深い意味はない。
Re: (スコア:0)
昔のシステムならそらありえるわな。
最近作られたようなのだとプリペアするのが当たり前当たり前当たり前!なんだから
普通のインジェクションが入り込む余地がない。
Webシステム系に入ったばかりで右も左もわからないような時期ですら
SQL文への代入はプリペアするなんて常識だったし。
WebのHello Worldレベルの基本。
Re: (スコア:0)
ODBCの初期の頃はドライバの挙動がおかしいDB型が変などなどの理由で
あえて使わなかったりもしたけど
ログに出す際はバインド変数からSQL文に展開したりするけどね
Re: (スコア:0)
今時、
>原因はシングルクォートのエスケープ漏れという基本中の基本だから。
こんな突っ込みをする奴がいるとは
基本中の基本はプリペアードステートメントを使って処理をしてなかったことだろ。
何が、エスケープ処理だよ。何年前の基本中の基本だ?
おまえは二度とDB接続をするプログラミングをするな。
Re:「+」は関係ない (スコア:2)
「プリぺアステートメントを使わない」=「エスケープ漏れ」
ってことなんじゃないの?
色々方法はあるんだし。
まぁ落ち着けや。
Re:「+」は関係ない (スコア:1)
prepared statmentの方が確実なのは分かる。(MySQLなどは文字コードによってエスケープ対象が変わったりするので)
でもprepared statmentにすると実行したSQL自体の生ログが吐けないことがあるので、デバッグや問題発生時の原因究明に困ることってない?
MySQLだったらバイナリログとかあるんだけど、他のDBMSだとどうしてるのか教えてほしい。
Re: (スコア:0)
ちょっと知ったかしてる新人はこれだから困る。
Re: (スコア:0)
新人は育てればいいだけだが
いい歳なのに人を罵倒するだけのためにコメントするような奴が一番仕事していて困る
Re: (スコア:0)
ライブラリー側でパースしているやつなら、プリペアードステートメントを使っていてもSQLインジェクションされるらしいですよ
某システムはきちんとプリペアードステートメントを使っている
でも、第三者に攻撃を依頼したら、できてしまった
調べてみたら、ライブラリー側でプリペアードステートメントからSQLに復元する処理に漏れがあるのが原因だった
なんてこともあるんで
Re: (スコア:0)
ソースはこちら
http://www.tokumaru.org/d/20100701.html [tokumaru.org]
PDOの場合、PDO::ATTR_EMULATE_PREPARESを指定しないとSQLインジェクションができるらしいです。
Re: (スコア:0)
エスケープ漏れの前に、メアドとして正しいか確認しないの?
シングルクオートとか+がドメイン部にあったらその時点で弾けよと思う
我慢できなかった (スコア:0)
内容とまったく関係ない話で大変申し訳ないのだが、
引用されているスライドが、なんというか、すごく痛いです。
Re:我慢できなかった (スコア:2)
アレは、SQLインなんとかって言いたいだけなんだろうなと。
Re: (スコア:0)
えっ、この界隈ではわりと一般的じゃね?
むしろ痛くないスライドを観たことがないが・・・
Re: (スコア:0)
あれが痛いと分かるのは痛い人
そして、痛い人があれは痛いと指摘する様は、
痛さが分からない人からみると、かなり痛い光景になる
だから、無視するか、ノリ突っ込みが正解で、
マジレスは負け
たぶん、そういう人格の脆弱性診断
Re: (スコア:0)
「(このような地味な検証作業を)ひたすら繰り返す苦行です」と、身もふたもない話のスライドですから…
開き直りでもしないと、やってられないのかもなと
いや、開発したプログラマもテスタもこの診断者も悪いのは前提として、 (スコア:0)
>文字列を数値として評価してしまうという「暗黙の型変換」
mysqlのこれってものすごく筋としても設計としても悪くないかい。
mysql使ったこと無いんだが、代入先が文字列ならそんなもの動いてもらっちゃ困るだろう。
a=’1+3’ってやったら aには4が入るってことか?aが文字列のフィールドか変数として。
じゃ、”式そのものを代入したい時はどうすんだ?”
Re:いや、開発したプログラマもテスタもこの診断者も悪いのは前提として、 (スコア:3, 参考になる)
> 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文全体が失敗する、という挙動なんだけど、かなり不便です。
リンク元のスライドが (スコア:0)
漫画とかゲームの画像をバリバリ使ってるけど、権利関係大丈夫なの?
セキュリティで商売されてるくらいだから、ちゃんとクリアしてるんだと思いますが。