なぜPHPアプリにセキュリティホールが多いのか?
第19回 文字エンコーディングとセキュリティ(1)
文字エンコーディングを正しく,厳格に取り扱わないと,システムのセキュリティに大きく影響します。しかし,広く利用されているアプリケーションでも,大手サイトでも文字エンコーディングを不適切に取り扱っているケースは少なくありません。
今回から4回に分けて,セキュリティと文字エンコーディングをテーマに,Webアプリケーションがどのようなセキュリティ対策を取るべきか解説します。攻撃方法の解説ではないので具体的な攻撃方法は解説しませんが,どのように攻撃されるのかは簡単に解説します。
文字エンコーディングは厳格に扱わなければならない
問題の解説を始める前ですが,いきなり結論から入ります。それは,非常に簡単な原則であるにも関わらず,あまり多くのサイトやアプリケーションで守られていないからです。
- 文字エンコーディング取り扱いの原則
- 文字エンコーディングは厳格に取り扱い,不正な文字エンコーディングを検出した場合,致命的なエラーとして処理しなければならない
これから解説する文字エンコーディング関連の脆弱性は,この原則を守っているだけで多くの問題が防げます。では,早速ですが文字エンコーディングを利用したセキュリティ上の問題を解説します。
文字エンコーディングを利用した攻撃の認知
筆者の知る限り,文字エンコーディングを利用した攻撃を紹介したのは2000年2月にUS-CERTとMicrosoft社が共同で警告した,クロスサイトスクリプティング脆弱性のアドバイザリが初めてです。このアドバイザリ(CA-2000-02)の中で,動的にコンテンツを生成するページではHTTPヘッダで文字エンコーディングを指定しなければならない,としています。
CA-2000-02の
- Solutions for Web Page Developers and Web Site Administrators (Webページ開発者とWebサイト管理者の対策)
の中で
In addition, web pages should explicitly set a character set to an appropriate value in all dynamically generated pages.
(それに加えて,全ての動的に生成されたWebページは明示的に適切な文字コードセットを設定しなければならない)
としています。
文字エンコーディングを利用した攻撃にはさまざまな種類がありますが,文字エンコーディングを利用した攻撃の危険性を具体的に解説したのは,クロスサイトスクリプティング(JavaScriptインジェクション)の危険性を指摘したこのアドバイザリが初めてだと思います。最初に書いた結論と同じく,文字コード(文字エンコーディング)を適切(明示的)に取り扱うことがクロスサイトスクリプティング攻撃を防ぐための対策として必要である,としています。
- 参考:CA-2000-02
文字エンコーディングを利用した攻撃の種類
US-CERTのCA-2000-02を見ると,Webアプリケーションでは文字エンコーディングは厳格に取り扱うべき情報である,と分かると思います。しかし,攻撃対象となるアプリケーションはWebアプリケーションとは限りません。
文字エンコーディングを利用した攻撃対象にはさまざまなバリエーションがあります。
- SQLインジェクション
- XPathインジェクション
- JavaScriptインジェクション
- HTMLインジェクション
- XMLインジェクション
JavaScript,HTMLインジェクションはWebアプリケーションが攻撃対象といえますが,マルチバイト文字を取り扱うシステムであれば,文字エンコーディング攻撃に脆弱になる可能性があります。攻撃対象は多いですが,基本的な攻撃の原理は同じです。原理が同じなので対策もほぼ同じなります。この事実は開発者にとって非常に重要ですが,広く知られている,とは言えないのが現状です。
原理は同じで対策もほぼ同じと書きましたが,
- パス遷移攻撃 (ディレクトリトラバーサル)
文字エンコーディングを利用したこの脆弱性の攻撃は,ほかの脆弱性と種類が異なるので対策が異なります。詳しくは解説しませんが,文字エンコーディング以外のエンコーディングも攻撃に利用可能である例も紹介します。
まとめ
どのように攻撃されるのかは紹介しませんでしたが,文字エンコーディングを利用した攻撃が幾つも存在することを理解していただけたと思います。次回は文字エンコーディングを利用した攻撃の原理を解説します。
なぜPHPアプリにセキュリティホールが多いのか?
- 第46回 セキュリティ対策を考える上で欠かせないコンテクスト
- 第45回 入力バリデーションはセキュリティ対策
- 第44回 セキュリティ対策が確実に実施されない2つの理由
- 第43回 PHP 5.3のcrypt関数の問題
- 第42回 PostgreSQL 9.0に見るSQLインジェクション対策
- 第41回 PHP 5.3.4におけるセキュリティ上重要な仕様変更
- 第40回 MOPS:安全性の高いパスワードハッシュ作成ツール - phpass
- 第39回 MOPS:静的PHPソースコード脆弱性スキャナ RIPS
- 第38回 MOPS:PHPにおけるコード実行(2)
- 第37回 MOPS:PHPにおけるコード実行(1)
-
Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?
本書は,Webサイトのセキュリティ確保のために必要な基礎知識と,安全なコードを書くために必要な基礎知識を解説しています。Webアプリケーションは比較的簡単に作成で...
-
はじめてのPHP言語プログラミング入門
Webアプリケーション構築ツールとしてPHPを取り上げた書籍は数多くありますが,言語の解説・入門書としての書籍はあまりありません。 本書は,プログラミング言語として...
-
PHPセキュリティー対策
PHPセキュリティー対策のメモ※注:php超初心者のメモです
文字や文字列長を制限する
使う予定の無い文字の存在は?配列の数が多くないか?
数字を扱う場合は、その数字...Tracked : #1 SideSiteNote (2009/05/21, 14:21)

