前回に引き続き,
文字エンコーディングを利用した攻撃の原理
文字エンコーディングを利用した攻撃には3種類の方法があります。
- 不正な文字エンコーディングを利用する方法
- 文字エンコーディングを誤認識させる
(誤認識を利用する) 方法 - 文字エンコーディングのエスケープ方式を利用する方法
この連載は攻撃方法を詳しく解説する事が目的ではありません。具体的なの攻撃方法の解説はできる限り控え,
前回も触れましたが,
- 文字列の正規化を利用する方法
この方法はJavaを利用した環境でよく発生する脆弱性です。今回の解説を行う3つの攻撃方法とは,
文字の正規化以外にも,
- URLエンコーディングを利用する方法
URLエンコーディングは文字エンコーディングといえませんが,
文字エンコーディングについて
文字エンコーディングを利用した攻撃手法を解説する前に,
文字エンコーディングは
Unicodeは文字コードですが,
UTF-8エンコーディングの場合,
- 注1
- UTF-16の場合も,
1文字が2バイトとは限りません。UCS-4のコード範囲は4バイトで表現します。
- UTFエンコーディングの種類
- UTF-7, UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE
日本語の文字エンコーディングにはUTF以外にJIS
- 参考:文字コード研究 (ラトルズ) ISBN4-89977-051-0
不正な文字エンコーディングを利用した攻撃
日本のWebサイトで利用されている文字エンコーディングは,
不正な文字エンコーディングを利用した攻撃には,
不正な文字エンコーディングを利用した攻撃では,
PHPのXML関連モジュールに利用されているlibxml2も壊れた文字エンコーディングに対する脆弱性が何度も発見されています。壊れた文字エンコーディングがあるとXMLインジェクションが可能となったり,
- 対策:
- 入力時のバリデーション処理で,
すべての文字列に対してエンコーディングが正しいかチェックする。
PHPで文字エンコーディングが正しいかチェックする場合,
文字エンコーディングのチェック例
function check_encoding($value, $key) {
if (!mb_check_encoding($value, 'UTF-8')) {
die('Invalid charactor encoding detected');
}
}
array_walk_recursive($arr, 'check_encoding');
この攻撃に対する対策は非常に簡単ですが,
壊れた文字エンコーディングを検出していれば,
不正な文字エンコーディングを利用したセキュリティ上の問題はどこで発生してもおかしくありません。文字エンコーディングが正しい文字エンコーディングであるかチェックするのは,
文字エンコーディングをチェックしていないWebアプリケーションをそのまま利用するのはリスクが高いので,