セキュリティ

トップ > セキュリティ

目次

クロスサイトスクリプティング(XSS)

Cross Site Scripting。Web アプリケーションの脆弱性のひとつで、HTML を動的に生成する際、悪意のあるユーザから送られたデータをそのまま HTML として表示してしまい、悪意のあるスクリプトが実行されてしまうものです。一種の HTMLインジェクション とも言えます。例えば、下記のようなテンプレートで $data に 「山田<script>悪意のあるスクリプト</script>太郎」 というデータが送信された場合、悪意のあるスクリプトが実行されてしまいます。

<div>$data</div>
 ↓
<div>山田<script>悪意のあるスクリプト</script>太郎</div>

詳細は 「クロスサイトスクリプティング (XSS: Cross Site Scripting)」を参照してください。

フォージェリ(偽装)

フォージェリ(forgery)は「偽装」を意味します。悪意の無い利用者のフリをして(偽装)して、脆弱性のサイトに攻撃を仕掛けます。フォージェリ系の攻撃には下記などがあります。

クロスサイトリクエストフォージェリ(CSRF)

Cross Site Request Forgery。Web アプリケーションの脆弱性のひとつで、例えば、攻撃者が自分のサイトや各種掲示板に仕掛けた下記の様なリンクを利用者がクリックした場合、利用者のブラウザから脆弱性のあるサイトに悪意のあるリクエストが、利用者の名義で送信されてしまうものです。ID/パスワードで守られているページであっても、利用者がログインしている間はセッションが有効であり、書き込みが成功してしまいます。これにより掲示板に利用者の名義で悪意のある書き込みが行われたり、不正な送金が行われたりします。

<a href="http://脆弱性のあるサイト/post.cgi?msg=悪意のある書き込み">詳細はこちら</a>

CSRFの対策としては、CSRFトークンを用いるのが一般的です。サーバ側でセッションIDやその他の値から CSRFトークンと呼ばれるトークンを生成し、フォームに hidden で埋め込みます。フォームのデータを受け取った際にこのトークンを検証することにより、情報が自ら生成したフォームに入力されたもの、つまり、悪意のあるフォームに入力されたものではないことを検証します。

<form method="POST" action="post.cgi">
  <input type="hidden" name="csrf_token" value="550e8400e29b41d4a716446655440000">
  <input type="text" name="msg">
</form>

サーバサイドリクエストフォージェリ(SSRF)

Server Side Request Forgery。サーバ側のプログラム、ミドルウェア、ライブラリ、OS 等の脆弱性を攻撃することで、サーバ上で不正なコマンドを実行し、リモートシェル(rsh) などを用いてサーバからさらに、内部サーバや外部の第三者サーバに攻撃を仕掛けるものです。ブラウザ利用者の権限でサーバに攻撃を仕掛けるのが CRFS。サーバの権限でさらに他のサーバに攻撃を仕掛けるのが SSRF に分類されます。

インジェクション攻撃

Injection Attack または Code Injection とも呼ばれます。インジェクション(injection)は 「注入」 を意味します。HTML や SQL の中に悪意のあるデータを忍び込ませる(注入する)ことにより、悪意のあるスクリプトや命令を実行させる攻撃です。代表的にあものに下記などがあります。

HTMLインジェクション

HTML Injection。Web アプリケーションの脆弱性のひとつで、HTML を動的に生成する際に、ユーザから送り込まれたデータをそのまま HTML として表示してしまい、悪意のある書き込みや、悪意のあるスクリプトが実行されてしまうものです。HTML インジェクションの脆弱性を持ったサイトの多くは、クロスサイトスクリプティング の標的とされます。

SQLインジェクション

SQL Injection。Web アプリケーションの脆弱性のひとつで、サーバサイドで SQL 文を動的に生成する際に、ユーザから送り込まれたデータをそのまま SQL 文として実行してしまい、データ破壊、データ漏洩などの被害が生じるものです。例えば、下記の例で $data に 「Yamada'; delete from users where user_name like '%」 というデータが送り込まれた場合、すべてのユーザデータが消失してしまいます。

select * from users where user_name = '$data';
 ↓
select * from users where user_name = 'Yamada'; delete from users where user_name like '%';

LDAPインジェクション

サーバサイドで LDAP の構文を動的に生成する際に、ユーザから送り込まれたデータをそのまま利用してしまい、LDAP サーバへの不正アクセスを発生させるものです。例えば下記の例では、$user に 「tanaka)|(objectClass=*」、$passwd に 「dummy)」 を指定されることで、パスワードが誤っていてもログインできてしまいます。

(&(user=$user)(passwd=$passwd))
 ↓
(&(user=tanaka)(|(objectClass=*)(passwd=dummy)))

OSコマンドインジェクション

Web アプリケーションの脆弱性のひとつで、サーバサイドで OS コマンドのコマンドラインを動的に生成する際に、ユーザから送り込まれたデータをそのままコマンドラインとして実行してしまい、ファイル破壊、ファイル改竄などの被害が生じるものです。例えば、下記の例で $data に 「yamada; rm -rf /」 というデータが送り込まれた場合、権限のあるすべてのファイルが削除されてしまいます。

/opt/myapp/bin/add_user $data
 ↓
/opt/myapp/bin/add_user yamada; rm -rf /

HTTPヘッダインジェクション

Web アプリケーションの脆弱性のひとつで、HTTP ヘッダを動的に生成する際に、ユーザから送り込まれたデータをそのままヘッダに埋め込んでしまい、不正なヘッダや表示の埋め込み、XSS と同様の悪意のスクリプトが実行されてしまうものです。例えば、下記の例で $data に 「1234⏎⏎<script>悪意のあるスクリプト</scirpt>」が送り込まれた場合、空行は HTTP ヘッダの終わりとみなされるため、スクリプトは HTML として解釈されることとなり、XSS と同様の問題が発生します。この改行コードによる攻撃は CRLFインジェクション とも呼ばれます。

Set-Cookie: data=$data
 ↓
Set-Cookie: data=1234

<script>悪意のあるスクリプト</script>

メールヘッダインジェクション

Webアプリケーションの脆弱性のひとつで、メールヘッダを動的に生成する際に、ユーザから送り込まれたデータをそのままメールヘッダに埋め込んでしまい、宛先の追加などのヘッダ改竄、メール本文改竄などが行われるものです。これも CRLFインジェクションのひとつです。例えば、下記の例で $data に 「foo@example.com⏎Bcc: 悪意のあるユーザのメールアドレス」 が送り込まれた場合、メールは、悪意のあるユーザにも Bcc で送信されることとなります。

To: $data
 ↓
To: foo@example.com
Bcc: 悪意のあるユーザのメールアドレス

スクリプトインジェクション

テンプレートエンジンを用いるなどして JavaScript 中にユーザから送り込まれたデータをそのまま参照してしまい、悪意のあるスクリプトが実行されてしまうものです。下記は JavaScript の例ですが、$data に 「'; 悪意のあるスクリプト; var dummy = '」 が送り込まれた場合、JavaScript 実行時に悪意のあるスクリプトが実行されてしまいます。

<script>
var data = '$data';
</script>
 ↓
<script>
var data = ''; 悪意のあるスクリプト; var dummy = '';
</script>

XMLエクスターナルエンティティ(XXE)

XML External Entiry。XML に対するインジェクション攻撃です。XML を解析する際に、&参照名; に対する DTD を定義することで、システムファイルを参照できてしまうことを悪用するものです。下記の例では、$data の中に foo 要素および、その中で利用可能な &baa; 実体参照の DTD 自体を送り込むことで、システムファイル /etc/password を読み出そうとしています。

<data>$data</data>
 ↓
<data>
<!DOCTYPE foo [
  <!ELEMENT foo ANY>
  <!ENTITY baa SYSTEM "file:///etc/password">
]>
<foo>&baa;</foo>
</data>

ディレクトリトラバーサル

traversal は 「縦走」と訳されます。サーバ側でパス名を動的に生成する際に、ユーザから送り込まれたデータを不用意に使用してしまうことにより、OS のシステムファイルに不正にアクセスされてしまうものです。例えば、下記の例で $data に 「../../../etc/passwd」 というデータが送り込まれた場合、/etc/passwd ファイルが読み取られてしまう危険性があります。対策としては、受け取ったデータに .. や / などの文字列が含まれていないことを確認する必要があります。

$file = '/var/app/files/' + $data;
 ↓
$file = '/var/app/files/' + ../../../etc/passwd;

Nullバイト攻撃

ディレクトリトラバーサル に関連する攻撃のひとつで、文字列の中に %00, \0, \x00 などの Null文字 を含めることで、プログラムのチェックをすり抜けるものです。例えば、下記の例では、最後に拡張子 .jpg を付与しているため、$data に ../../../etc/passwd を指定されても、/etc/passwd.jpg となり、JPEG ファイル以外にはアクセスできないはずですが、PHP の一部の関数などでは Null文字を文字列の終端とみなしてしまうため、../../../etc/passwd\0 を指定すると、/etc/passwd ファイルにアクセスできてしまいます。

$file = '/var/app/img/' + $data + '.jpg';
 ↓
$file = '/var/app/img/' + ../../../etc/passwd\0 + '.jpg';

ファイルインクルージョン

ディレクトリトラバーサルNullバイト攻撃 によって不正なファイルを読み込まれてしまうものです。通常はサーバ上のローカルファイルを読み込まれるのでローカルファイルインクルージョン(LFI)と呼ばれますが、ファイル名に http://~ を指定すると、リモートファイルを読み込むシステムでは、リモートファイルインクルージョン(RFI) の問題も発生します。。

include($data);
 ↓
include('http://悪意のあるサイト/悪意のあるファイル');

オープンリダイレクト

悪意を持ったユーザによりリダイレクト先の URL を改竄されるものです。下記の様に、POST や GET のパラメータとしてリダイレクト先の URL をブラウザから送信するケースで、悪意を持ったユーザが、hidden パラメータを改竄したフォームやリンクを利用者にクリックさせることで、利用者を悪意のあるサイトに誘導します。サーバー側で、リダイレクト先の URL のドメインが正しいかなどの妥当性をチェックする必要があります。

<form ...>
  <input type="text" name="id">
  <input type="password" name="pw">
  <input type="hidden" name="url" value="http://example.com/dashboard">
  <input type="submit" value="Login">
</form>

クリックジャッキング

ジャック(jack)はハイジャック(hijack)と同様、「奪い取る」の意味があります。利用者が攻撃対象のサイトにログインした状態で、悪意のあるサイトのページを開いた際、悪意のあるページのボタンの上に、攻撃対象のページを透明な <iframe> で表示することにより、利用者が意図しないまま攻撃対象サイトの「いいね」ボタンや退会ボタンなどをクリックさせられてしまうものです。HTTP ヘッダに X-Frame-Options を指定することにより、<frame> や <iframe> での表示を制限する対策が有効です。

<button style="position:absolute; top:300px; left:300px;">Click</button>
<iframe src="攻撃対象のページ"
  style="position:absolute; top:0; left:0; width:100%; height:100%; opacity:0.0;"></iframe>

ブルートフォースアタック

brute は 「けだもの」、brute force で「けだものの様に力づくで」 を意味します。日本語では 「総当たり攻撃」 とも訳されます。パスワードを、よく使われるパスワードの辞書やランダムな文字列を使用して総攻撃をかけるもので、p@ssw0rd などよく使われるパスワードの場合数秒で突破されてしまいます。パスワード誤りが何度が続くとアカウントをしばらくロックするなどの対策があります。

リバースブルートフォースアタック

ブルートフォースアタックはユーザIDを固定して色々なパスワードを試す攻撃ですが、逆に、パスワードを固定して色々なユーザIDを試す攻撃です。よく使用されるパスワードを固定し、推測されるユーザIDを変更しながら攻撃します。ブルートフォースアタック対策をしていても、ユーザIDがころころ変わるため、アカウントロック等の対策が難しくなります。

クロスサイトトレーシング(XST)

XSS 脆弱性のあるサイトに対してスクリプトを埋め込み、HTTP の TRACE メソッドを発行することで、リクエストに含まれる Authentication ヘッダの内容を読み取ってしまう攻撃です。TRACE メソッドでは、リクエストされた内容をそのままレスポンスとして返却するため、リクエストに含まれる Basic 認証の ID/パスワードなどを盗み出すことが可能となります。対策としてはサーバ側で TRACE を受け付けないように設定するなどがあります。

強制ブラウジング

あるサイトのURLに対して、隠しファイルや隠し機能を探し回る攻撃です。https://~/ の後ろに /tmp、/temp、/admin.php などを付加してアクセスを試みます。サイトによっては作業で使用した一時ファイルが /tmp に放置されていたり、/admin.php で管理者機能画面に遷移してしまったりなどが考えられます。


Copyright (C) 2018 杜甫々
初版:2018年2月25日 最終更新:2023年11月26日
http://www.tohoho-web.com/ex/security.html