コンテンツにスキップ

5. Webアプリケーションへの攻撃

5.1. Webアプリケーションとは

WebアプリケーションはWebサーバとユーザのインターフェイスから提供されるシステムを指す。

5.2. Webアプリケーションのリスク増大

近年はネットワークによるサービスの普及、例えばショッピングや金融取引/故郷サービスなどがWebアプリケーションにより提供されている。 また使用ユーザや端末の多様化がますますそれを増大させている。 これによりWebアプリケーションのリスクが以前よりも増大している。

5.2.1. リスク増大の原因

リスクが増大するのは以下の要因が考えらえる。

  • 動的サービスの必要性 ... ユーザごとに異なる処理を提供する必要がある
  • 取り扱いデータの重要性の増大 ... 取り扱うデータの内容に決済情報や個人情報などデータそのものの重要性が増大している
  • 構造的な問題 ... そもそもHTTPSが重要なデータを扱った動的サービスの提供に向いている仕組みではないという問題がある

動的サービスの必要性

動的サービスを提供するには以下の内容を実装する必要がある。

  • ユーザに合わせて表示内容を変える
  • リアルタイムで情報を更新する
  • 端末などに応じて表示内容やデザインを変える

また動的サービスの開発実装に使うフレームワーク/アーキテクチャの数が増えるほど、脆弱性を生じる可能性は増えていく。

具体的には以下のプロセスで動的サービスをユーザごとに実現する。

  1. ユーザからの入力をパラメータとして利用
  2. エンドポイント技術(JavaScriptなど)を利用
  3. 様々な形式によるデータ送信(XML, JSON, SOAPなど)を利用

取り扱いデータの重要性の増大

取り扱いデータの重要性は以下内容をWEBアプリケーションで扱うようになったため増大している。

  • 個人情報
  • 金融情報
  • 損害/信頼失墜に結びつく情報

構造的な問題

そもそもHTTPは用意したファイルをWEBを通じて閲覧できることを目指したプロトコルであるため元の設計と現在求められている機能需要が構造的に乖離している構造的な問題がある。

  • HTTPの問題
    • デザインが古い
    • セッションの維持が非考慮
    • データの暗号化も非考慮

5.3. Webアプリケーション攻撃の種類

Webアプリケーションの攻撃の種類は大きく2つに分けられる。

  • サーバサイド攻撃
  • クライアントサイド攻撃
  • 上記2つの複合攻撃

5.3.1. サーバサイド攻撃

サーバサイド攻撃はWebアプリケーションを利用してWebサーバに攻撃を行うもの。 この攻撃の目的は以下の通り。

  • サーバのフットプリンティング
  • 機密情報の閲覧
  • アクセス権の取得

5.3.2. クライアントサイド攻撃

クライアントサイド攻撃はWebアプリケーションを利用してサービスを利用しているクライアントに攻撃を行うもの。 この攻撃の目的は以下の通り。

  • ユーザの機密情報閲覧
  • なりすまし
  • フィッシング
  • マルウェアの配布

5.4. Webアプリケーションの脆弱性の原因

Webアプリケーションの脆弱性が生じる原因のほとんどは開発者側のミスが原因となる。 例えば以下内容に関する知識や実装の不十分が脆弱性を引き起こさせる。

  • 攻撃に対する理解
  • CORS制約に対する理解
  • 単純な実装ミス
  • 開発言語の特性への理解
  • 仕様

5.5. 攻撃につながるWebアプリケーションの脆弱性

攻撃につながるアプリケーションの脆弱性には以下のようなものがある。

  • 入力値の検証(バリテーション)のミス
    • ユーザから入力値/環境変数の検証
    • バリテーションはフロントエンド/バックエンドともに実装する必要がある
  • エラー情報の表示
    • PHPなどのエラーメッセージが表示されその内容が流出
    • 表示される不適切なメッセージで列挙が可能
  • 表示時のエンコード
    • ユーザからの入力値をHTMLに含める際に適切なエンコードが施されていない
  • SQLの対策不備
    • ユーザからの入力値からDBクエリを作成する際に適切な対策をしない
  • 使用の不備/無計画な実装
  • その他の要因
    • 通信の暗号化
    • SSL証明書の問題

5.6. Webアプリケーションへの攻撃手法

Webアプリケーションの脆弱性に対する攻撃を一部簡単に紹介する。

5.6.1. ヘッダ・インジェクション攻撃

ヘッダ・インジェクション攻撃はWebアプリケーションやネットワークサービスに対するヘッダを悪用した攻撃のこと。

攻撃者は不正なデータ(通常はHTTPヘッダー)を送信し、システムがそのデータをそのまま処理することによって、サーバやアプリケーションのセキュリティを破ろうとするものとなっている。またこれはHTTPヘッダ・インジェクションとも呼ばれる。 またHTTPヘッダ・インジェクションはセッションハイジャックやクロスサイトスクリプティング(XSS)攻撃などともに利用されることの多い攻撃となっている。

5.6.2. OSコマンド・インジェクション

OSコマンド・インジェクションはWebアプリケーションやシステムが外部から提供されたデータを利用してOSコマンドを実行する場合に発生する脆弱性を悪用した攻撃のこと。

攻撃者はこの攻撃で不正なOSコマンドを挿入し、システムを操作したり、機密情報を盗んだり試みる。 この攻撃は不適切な入力検証やエスケープ処理の不備によって可能となる。

5.6.3. SQLインジェクション

SQLインジェクションはWebアプリケーションやデータベースシステムに対しては不正なSQLクエリを注入して送信しようとする攻撃のこと。

SQLインジェクションが成功すると、攻撃者はデータベースから情報を盗んだり、データを改ざんしたりすることができるものとなっている。 この攻撃は入力検証(バリテーション)や適切なエスケープ処理が行われていない場合に発生する。

具体的にはプログラムが発行するSQL構文中に不正な入力値を含めてしまうことで攻撃者が任意にDBを操作できてしまうというもの。

想定される被害

  • 認証の突破
  • 機密情報の漏洩
  • データの改ざん
  • その他セキュリティ要素の侵害

認証突破

もっとも初歩的なSQLインジェクションの方法。 一般的にwhere句が含まれるSQLに対して入力されるクエリとして' OR 1=1 --1' or '1' = '1';--がある。 なおMySQLの場合は

これはBooleanを使用した命令となっている。上記例は有名な例であるためWAFで検知しやすい。 単純なWAFの場合は「2=2」などで検知を回避できるが「=」で検知している場合もある。 1=1部の他の例は以下の通り。

  • 7>1
  • 'ab' LIKE 'a%'
  • 5 BETWEEN 1 AND 7

対象にWhere句でないもののが含まれる可能性がある場合(INSERTなど)は以下のようなものを使用する。

  • sleep()などの時間遅延(MYSQL)
  • a'||'bなどの文字列結合(Oracle DB)
  • a/**/bなどのインラインコメント

5.6.4. ディレクトリ・トラバーサル

ディレクトリ・トラバーサル(Directory Traversal)はセキュリティの脆弱性の1つで攻撃者がアクセスの許可されていないディレクトリにアクセスできること

攻撃者はWebアプリケーションやファイルシステム内のファイルにアクセスするために、通常許可されていないディレクトリに移動しようとする。 これにより機密情報への不正アクセスが可能ができる場合はディレクトリ・トラバーサルの脆弱性があることとなる。

5.6.5. オープンダイレクト

オープンダイレクト(Open Redirect)はWebアプリケーションのセキュリティの脆弱性の1つで攻撃者がリンクを介してユーザーを偽のウェブサイトに誘導することができる状況を指す。

攻撃者はリンクをクリックしたユーザを信頼性のあるウェブサイトから外部の不正なウェブサイトに誘導することができ、フィッシング攻撃や悪意のあるリダイレクトに悪用される可能性があるものとなっている。

5.6.6. クロスサイト・スクリプティング(XSS)

クロスサイト・スクリプティング(XSS)は攻撃者がウェブページに不正なスクリプトを挿入しユーザのブラウザで実行させることができることを可能にするもの

具体的にはユーザの入力をレスポンスに含めるときにタグやスクリプトをそのまま表示する脆弱性を利用したものとなっている。 この攻撃によりユーザーのセッション情報やクッキーが盗まれたり、不正なアクションが実行されたりする可能性がある。

想定される攻撃

クロスサイト・スクリプティングはフロントエンドの場合、攻撃の個所により想定される攻撃文字列の形が大体決まっている。

場所 想定される攻撃文字列
HTML本文内 <script>alert(document.cookie)</script> または <img src="x" onerror=alert(document.cookie)>
タグ内の値 "><script>alert(document.cookie)</script> または " onclick=alert(document.cookie)+"
タグ内のイベント値 ";alert(document.cookie)+"
タグ内のイベントの引数 );alert(document.cookie
Javascript内 ';alert(document.cookie);//

またREST APIなどで渡されたJSONをデコードしている場合は、エンコードした文字列を内部に含めることで脆弱性となる場合もある。

想定される被害

  • ホームページの改ざん
  • フィッシングサイトへの誘導
  • セッションIDの盗難

具体的な対策

  • エンコードサニタイズを実装する
  • 適切な入力検証やエスケープ処理の実装

またエンコードすべき文字は以下の通り。

文字列 HTMLエンコード URLエンコード
< &lt; %3C
> &gt; %3E
' &#39; %27
" &quot; %22
& &amp; %26

言語としてはシングルクオーテーションをサニタイズしないものが多い。 そのため開発の際はしっかりできているか確認/ドキュメントを必読する必要がある。

5.6.7. クロスサイト・リクエストフォージェリ(CSRF)

CSRFは攻撃者がユーザを騙してユーザの認識や同意なしに、別のウェブサイトで利用者の許可なしに不正なアクションを実行させる攻撃のこと。 この攻撃にはターゲットサイトにおけるユーザの認証セッションを悪用することが含まれる。

一般的には攻撃者はこの攻撃でユーザをだまして特定の操作(例:アカウントの設定変更、資金の送金など)を実行させることを目的とする。

5.6.8. クリックジャッキング

クリックジャッキングは悪意のあるウェブサイトやWebアプリケーションが、ある要素(ボタンなど)をユーザーから隠したり偽装したりして、別のウェブサイトの正規に見える要素と重ね合わせること

ユーザが偽装された要素にアクセスすると、意図せずに隠された悪意のあるアクションを実行する。

5.6.9. MXインジェクション

MXインジェクションは攻撃者がメールサーバー(MX)設定に悪意のあるコードを操作または注入できるセキュリティ脆弱性を指す。 これは電子メールのトラフィックを傍受、変更、またはリダイレクトするために使用される可能性がある。 そのため、この攻撃はユーザの電子メール通信のセキュリティとプライバシを侵害する。

5.6.10. セッションハイジャック

セッションハイジャックは脆弱性を利用して他人のセッションIDを入手する攻撃を指す。 これはWebアプリケーションが基本的にはセッションIDでユーザを識別していることに由来する。

セッションIDの入手方法

基本的には以下の4つの手法がある。

  • ブルートフォースアタック(効果極小)
  • 推測攻撃(効果極小)
  • セッションの固定化
  • 盗み出し

セッション固定

セッション固定は複数の脆弱性から成り立つ脆弱性。 以下内容がそろったときにセッション固定の攻撃条件が整う。

  • URL引数からセッションIDを付け替えできる
  • ログイン成功時にセッションIDを変更しない
  • フィッシングが成功する

このように条件が複雑なため成功の可能性は低いと思われる。

盗み出し

直接セッションIDを盗み出す手法。 具体的には以下箇所より盗み出す。

  • Webサーバ(アクセス権の取得が必要)
  • 通信経路上(ネットワークの盗聴が必要)
  • クライアントPC(XSSやマルウェアの使用が必要)

5.7. Webアプリケーションの情報収集

Webアプリケーションの脆弱性に関する情報を収集する場合以下の点が基本となる。

  • Webアプリケーションのフットプリンティング
  • Webアプリケーションの攻撃情報

5.7.1. Webアプリケーションのフットプリンティング

Webアプリケーションのフットプリンティングの手法はいくつかあり、その基本内容を以下に示す。

  • URL構造の確認
  • エラーページへのアクセス(存在しないページへアクセスする)
  • SSL証明書のチェック
  • 隠されたコンテンツの閲覧
  • ブラウザ拡張機能Wapplyzerの活用

URL構造の確認

URLから情報が入手できる場合もあり、その場合のような場合である。

https://www.bikinisuki.jp/topic.aspx?data=20201015$sort=desc

この場合以下の点が確認可能。

  • SSLが使用されている
  • aspxで開発されている => WebサーバはIIS
  • データベースが使用されている可能性
  • DBの並び替え語句が使用されている

エラーページへのアクセス

エラーページで特にApache標準の404エラーが出る場合、実行しているApacheのバージョンやホストOSを確認できる。

SSL証明書のチェック

SSL証明書を閲覧することで、証明書の中にサーバ運営者の情報が記載されている場合がありそれを確認できる。

隠されたコンテンツの閲覧

robots.txt(クローラ用ファイル)などの隠しコンテンツからディレクトリ情報を確認する。

ブラウザ拡張機能 Wapplyzer の活用

WapplyzerはChromiumベースのブラウザ拡張機能であり、Webサイトに使用されている技術を確認できる機能を持つ。 これによりサイト構成技術を確認することができる。

5.7.2. Webアプリケーションの攻撃情報

Webアプリケーションへの攻撃情報の収集はアプリケーションごとに行う必要がある。 例えば以下の通り。

  • エントリポイントの特定
  • ファイルに関するパラメータ
  • DBの使用有無
  • 入力値検証の判断

エントリポイントの特定

エントリポイントの特定では以下の内容をチェックする

  • リクエスト時のパラメータ(エントリーポイント)
  • パラメータがアプリケーションに与える影響
  • レスポンス内の入力値

エントリポイントの特定はBurp Suiteと呼ばれるツールが適している。

Burp Suite : リバースプロキシ機能(Webブラウザからのリクエストを送信前/レスポンスからの表示前にインタセプト)する機能がある。

またエントリポイントで確認すべき観点は以下の点がある。

  • 入力値の戻り値の確認
    • どこに戻るか
    • どうエンコードされるか
  • 特定文字列への反応
    • シングルクオーテーション
    • セミコロン
    • 改行コード
  • パラメータ値の使用方法の推測
    • ファイル
    • リダイレクト
    • JavaScriptの利用