サイバー攻撃の種類をまとめてみました。
- SQLインジェクション
- OSコマンドインジェクション
- HTTPヘッダインジェクション
- HTTP レスポンスの改ざん
- どのように攻撃が成立するのか
- 不正なスクリプトの実行や、攻撃者による任意の文字列の表示
- HTTP cookie を設定できる
- キャッシュの汚染
- リダイレクト
- メールヘッダインジェクション
- ディレクトリトラバーサル攻撃
SQLはデータベースを操作するプログラミング言語です。
SQLインジェクションは、SQLを使用するアプリケーションに対して、想定されていないSQL文を実行させることによって、データベースを不正に操作する攻撃のことです。
たとえば 下記のselect文があるとします。
SELECT * FROM members WHERE name = ‘ユーザID’ AND password = ’パスワード’
ユーザIDとパスワードをそれぞれユーザが入力した文字列に置き換えて実行するとします。
ユーザは通常、以下のように入力します。
ユーザID SATO
パスワード 5E3!#PoI
しかし、攻撃者が下記の値を入力したとします。
ユーザID SATO
パスワード ’ OR ‘a=a
この場合 a=aは常に真であるため、パスワードが正しいかどうかにかかわらず、SATOさんの会員情報が攻撃者に提供されてしまいます。
これが SQL インジェクション呼ばれる攻撃です。
これを防ぐためには、sqlのメタキャラクタ(特殊文字)が引数に含まれている場合は特殊処理をする必要があります。
ユーザが入力した文字列をもとにOSのコマンドを呼び出すウェブアプリケーションに対して、攻撃者がコマンドを入力し不正な操作をする攻撃のこと。
例えばユーザが入力した文字列を引数として OS にわたして nslookup コマンドを実行するアプリケーションにおいて
引数にセパレータとほかのコマンドを含めることで、セパレータの後に指定されたコマンドを実行すること。
正常なURLの最後に改行コードコードを追加してそのあとに不正な文字列を入れることで HTTP レスポンスを改ざんし、不正なサイトに誘導する攻撃。
少し複雑なので2段階に分けて説明します。
1. HTTPレスポンスの改ざん
ブラウザはウェブサーバに GET メソッドでクエリストリング付で(パラメータを指定して)データを送ることができます。
http://info-secure.com/index.html?var1=0
【注記】ここでURLに指定されたパラメータをクエリストリングといいます。
リクエストを受け取ったサーバは、以下の行を含むHTTPレスポンスを返します。
Set-Cookie:var1=0
次に、ブラウザがウェブサーバに以下のリクエストを送るケースを考えます。
http://info-secure.com/index.html?var1=0 改行コード 改行コード <html><body> スクリプト </body></html>
(以下、このURLを不正なリクエスト Rと呼びます)
改行コードが2つ連続すると空行になるので、リクエストを受け取ったサーバは、以下の行を含むHTTPレスポンスを返します。
Set-Cookie:var1=0
<html><body> スクリプト </body></html>
HTTPレスポンスでは改行の後はボディ部分となるため、レスポンスを受け取ったブラウザは、Rに含まれるスクリプトを実行してしまいます。
これが HTTPヘッダインジェクションです。
2. どのように攻撃が成立するのか
1の説明だけ読むと、自分のブラウザがアクセスした結果としてHTTPヘッダにスクリプトが挿入(インジェクション)されるので、自分で自分を攻撃しようとしなければ問題内容に思えますが、実際は、1 で説明した仕組みを攻撃に利用することができます。
例えば、掲示板が利用される場合です。
ウェブサイトを運営するA社の掲示板に、攻撃者Bが改行コードを2つ連続して含んだクエリストリングを持つURLを含む投稿をします。
その掲示板を閲覧したCさんのブラウザで、Rに含まれる不正なスクリプトが実行されます。
上記は、不正なスクリプトが実行される場合ですが、このような不正なスクリプトの実行も含め、HTTPヘッダインジェクションでは以下の攻撃が実施できることがあります。
仕組みは上で説明したとおりです。スクリプトの部分を文字列にすれば、任意の文字列を表示することができます。
「HTTPレスポンスの改ざん」で説明した文字列の部分に cookie を設定する行を含めれば、任意の cookie を設定することができます。
HTTPヘッダインジェクションでHTTPレスポンスのボディに不正な内容を含めることで、その不正な内容がキャッシュされ、別のユーザDがA社のウェブサイトAにアクセスしたときに不正な内容が表示されます。
別のサイトにリダイレクトされます。
またリダイレクト先がA社のサイトのように偽装されている場合、詐欺に使われる個人情報をユーザが入力してしまう可能性もあります。
メールは以下の構造をしています。
メールヘッダ
改行
メールボディ
メールヘッダインジェクションは、ウェブページに張り付けられたメール送信フォームのサブジェクト(標題)や送信元メールアドレスに不正な文字列を含ませることで、メールヘッダに意図しない送信先を含め、意図しない送信先にメールを送信することです。
例えば、ウェブページに以下のメール送信フォームが設置されているとします。
【タイトル】__________
【お客様メールアドレス】 __________
【お問い合わせ内容】______________
メール送信フォームでは通常、メールの送信先(メールの TO欄)は固定されています。
しかし、タイトル欄に以下の内容を入力してみます。
問合せ%0d%0aBcc%3a%20sample@info‐secure.com
ここで %0d%0a は改行、%3a はコロン(:)、%20は空白を表しますので、この行はメールヘッダ内で次の2行となります。
Subject: 問合せ
Bcc:sample@info‐secure.com
このメールを送信すると、sample@info‐secure.comあてにも送られることになります。
上記はタイトル欄に不正な文字列を含める方法ですが、お客様メールアドレス欄に不正な文字列を含めることができます。
例えば以下のように入力します。
【お客様メールアドレス】 sato@info‐secure.com%0d%0aBcc%3a%20sample@info‐secure.com
この行は、メールヘッダ内で次の2行となります。
From:sato@info‐secure.com
Bcc:sample@info‐secure.com
ユーザからの入力を受付け、ファイル名として使用するウェブアプリケーションに対して、ディレクトリの位置を表す文字列、例えば 1つ上位の階層を示す ../ を入力値に含めることにより、通常はアクセスできないファイルへのアクセスを試みる攻撃。