見た目の裏側で起きている攻防戦
私たちが毎日アクセスしているウェブサイトやアプリは、表面的には美しいデザインと便利な機能を提供していますが、その裏側では複雑なプログラムが動いています。そして、この複雑さの中に、様々な脆弱性(弱点)が潜んでいるのです。
オンラインショッピングで商品を購入する時、SNSに写真を投稿する時、インターネットバンキングで振込をする時、これらすべての操作の裏側で、あなたの情報を守るための仕組みと、それを破ろうとする攻撃者との静かな戦いが繰り広げられています。この章では、ウェブサイトやAPI(アプリケーションプログラミングインターフェース)の弱点を突く様々な攻撃手法について、分かりやすく解説していきます。
データベースへの不正侵入:情報の金庫が破られる仕組み
ほぼすべてのウェブサイトは、ユーザー情報や商品情報などを「データベース」という巨大な情報の倉庫に保管しています。この倉庫への不正侵入について説明します。
SQLインジェクションは、最も有名で危険な攻撃の一つです。SQLとは、データベースと会話するための言語です。通常、ウェブサイトの検索ボックスに「靴」と入力すると、「靴に関する商品を見せて」というSQL命令がデータベースに送られます。しかし、攻撃者が特殊な文字列を入力すると、「すべてのユーザー情報を見せて」という命令に改ざんすることができるのです。
例えば、ログイン画面でユーザー名に「admin' --」のような文字列を入力すると、パスワードチェックを回避してログインできてしまうことがあります。これは、「--」以降をコメント(無視される部分)として扱うSQLの仕組みを悪用したものです。
XXE(XML外部エンティティ)攻撃は、XMLというデータ形式の処理における脆弱性を突きます。XMLは、異なるシステム間でデータをやり取りする際によく使われますが、外部ファイルを読み込む機能を悪用することで、サーバー内の秘密ファイル(パスワードファイルなど)を盗み出すことができます。
安全でないデシリアライゼーションは、もっと複雑な攻撃です。プログラムがデータを保存したり送信したりする際、複雑な構造のデータを単純な形式に変換(シリアライズ)します。このデータを元に戻す(デシリアライズ)際に、悪意のあるコードを実行させることができるのです。まるで、荷物の中に爆弾を仕込んで送り、開封時に爆発させるようなものです。
IDOR(直接参照の不備)は、設計上の欠陥です。例えば、「https://example.com/user/12345」というURLで自分の情報を見られるサイトで、数字を「12346」に変えると他人の情報が見えてしまうような問題です。適切な権限チェックがされていないため、URLを推測するだけで他人の個人情報にアクセスできてしまいます。
これらの攻撃による被害は甚大です。大手企業から数百万人分の個人情報が流出する事件の多くは、SQLインジェクションが原因です。クレジットカード情報、パスワード、住所、電話番号など、データベースに保存されているあらゆる情報が盗まれる可能性があります。
ブラウザを戦場にする攻撃:画面の向こうで実行される悪意
ウェブブラウザは、単にウェブページを表示するだけでなく、様々なプログラムを実行する環境でもあります。この機能を悪用した攻撃について説明します。
XSS(クロスサイトスクリプティング)は、ウェブサイトに悪意のあるスクリプト(プログラム)を埋め込む攻撃です。例えば、掲示板やコメント欄に特殊なコードを投稿すると、そのページを見た他のユーザーのブラウザで悪意のあるプログラムが実行されます。このプログラムは、クッキー(ログイン情報)を盗んだり、偽のログイン画面を表示したり、勝手に「いいね」を押したりすることができます。
CSRF(クロスサイトリクエストフォージェリ)は、ログイン中のユーザーに、知らないうちに操作を実行させる攻撃です。例えば、銀行にログインしている状態で悪意のあるサイトを訪れると、裏で「攻撃者の口座に送金する」というリクエストが送信され、実際に送金が実行されてしまうことがあります。ユーザーは何も操作していないのに、ログイン状態を悪用されて被害に遭うのです。
クリックジャッキングは、透明なレイヤーを使った視覚的な詐欺です。見た目は「動画を再生する」ボタンなのに、実際には透明な「送金を承認する」ボタンが重ねられていて、クリックすると意図しない操作を実行してしまいます。まるで、ガラスの向こうにある別のボタンを押させるような手口です。
オープンリダイレクトは、信頼できるサイトを経由して悪意のあるサイトに誘導する攻撃です。例えば、「https://bank.com/redirect?url=http://evil.com」のようなURLで、銀行の正規サイトから詐欺サイトに自動的に転送されます。URLの最初が正規のサイトなので、多くの人が安全だと勘違いしてしまいます。
SSTI(サーバーサイドテンプレートインジェクション)は、ウェブページを生成するテンプレートエンジンの脆弱性を突く攻撃です。ユーザーの入力がそのままテンプレートとして処理される場合、サーバー上で任意のコードを実行できてしまいます。
これらの攻撃は、ユーザーが通常の操作をしているだけで被害に遭う可能性があるため、非常に危険です。正規のサイトを利用していても、そのサイトに脆弱性があれば攻撃の被害者になってしまうのです。
システムの奥深くへの侵入:サーバーを乗っ取る手口
ウェブサイトが動いているサーバー(コンピューター)そのものを狙う、より深刻な攻撃について説明します。
OSコマンドインジェクションは、ウェブアプリケーションを通じて、サーバーのオペレーティングシステムに直接命令を送る攻撃です。例えば、ファイル名を入力する欄に「file.txt; rm -rf /」のような文字列を入力すると、ファイルを処理した後にシステムの全ファイルを削除する命令が実行される可能性があります。
ディレクトリトラバーサルは、「../」(一つ上のフォルダ)という特殊な文字を使って、本来アクセスできないファイルにアクセスする攻撃です。例えば、画像を表示するURLに「../../../../etc/passwd」のような文字列を入れると、システムのパスワードファイルが表示されてしまうことがあります。
SSRF(サーバーサイドリクエストフォージェリ)は、ウェブサーバーを「代理人」として使い、内部ネットワークや制限されたリソースにアクセスする攻撃です。外部からは直接アクセスできない社内システムに、ウェブサーバー経由でアクセスすることができてしまいます。企業の機密情報が保管されている内部システムへの侵入経路となる危険な攻撃です。
危険なファイルアップロードは、その名の通り、悪意のあるファイルをサーバーにアップロードする攻撃です。画像のアップロード機能に、実行可能なプログラムをアップロードし、それを実行することでサーバーを乗っ取ります。一度実行されると、サーバーの完全な制御権を奪われる可能性があります。
HTTPリクエストスマグリングは、ウェブサーバーとその前段にあるプロキシサーバーとの間の解釈の違いを悪用する高度な攻撃です。一つのリクエストの中に複数のリクエストを忍ばせることで、他のユーザーのリクエストを横取りしたり、改ざんしたりすることができます。
キャッシュ汚染は、ウェブサイトの高速化のために使われるキャッシュ(一時保存)機能を悪用します。悪意のあるコンテンツをキャッシュに保存させることで、他のユーザーにもそのコンテンツを配信させることができます。
これらの攻撃が成功すると、ウェブサイトの完全な乗っ取り、すべてのユーザーデータの窃取、サービスの破壊など、壊滅的な被害をもたらす可能性があります。
API時代の新たな脅威:アプリの裏側を狙う攻撃
現代のウェブサービスやモバイルアプリの多くは、API(Application Programming Interface)を通じて動作しています。APIは、異なるプログラム同士が会話するための窓口のようなものです。このAPIの脆弱性について説明します。
APIの不適切な認可(BOLA等)は、API設計の最も一般的な問題です。BOLA(Broken Object Level Authorization)では、あるユーザーが他のユーザーのデータにアクセスできてしまいます。例えば、自分のプロフィールを取得するAPIで、IDを変更するだけで他人のプロフィールが取得できてしまうような問題です。
レート制限なしは、APIへのアクセス回数に制限がない状態です。これにより、総当たり攻撃が可能になったり、大量のデータを短時間で取得されたりします。例えば、ユーザー検索APIに制限がなければ、全ユーザーの情報を自動的に収集することができてしまいます。
CORS設定不備は、ブラウザのセキュリティ機能の設定ミスです。CORS(Cross-Origin Resource Sharing)は、異なるドメインからのアクセスを制御する仕組みですが、設定が甘いと、悪意のあるウェブサイトからAPIにアクセスされ、ユーザーの情報が盗まれる可能性があります。
最近では、マイクロサービスアーキテクチャの普及により、一つのサービスが数十、数百のAPIで構成されることも珍しくありません。それぞれのAPIが適切に保護されていなければ、どこかが突破口となって全体が危険にさらされることになります。
GraphQLのような新しいAPI技術にも、特有の脆弱性があります。例えば、クエリの深さや複雑さを制限していない場合、意図的に複雑なクエリを送信してサーバーに過負荷をかける攻撃が可能です。
日常でできる身を守る方法:ユーザーとしての対策
これらの攻撃から完全に身を守ることは困難ですが、被害を最小限に抑えるためにできることがあります。
まず、ブラウザを常に最新版に更新することが基本です。ChromeやFirefox、Safari、Edgeなどの主要ブラウザは、定期的にセキュリティ更新を提供しています。自動更新を有効にして、常に最新の保護を受けられるようにしましょう。
ブラウザの拡張機能は慎重に選びましょう。必要最小限の拡張機能のみをインストールし、開発者や評価を確認してから使用します。権限を要求される際は、本当にその権限が必要か考えてから許可しましょう。
フィッシング対策機能を活用しましょう。多くのブラウザには、危険なサイトを警告する機能が組み込まれています。この機能を有効にし、警告が表示されたら必ず立ち止まって確認しましょう。
パスワードマネージャーの使用も効果的です。パスワードマネージャーは、フィッシングサイトでは自動入力が機能しないため、偽サイトに騙されるリスクを減らすことができます。
重要な操作の前後では、URLを必ず確認する習慣をつけましょう。特に、ログインページや決済ページでは、正しいドメイン名であること、HTTPSで保護されていることを確認します。
二段階認証を可能な限り有効にしましょう。たとえパスワードが盗まれても、二段階認証があれば不正ログインを防ぐことができます。
定期的にアカウントのアクティビティを確認しましょう。ログイン履歴や操作履歴を確認し、身に覚えのない活動がないかチェックします。多くのサービスでは、新しい場所からのログインを通知する機能もあります。
最後に、情報の重要度に応じた使い分けが大切です。重要な取引は信頼できる環境でのみ行い、公共のコンピューターや無料Wi-Fiでは、機密情報を扱わないようにしましょう。