本記事では、不正アクセスとセッション管理に関連した以下の脆弱性について解説します。
- パス名パラメータの未チェック/ディレクトリ・トラバーサル
- アクセス制御や認可制御の欠落
- セッション管理の不備
- CSRF(クロスサイト・リクエスト・フォージェリ)
不正アクセスにまつわる脆弱性
不正アクセス系の脆弱性は、攻撃者が権限を持たないにもかかわらず、システムやデータに不正にアクセスすることで発生します。これらの脆弱性は、適切な認証、認可、およびアクセス制御メカニズムの欠如、またはその不十分な実装に起因しています。攻撃者がこれらの脆弱性を悪用すると、機密情報の漏洩、データの改ざん、システムの破壊などの被害が発生する可能性があります。不正アクセス系の脆弱性には、以下のものがあります。
- ディレクトリトラバーサル(Directory Traversal): 攻撃者がアプリケーションの許可されていないディレクトリにアクセスできるようにする脆弱性です。攻撃者は、アプリケーションに対して許可されていないファイルやディレクトリへのパスを提供することで、セキュリティ制約を回避しようとします。(本記事で詳細を解説)
- ファイルインクルージョン(File Inclusion): アプリケーションが外部のファイルを取り込む際に、攻撃者が不正なファイルを取り込むことができる脆弱性です。攻撃者は、アプリケーションが許可されていないファイルを取り込むように悪用し、任意のコードを実行したり機密情報を盗み出したりすることができます。
- 認証の欠如または不十分な実装: 認証の欠如または不十分な実装は、ウェブアプリケーションが適切なユーザー認証手段を提供せず、不正なアクセスを許可してしまう脆弱性です。これにより、攻撃者はシステムやリソースに不正にアクセスすることができます。(本記事で詳細を解説)
- クッキーの不適切な管理: クッキーの不適切な管理は、ウェブアプリケーションがセッション情報や認証トークンなどの重要な情報をクッキーに格納し、適切なセキュリティ対策を講じていないことを指します。これにより、攻撃者はクッキーを盗み見たり改ざんしたりして、不正アクセスを行うことができます。
これらの脆弱性は、適切なセキュリティ対策が講じられない限り、深刻なセキュリティリスクとなります。そのため、適切な入力バリデーション、エスケープ処理、アクセス権の制限、セキュリティポリシーの実装などの対策が必要です。
では、不正アクセスにまつわる脆弱性についてもう少し深掘りしていきましょう。
ディレクトリトラバーサル(Directory Traversal)
ディレクトリトラバーサルは、ウェブアプリケーションがファイルパスを適切に検証せずに処理することによって発生します。攻撃者は、ディレクトリトラバーサル攻撃を使用して、アプリケーションの許可されていないディレクトリにアクセスしたり、重要なシステムファイルにアクセスしたりすることができます。この攻撃の被害には、機密情報の漏洩、システムのセキュリティの侵害、サービスの停止などが含まれます。
具体的な被害には以下のものが考えられます。
- 機密情報の漏洩: 攻撃者が許可されていないディレクトリにアクセスし、重要なファイルやデータへのアクセスを得ることができます。これにより、ユーザーの個人情報、認証情報、システムの設定ファイルなどの機密情報が漏洩する可能性があります。
- システムの侵害: 攻撃者がシステムファイルやコンフィギュレーションファイルにアクセスすることで、システムのセキュリティが侵害される可能性があります。攻撃者はこれらのファイルを悪用してシステムを破壊したり、悪意のあるプログラムを実行したりすることができます。
- サービスの停止: 攻撃者がシステムの重要なファイルにアクセスし、それらを変更することで、サービスの停止や機能の破壊が発生する可能性があります。たとえば、攻撃者が重要な設定ファイルを変更することで、サービスが正常に動作しなくなることがあります。
- サーバーの悪用: 攻撃者がアプリケーションの許可されていないディレクトリにアクセスすることで、サーバーを悪用して不正な活動を行う可能性があります。たとえば、攻撃者が悪意のあるファイルをアップロードしたり、不正なスクリプトを実行したりすることができます。
これらの被害は、ディレクトリトラバーサル攻撃によってアプリケーションのセキュリティが侵害された際に発生する可能性があります。
ディレクトリトラバーサルの攻撃手法
ディレクトリトラバーサルの主な原因は、アプリケーションがユーザーからの入力(通常はファイルパス)を信頼し、そのまま処理してしまうことです。攻撃者が提供した不正なパスを十分に検証しない場合、アプリケーションが意図していないディレクトリにアクセスされることがあります。
例えば、以下のようなHTTPリクエストがあったとします。
http://example.bloomblock.net/download?file=../../../../../etc/passwd%00 users-manual.pdf
このクエリストリングスを正規化すると、親ディレクトリを示す../
とNULLバイト%00
により、実際にアクセスされるファイルは、ユーザのアカウント情報が格納される/etc/passwd
となります。
攻撃者がこのようなリクエストを送信し、Webアプリケーションが提供されたパスやクエリストリングスを適切に検証せずに使用してしまうと、/etc/passwd
などの重要なシステムファイルにアクセスされる可能性があります。
ディレクトリトラバーサルの対策
ディレクトリトラバーサル攻撃を防ぐための対策としては、入力値の制限、検証が重要です。
- ディレクトリ指定の制限・検証: ファイル名にディレクトリ名を含まない仕様とすれば、Webアプリケーションが指定したディレクトリのみにアクセスされます。また、アプリケーションに提供されたパスを正規化し、不正な相対パス(
../
など)を削除します。 - ファイル名の制限: ドットなどの記号文字を使用不可(文字種の制限)とすることで、攻撃者が不正な相対パス(
../
など)を指定できなくなるため、ディレクトリトラバーサルに対して有効です。 - パスの制限: ファイル名を固定化したり、直接指定ではなく番号などで間接的に指定することで、アプリケーションがアクセス可能なファイルやディレクトリを制限し、不正なアクセスを防ぎます。
アクセス制御や認可制御の欠落
アクセス制御や認可制御の欠落の脆弱性は、ウェブサイトやアプリケーションにおいて、ユーザーが適切な権限を持っていないにもかかわらず、他人のユーザアカウント、システムの機密情報や機能にアクセスできる脆弱性を指します。この欠落があると、攻撃者が個人情報を取得したり、システムの機密情報にアクセスし、悪用される可能性があります。
具体的な被害には以下のものが考えられます。
- 機密情報へのアクセス: 被害者の機密情報や個人情報が不正に取得され、漏洩する可能性があります。
- 不正な操作: 攻撃者がシステムの機能を不正に操作したり、システムに損害を与えたりする可能性があります。
- データ改ざん: 攻撃者がシステム内のデータを改ざんしたり、破壊したりする可能性があります。
アクセス制御や認可制御の欠落の攻撃手法
アクセス制御や認可制御の欠落の主な原因は、適切な認証や認可の実装が不足していることです。具体的な原因としては、適切なアクセス制御のロジックが欠如している、セッション管理が不適切である、データベースやファイルシステムなどのリソースへのアクセスが適切に検証されていないなどが挙げられます。
例えば、以下のようなAPIがあったとします。このAPIは、user-token
(HTTPヘッダーで指定)の持つ権限の範囲で、指定したuser-id
に紐づく情報(Response
)を取得するものです。
<>URL
http://api.bloomblock.net/v1/user-info/{user-id}
<>Header
Authentication: {user-token}
<>Response
{
user: {NAME},
company: {COMPANY},
birth: {BIRTH DATE}
}
以下のように指定してABC社のトークンを利用することで、ABC社アカウントに所属するTanaka Taroさんのユーザ情報を取得できるイメージです。abc-token
には、ユーザの参照権限が付与されており、Response
にはユーザ情報が含まれています。
<>URL
http://api.bloomblock.net/v1/user-info/abc-taro-tanaka
<>Header
Authentication: abc-token
<>Response
{
user: "Tanaka Taro",
company: "ABC",
birth: "1/1/2000"
}
脆弱性があるパターンを考えてみます。このケースでは、abc-token
を利用して、他の会社(XYZ社)の社員情報が閲覧できてしまいます。abc-token
はユーザ参照権限が付与されているものの、あくまで、ABC社に限定されたユーザ情報のみ、つまり、自身で管理している情報のみ参照出来るべきです。しかし、認可の仕組みが欠如している場合、このような情報の漏洩が起こる可能性があります。
<>URL
http://api.bloomblock.net/v1/user-info/xyz-jiro-suzuki
<>Header
Authentication: abc-token
<>Response
{
user: "Suzuki Jiro",
company: "XYZ",
birth: "12/31/1990"
}
アクセス制御や認可制御の欠落の対策
アクセス制御や認可制御の欠落を防ぐための対策としては、適切な認証と認可の実装、アクセス制御のロジックの適切な設計、権限の厳格な管理が重要です。
- ユーザー認証: ユーザーの身元を確認し、適切なアカウントでのみシステムにアクセスできるようにします。認証に必要な情報を複雑化することで、攻撃者に対して、認証情報の推測を難化させることができます。また、多要素認証も導入することで、特定の物理デバイスを所有しているユーザ(アカウント所有者本人)のみがアクセスできる環境にすることも大切です。
- アクセス権限(認可)の検証: ユーザがどのような情報でも作成、読取、更新、または削除できるようにするのではなく、情報の所有権があることを前提とします。
- ログ監視: アクセス制御の失敗をログに記録し、ログイン失敗回数が多い場合など、必要に応じて管理者に警告したり、施行回数を制限することで、不正なアクセスを減らすことができるかと思います。
これらの対策を実装することで、アクセス制御や認可制御の欠落によるセキュリティリスクを最小限に抑えることができます。
セッション管理の脆弱性
セッション管理系の脆弱性は、ウェブアプリケーションがユーザーのセッション情報を適切に管理できない場合に発生します。これにより、悪意のある攻撃者がセッション情報を不正に操作したり、他のユーザーのセッションに侵入したりする可能性があります。一般的なセッション管理系の脆弱性には、以下のものがあります。
- セッション固定攻撃(Session Fixation): 攻撃者が意図的にセッションIDを操作し、被害者に同じセッションIDを割り当てることで、攻撃者が被害者のセッションにアクセスできるようにする攻撃です。
- セッションハイジャッキング(Session Hijacking): 攻撃者が有効なセッションIDを取得し、そのセッションIDを使用して被害者のセッションに不正にアクセスする攻撃です。
- セッション盗聴(Session Sniffing): 攻撃者がネットワーク上の通信を傍受し、セッションIDなどの機密情報を盗み見る攻撃です。HTTPSなどのセキュアな通信プロトコルが使用されていない場合に特に影響があります。
- 不適切なセッションタイムアウト: セッションが適切にタイムアウトされずに長時間維持されることにより、セッションハイジャックなどのリスクが高まります。
セッション管理の不備
セッション管理は、ウェブアプリケーションでユーザーの状態を管理するための仕組みです。セッションは、ユーザーがウェブサイトにアクセスしてから離れるまでの一連の相互作用を表します。ユーザーの認証情報や状態を記憶し、同じユーザーが同じセッションでアクセスした場合に、そのユーザーが同じ状態を維持(お買い物リストの保存、など)できるようにします。
セッション管理の脆弱性は、ユーザーのセッション情報が適切に保護されず、悪意のある第三者によって不正に操作される可能性がある状況を指します。これにより、悪意のある攻撃者がセッション情報を盗み見たり、改ざんしたり、なりすましたりすることができで、被害者のアカウントが乗っ取られたり、機密情報が漏洩したりする可能性があります。
セッション管理の不備の具体的な被害には以下のものが考えられます。
- セッションハイジャック: セッションIDが盗まれると、攻撃者は被害者のセッションと同じ状態を取得できます。これにより、攻撃者は被害者としてシステムにログインし、悪意のある操作を行ったり、機密情報にアクセスしたりすることができます。
- アクセス制御の回避: セッション管理が不適切な場合、攻撃者はセッションIDを操作して、本来アクセスできないリソースにアクセスしたり、権限を超えた操作を行ったりすることができます。これにより、機密情報にアクセスされたり、システムの悪用が行われたりする可能性があります。
- 情報漏洩: セッション情報が暗号化されず、不正アクセスされると、ユーザーの個人情報やセンシティブなデータが漏洩する可能性があります。攻撃者がセッションIDを取得し、それを使用して機密情報にアクセスすることができます。
- セッション固定攻撃: セッションIDが固定されている場合、攻撃者はこのセッションIDを使用して、被害者と同じセッションを維持することができます。これにより、攻撃者は被害者のアカウントに侵入し、機密情報を盗み見たり、不正な操作を行ったりすることができます。
セッション管理の不備の攻撃手法
セッション管理の脆弱性の原因は、セッションIDやその他のセッション情報が適切に保護されていないことで起きます。具体的には、セッションIDが十分にランダムでない、セッションIDがセキュアでない方法で転送される、セッション情報が十分に暗号化されていない、などの要因が考えられます。
- セッションIDがURLパラメーターに含まれ、HTTPリファラーによって漏洩します
- セッションIDがCookieに保存され、セキュアでない通信チャネルを介して送信されます
- セッション情報がセキュアでない方法でデータベースに保存され、SQLインジェクション攻撃によって盗まれます
セッション管理の不備の対策
セッション管理の脆弱性を防ぐための対策としては、セキュアなセッションIDの生成と転送、セッション情報の適切な暗号化、セッションの有効期限の制御などが挙げられます。
- IDのランダム化: セッションIDの生成には、十分にランダムな値を使用し、予測不能なセッションIDを生成します。
- Cookieにsecure属性を追加: セッションIDをCookieのSecure属性とHttpOnly属性を設定して送信し、HTTPSを使用して転送します。
- 新規セッションIDの発行: ログイン成功後に新しいセッションIDを発行することで、攻撃者が事前に入手したIDではアクセスできなくなります。また、セッションの有効期限を適切に設定し、必要以上の期間、保持されないようにします。
CSRF(クロスサイト・リクエスト・フォージェリ)
CSRF(クロスサイト・リクエスト・フォージェリ)は、ウェブサイトがそのユーザーのブラウザを悪用し、ユーザーの意図しないアクション(例えば、フォームの送信やパスワード変更)を行わせる攻撃です。CSRFは、攻撃者が意図した操作を、ユーザー意図がしない形で、信頼している(ユーザーが認証情報を持っている)ウェブサイトに対して無意識に実行させることで起きます。
CSRFの具体的な被害には以下のものが考えられます。
- アカウント情報の変更:
- ユーザーが攻撃者の用意したリンクをクリックすることで、自分の知らないうちにパスワードやメールアドレスが変更される可能性があります。これにより、アカウントへのアクセスを失うことがあります。
- 不正な金融取引:
- オンラインバンキングサイトに対するCSRF攻撃により、攻撃者がユーザーに代わって不正な送金や支払いを行うことがあります。これにより、ユーザーの金融資産が危険にさらされます。
- 個人情報の漏洩:
- ユーザーがソーシャルメディアやメールサービス等でCSRF攻撃を受けると、攻撃者が個人情報を変更したり、機密情報を閲覧したりすることができるようになります。
CSRFの攻撃手法
CSRFの主な原因はウェブアプリケーションがユーザーのリクエストの正当性を適切に検証していないことです。特に、セッション管理が不十分で、認証トークンを適切に扱っていない場合に発生する可能性があります。例えば、攻撃手順は以下のようなものです。
- 攻撃者が罠サイトを用意: 攻撃者は罠のサイトやリンクを用意します、利用者のログイン情報を入手し、リクエストが送信できる状態になっています。
- ユーザーがターゲットウェブサイトにログイン: ユーザーがターゲットウェブサイト(例えばオンラインバンキングサイト)にログインし、認証クッキーを受け取ります。
- ユーザーが攻撃者のウェブサイトを訪問: その後、ユーザーは攻撃者のウェブサイトを訪問します。このサイトには、悪意のあるリンクやフォームが含まれています。
- 攻撃者のウェブサイトからの偽装リクエスト: 攻撃者のウェブサイトは、ユーザーの認証クッキーを使用して、ターゲットウェブサイトに偽装されたリクエストを送信します。
- ターゲットウェブサイトによるリクエストの処理: ターゲットウェブサイトは、このリクエストを正しいユーザーからのものとして処理します。
CSRFの対策
CSRFを防ぐための対策としては、リクエストの正当性を確認することです。
- トークンベースの認証: フォームやAJAXリクエストにユニークなトークンを埋め込み、サーバーがそのトークンの正当性を検証することで、リクエストが正当なソースから来たものであることを確認します。
- パスワード再入力: 重要な処理(商品購入処理など)のタイミングでユーザーにパスワードの再入力を求めることで、ユーザーの意図したリクエストであるかを確認します。
- Referer確認: リクエストのRefererヘッダをチェックして、リクエストが想定されたWebページから送信されているかを確認します。
おわりに
本記事では、Webアプリケーションの不正アクセスとセッション管理の脆弱性である、パス名パラメータの未チェック/ディレクトリ・トラバーサル、アクセス制御や認可制御の欠落、セッション管理の不備、CSRFについて解説しました。
攻撃者は、アクセス制御や認証・認可の仕組みの欠如を利用して、様々な方法で機密情報にアクセスする可能性があります。
次回が最終回となり、残り2つの脆弱性について解説します。
- クリックジャッキング
- バッファオーバーフロー
Webアプリケーション攻撃入門記事の一覧ページはこちらです。