Webアプリにおける11の脆弱性の常識と対策:Webアプリの常識をJSPとStrutsで身につける(11)(2/4 ページ)
本連載は、JSP/サーブレット+StrutsのWebアプリケーション開発を通じて、Java言語以外(PHPやASP.NET、Ruby on Railsなど)の開発にも通用するWebアプリケーション全般の広い知識・常識を身に付けるための連載です
【3】SQLインジェクション
SQLを操作するプログラムに対してSQL文の断片を渡すことにより、データベースを改ざんすることやデータベースに含まれる情報の入手を可能にする攻撃手法です。
具体的な例として、以下のような問い合わせSQLが実行されるログイン画面があるとします。
SELECT * FROM USER_TABELE WHERE password = 'pass' AND userName = 'user'
- user:ログイン画面で入力するユーザー名
- pass:ログイン画面で入力するパスワード
リスト1のコードは、「userName」「password」の2つの情報を利用して、データベースへの問い合わせ処理を実現しています。
次に、ログイン画面でユーザー名・パスワードを入力して、問い合わせてみます。
SELECT * FROM USER_TABLE WHERE password = '******' AND userName = 'YAMANAKA'
- userName:YAMANAKA
- password:******
データベース「USER_TABLE」に入力した情報が存在していれば、問い合わせは成功となります。一方、入力した情報がデータベースに存在しなければ、問い合わせは失敗となります。
しかし、このように問い合わせている場合、画面上のテキスト入力欄にSQL文の断片を埋め込むことで、「USER_TABLE」に存在しない情報でも、問い合わせ処理を成功させることが可能です。
SELECT * FROM USER_TABLE WHERE password = '******' AND userName = 'YAMANAKA' OR 1 = 1 -- '
条件句に追加された「OR 1 = 1」は必ず成功する条件になります。この場合、条件句として指定されている「user_Name」「password」が一致しなくても問い合わせが必ず成功します。
■対策
SQLインジェクション攻撃を防ぐには以下が有効です。
- 文字列の連結を使ってSQL文を組み立てない
- 「プレイスホルダ」という仕組みを使ってSQL文を呼び出す
- データベース接続時に文字エンコーディングを指定
編集部注:SQLインジェクションの対策に関しては、以下の記事もご参考にしていただければと思います
SQLインジェクション攻撃、ターゲットは“あなた”です
もいちどイチから! HTTP基礎訓練中(6) 「受動的攻撃」は見てる人には気付きにくいのです。だからこそWebアプリケーションを作るあなたが注意しないと!
「Security&Trust」フォーラム 2008/6/27
クッキーに隠されたSQLインジェクション、対策は?
川口洋のセキュリティ・プライベート・アイズ(8) 新種のSQLインジェクションが登場。クッキーを利用し機械を欺く手口が使われていますが、対策の秘訣を川口が教えます
「Security&Trust」フォーラム 2008/10/20
隠されていたSQLインジェクション
星野君のWebアプリほのぼの改造計画(9) 赤坂さんに指摘されたもう1つの「危険な脆弱性」とは? 隠された脆弱性を見つけ出せ!
「Security&Trust」フォーラム 2006/8/26
顧客データがすべて盗まれる?!
連載:Webアプリケーションに潜むセキュリティホール Webアプリを通じたSQL偽造攻撃や、OSコマンドを実行する攻撃は大きな脅威。企業情報や顧客データを守るには
「Security&Trust」フォーラム 2003/6/5
アナリストが見逃せなかった、攻撃の“ある傾向”
データで見るSQLインジェクション渦 2008年3月から続くSQLインジェクション攻撃の波は止まらない。この攻撃の多様性と、データから見え隠れする「攻撃者の姿」を解説する
「Security&Trust」フォーラム 2008/7/24
【4】パラメータの改ざん
パラメータの改ざんとは、攻撃者がURLパラメータやhidden、Cookieなどのリクエストを書き換えてサーバへ送る攻撃方法です。
具体的には、権限を示すパラメータがURLにある場合、その権限パラメータを書き換えるだけで管理者権限を得られる攻撃などがあります。
■対策
対策としては、「改ざんされては困るパラメータでは、クライアントから受け取った値を利用しない」「セッションIDによる状態遷移を行い、データはサーバ側の値を利用する」などがあります。すなわち、適切なセッション管理が重要です。
編集部注:パラメータの改ざんの対策に関しては、以下の記事もご参考にしていただければと思います
【5】HTTPレスポンス分割
HTTPレスポンスヘッダに不正なデータを混入し実行させることで、攻撃者と同じプロキシサーバを利用しているユーザーに、実際にはサイトに存在していないコンテンツを、見せる攻撃手法です。また、HTTPレスポンスヘッダに改行を追加することで、アプリケーション利用者のWebブラウザ上で、「Location:」「Set-Cookie:」など任意のヘッダを出力させることが可能です。
- Location
細工をしたURLを利用者に閲覧させることで、任意のサイトにリダイレクトが行われる。利用者の知らないうちに別サイトを閲覧しているので、フィッシングなどに悪用可能 - Set-Cookie
細工をしたURLを利用者に閲覧させることで、利用者のブラウザ上で任意のクッキーを発行することが可能。セッションIDの固定化攻撃と組み合わせて、利用者のセッションのっとりにつながる恐れがある
また、存在していない偽ページへアクセスさせることにより、Webブラウザ上で悪意のあるプログラムが実行され、利用者の情報が漏えいする恐れがあります。
■対策
対策としては、レスポンスヘッダの一部を外部から入力させることを止める、あるいは入力の改行文字チェックなどがあります。
編集部注:HTTPレスポンス分割の対策に関しては、以下の記事もご参考にしていただければと思います
【6】OSコマンドインジェクション
外部からサーバ上の任意のOSコマンドが実行される脆弱性です。OSコマンドが実行されてしまうと、情報漏えいやWebサイトのデータの改ざんなど、Webサイトが提供するサービスが止まりかねない事態を引き起こします。最悪の場合、Webサイトが乗っ取られて、ほかのWebサイトなどへの攻撃の踏み台にされることもあります。
■対策
対策としては、Webアプリケーション開発で外部プログラムを呼ぶようなプログラムを書かないことや、外部プログラムに渡すパラメータを英数字に限定して、入力データチェックを徹底する必要があります。
編集部注:OSコマンドインジェクションの対策に関しては、以下の記事もご参考にしていただければと思います
OSコマンドインジェクションを防ぐルールを作成する
Webアプリケーションに潜むセキュリティホール(13)
不正な入力でOSコマンドを実行させるOSコマンドインジェクション。「mod_security」での対策ルールを紹介……
「Security&Trust」フォーラム 2004/11/12
公開中のHTMLファイルがごっそり消失!?
星野君のWebアプリほのぼの改造計画(7) 公開中のWebコンテンツが突然見えなくなった。Webサーバを調査すると、あやしい変数がCGIに渡されていた
「Security&Trust」フォーラム 2004/11/12
次ページでは、残りの脆弱性のうち【7】〜【11】について見ていきます。
Copyright © ITmedia, Inc. All Rights Reserved.