#pgid
[[[openmya:035806] IE における "expression" の過剰検出による XSS の 誘因>http://archive.openmya.devnull.jp/2006.08/msg00369.html]]
が各所で言及されています。
http://cl.pocari.org/2006-08-31-1.html~
http://d.hatena.ne.jp/hasegawayosuke/20060831/p4
#blikimore
以下、引用。
IE では、以下のようなスタイルを記述することで、JavaScript を動作させる
ことが可能です。
1) <style>ブロック内での定義
<style>input { left:expression( alert('xss') ) } </style>
2) インラインでのスタイル定義
<div style="{ left:expression( alert('xss') ) }">
3) コメントの挿入
<div style="{ left:exp/* */ression( alert('xss') ) }">
4) バックスラッシュでのコードポイント指定
<div style="{ left:\0065\0078pression( alert('xss') ) }">
5) 実体参照
インラインでのスタイル定義では、実体参照が利用可能です。
<div style="{ left:expression( alert('xss') ) }">
6) 全角文字
<div style="{ left:expression( alert('xss') ) }">
7) 特定のUnicode文字
<div style="{ left:expRessioN( alert('xss') ) }">
R は U+0280、N は U+0274 または U+207F が利用可能です。
上記 1) , 7) は相互に組み合わせて表記することも可能です。
また、6) および 7) は、IE7 RC1 では動作しません。
全角文字やコメント挿入時もExecuteされてしまうので要注意ですね。~
でも、そもそも外部入力値をそのままHTMLタグの属性値として組み込んで出力する設計自体がNGです。HTMLをタグの属性値を動的に組み立てて出力しなければならないのであれば、カスタムタグを定義して、そのカスタムタグを解釈する独自ジェネレータを通して出力させることで許可したタグ・属性値しか出力できないようにする。または、許可する属性値を限定して、外部入力を直接属性値には組み込まずに属性値を選択させるための値としてのみ利用するのがよいです。
前者の例(Wikiとか)
入力値 :<p_red>見出し</p_red><br>
↓ ジェネレータを通す
出力値 :<p bgcolor="red">見出し</p><br>
この場合、ジェネレータに定義していない記法やHTMLタグは無視される。
(入力値内のHTMLはエスケープしておかなくてはいけません)
後者の例
入力値 :red ※ ユーザはラジオボタンやセレクトボックスなど
のインタフェースで選択して入力
ただし、ユーザはリクエストパラメータを自由に
改変させることができることに注意!!
↓ ジェネレータへ入力
ジェネレータ :例えば、perl等ではハッシュで下記のように定義しておき、
$color = { 'red' => 'red',
'ble' => 'blue',
:
'grn' => 'green' };
入力値に対応するキーの値を取得して出力する
<p bgcolor="$color->{'red'}">
もし、ユーザが$colorに対応するキーのない入力を
送ってきた場合は処理を取りやめてエラーを出したりする。
ユーザにシステムの詳細情報を漏らしたくない場合は
トップページにリダイレクトさせてしまうなどがいいかも。
(Perlの例)
if ( exists $color->{$form{'color'}} ) {
print sprintf('<p bgcolor="%s">', $color->{$form{'color'}});
} else {
print "Location: トップページURL\r\n";
}
こうしておけばブラウザ依存の脆弱性に悩まされることはありません(工数かかりますけど・・・特に前者)
#blikifooter(進地)
#comment