XSSを理解する
XSS:Cross-Site Scripting XSSは、脆弱性の一種。
XSSを学ぶ前に、ブラウザの持つ基礎的なセキュリティ機能(SOP:Same-Origin Policy)を理解する必要がある。
Originは、スキーム, ホスト名, ポート番号の3つの組みとして定義される値。
https://example.com:443/some/path
のもつOriginは、(https, example.com, 443)
SOPは、読み込み、書き込みの制限を行う仕組み
- 同一のOrigin(Same-Originである)を持つ場合、読み込み、書き込みを許可する
- 異なるOriginを持つ場合(Cross-Originである)、読み込みを禁止し、書き込みも部分的に禁止する。
以上の機構がブラウザ内に存在する。
XSS脆弱性には3種類
- Reflected XSS 脆弱性 (反射型 XSS 脆弱性)
- Stored XSS 脆弱性 (蓄積型 XSS 脆弱性)
- DOM-based XSS 脆弱性
Reflected XSS 脆弱性ってなに?
リクエストに含まれる悪意ある値がそのままレスポンンスに出力されることで発生する脆弱性。
<script>alert()</script>
みたいによくあるやつ。
Stored XSS 脆弱性ってなに?
悪意ある値が一度データベースなどの永続ストレージに保存され、その値が出力されることで起こるXSS脆弱性。
<?php
// ... (省略)...
// データベースから情報を取得する
$data = fetch_from_database($id);
// ... (省略) ...
// 取得した情報を中身を問わず・そのままレスポンス中に出力する
echo '<p>' . $data . '</p>';
?>
こんな感じのもの。
DOM-based XSS 脆弱性ってなに?
JavaScriptによるDOM操作で発生する脆弱性。
URLの末尾等からパラメータを取得し、取得した文字列をDOM構築に使用する場合、未検査・未処理の値が到達してしまうことで発生する。
document.body.innerHTML = location.hash.substring(1);
二次対策
CookieにHttpOnly
をつけることでJavaScriptからのアクセスを禁止することができる。
Directory Traversal 脆弱性
filenameに../../../../../../etc/passwd
などを指定することで大事なデータが見られてしまう脆弱性
Linuxプロセスのリーク
Linuxは、procfs
という疑似ファイルシステムを経由して、プロセスに関する情報を公開する。
/proc/(プロセス ID)/cmdline
- プロセス起動時に発行されたコマンドが文字列として格納されたファイル/proc/(プロセス ID)/environ
- プロセスが持つ環境変数が文字列として格納されたファイル/proc/(プロセス ID)/stat
- プロセスのステータスが文字列として格納されたファイル/proc/(プロセス ID)/cwd
- プロセスのカレントディレクトリへのシンボリックリンク
対策
- そもそもファイル名をパラメータとして受け取らない
- パラメータにするなら、ホワイトリストを設定し、参照可能なファイルのみを指定するようプログラムする。
- ディレクトリ名を含みうるファイルパスを受け取らない。(バリデーション)