ログイン画面を狙った攻撃

ログイン画面と認証、認可
多くのWebアプリケーションがログイン画面を備えており、ログイン機能によってそのWebアプリケーションを利用しようとしている者が本人であることを確認しています。この、利用者が本人であるかどうかを確認、確実にすることを「認証」と言います。メールアドレスやログインIDと合わせてパスワードのように本人しか知らないはずの情報を合わせて入力させることで、利用者が本人であるという確認を行う、パスワードによる認証が広く利用されています。
認証と合わせて使われる言葉として「認可」があります。認可とは、認証された利用者に対して、特定の処理やデータへのアクセス、操作などが許可されているかを確認することです。例えば、自身の住所や電話番号といった登録情報は表示や変更ができますが、他のユーザーの住所や電話番号が見えては困りますので、自分の登録情報だけにアクセスを許可するといった制御が認可制御となります。

ログイン画面は常に攻撃に晒されている
Webアプリケーションのログイン画面は、アプリケーションの入り口でもあり、常に攻撃に晒されています。攻撃者はWebアプリケーションのログインつまり認証機能を突破し、そのWebアプリケーションのユーザーや管理者になりすまして不正にアクセスしようとするからです。
ですので、Webアプリケーションに明確な脆弱性がない場合であっても、例えばユーザーが弱いパスワードをつけている場合などには攻撃者によって認証が突破されWebアプリケーションが不正に利用されることがあります。
攻撃者が認証を突破するための方法として様々な手法が知られています。
- ブルートフォース
特定のユーザーに対して全てのパスワードの組み合わせを順に試みる方法
- リバースブルートフォース
パスワードをありがちなもので固定しておき、ユーザー名を総当たりでログインを試みる方法。ログインIDが社員番号や学籍番号などの場合により効果的に攻撃が行われる - 辞書攻撃
パスワードとしてよく使われている単語を辞書としてあらかじめ準備し、特定のユーザーに対してそれらを順に試す方法 - パスワードスプレー
よく使われているパスワードを、複数のユーザーを対象に順に試みる方法 - パスワードリスト攻撃
他のサイトから流出したメールアドレスとパスワードの持ち込んでログインを試みる方法。複数のサイトで同じパスワードの使いまわしをしているユーザーが多いため、辞書攻撃などと比べると攻撃の成功率が高い - フィッシングサイト
本物そっくりの偽サイトを攻撃者が準備し、利用者を騙して偽サイトにログイン情報を入力させることで、認証情報を盗み出す方法
このようにパスワードによるログインは、攻撃者がパスワードを推測・窃取することで突破できてしまいます。そのため、近年はパスワード以外も利用した多要素認証がWebアプリケーションでも広く利用されるようになってきました。

多要素認証とは
そもそも「認証」とは、対象となる人物が本人であることを確認する行為のことを言います。本人であると確認するために使われる情報としては、一般的に「知識情報」「所有情報」「生体情報」の3種類があります。
知識情報
知識情報とは、パスワードや暗証番号のように本人しか知り得ない情報のことです。ログインにおいて、本人しか知らないはずのパスワードを入力できたのでそれは本人であると確認するのが従来からのパスワードによる認証ということになります。
所有情報
所有情報とは、本人しか持っていないものに紐づいている情報です。例えば、ワンタイムパスワードの生成器であったり各端末に保存されているクライアント証明書などが該当します。また最近では、事前に登録された電話番号に対してショートメッセージで暗証番号が送信される認証方式もありますが、これは、その電話番号に紐づく端末を所有しているのは本人だけだという、所有情報による認証の例です。
生体情報
生体情報は、指紋や瞳の模様である虹彩など、生物学的な特徴に基づいて本人であることを確認するものです。最近では、PCやスマートフォンなどのカメラによる顔認証も広く使われるようになっています。
知識情報は、本人しか知らない情報に頼っているため、万が一それが推測されたり他者に知られたりすると、容易に第三者でも認証を行えることになります。ですので、知識情報に加え他の要素も加えることで、第三者による不正な認証を防ぐという方法が広く採られています。これを「多要素認証」あるいは「二要素認証」と呼びます。
複数の要素の組み合わせですので、「知識情報を2回使ってログインする」のような実装は多要素認証とは厳密には言えません。例えば、「パスワードによる認証後に、追加のワンタイムパスワードを登録されているメールアドレス宛に送る」といった認証方式では、ワンタイムパスワードが送られるメールについても、メールサーバーに対してパスワードによってアクセスしていますので、要素としてはどちらも知識情報による認証となり、厳密な意味での多要素認証、二要素認証ではないということになります。
ログイン画面を狙った攻撃への対策
常に攻撃に晒されるログイン画面をどのように保護すればいいのでしょうか。メールアドレスとパスワードによる典型的なログイン画面の保護として、以下のような方法があります。
- アカウントロック
一定回数のログインの失敗で、そのアカウントを一定時間ロックしログインできなくする方法です。特定のアカウントに対して辞書攻撃や総当たりなどで何度も不正なログインを試行される場合には有効な対策ですが、複数アカウントに対してのログイン試行には効果がありません - 多要素認証の導入
パスワードによるログインに加え、設定済みのスマートフォン上の認証アプリに表示されるコードを入力させる等の多要素認証を導入することで、パスワードリスト攻撃などに対しても被害を抑えることが期待できます - ログイン元IPアドレスの制限
業務用アプリケーションや特定企業内からのみ利用する管理画面などのように、接続元が固定されている場合には、ログイン画面へのアクセス元IPアドレスを制限することも不正ログインへの対策として有効です
また、ログイン処理はログインの成功も失敗も、どちらもログに記録するようにします。ただし、ログにはユーザーが入力したパスワードは記録しないようにします。ユーザーが入力したパスワードを記録してしまうと、ログイン失敗の場合であったとしても、本来のパスワードに近い文字列がログの中に平文のまま記録されてしまうからです。
さらに、直接的に不正なログインを防ぐわけではありませんが、ログイン時やログイン後に重要な登録情報を変更したような場合には、ユーザーに対してメールで通知するようにしておくことで、万が一不正ログインによりアカウントが乗っ取られた場合でもユーザー自身にも気づいてもらえる可能性が高まります。
まとめ
本記事では、メールアドレスとパスワードによる典型的なログイン画面を中心に、攻撃手法とその対策を解説しました。
先にも書いたとおり、ログイン画面・認証機能は常に攻撃に晒されており、そのため対策や実装も日々新しい技術が採り入れられています。本記事内で採り上げた対策方法に留まらず、例えばOpenID Connectなどによりログイン機能を自分たちのアプリケーションではなく外部の認証機能を利用するという方法も広く採られていますし、またPasskeyのようにパスワードを使わずに利便性を損なわずに強固な認証を提供する仕組みも徐々に広まりつつあります。
本記事が安全にログイン画面を実装するための一助となれば幸いです。
下記表の左側にはWebアプリケーションで実装されるそれぞれの機能、表の右側にはその機能を実装するときに発生しがちな代表的な脆弱性や攻撃手法を掲載しています。
どのような機能の実装時にどのような脆弱性を作りこんでしまうのかの参考にしてください。
| 実装する機能 | 発生する脆弱性や関連する攻撃手法 | |
|---|---|---|
| ログイン処理 | 認証機能の突破、セッションに関連する問題 | |
| ユーザーごとの機能 | 認可制御の問題、強制ブラウズ | |
| データの 入出力 |
全体 | パラメータ操作、コードインジェクション |
| HTMLの出力 | クロスサイト・スクリプティング(XSS) | |
| データベースへの アクセス |
SQLインジェクション | |
| ファイルへのアクセス | ディレクトリトラバーサル | |
| 外部コマンドの実行 | OSコマンドインジェクション | |
| サーバー上で状態が変化する処理 | クロスサイト・リクエスト・フォージェリ(CSRF) | |
| エラー処理 | エラーメッセージによる情報漏えい | |
| サーバーからのリクエスト発行 | サーバーサイド・リクエスト・フォージェリ(SSRF) | |
| 正規表現の使用時 | 正規表現によるDoS(ReDoS) | |
| アプリケーション全体 | レースコンディション、バックドアやデバッグモードの残存 | |

