| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
2007-08-21 アンチ「サニタイびんぷ」
● 画像版サニタイズ言うな(2)
前回のエントリーの後、mod_imagefightのコマンドライン版を作ったりして、検証してみました。まだ検証途中ですが、今回はBMP形式についてのアンチmod_imagefightについて紹介します。
まず、BMP形式のヘッダは以下のようになります(カッコ内はバイト数)。
0000:MARK(2) ='BM' 0002:ファイルサイズ(4) 0006:予約1(2) =0 0008:予約2(2) =0 000A:ビットマップ開始位置(4) 000E:ヘッダサイズ(4) =0x28 0012:イメージ横幅(4) 0016:イメージ高さ(4) 001A:プレーン数(2) =1 001C:ピクセルあたりのビット数(2) 1,4,8,24 001E:圧縮形式(4) =0,1 0022:圧縮後のイメージサイズ 0026:水平解像度(4) 002A:垂直解像度(4) 002E:使用色数(4) 0032:重要な色数(4) 0036:カラーパレット BGR0 の繰り返し(8ビット以下の場合のみ) XXXX:サニタイジング文字列 ※注 ZZZZ:ビットマップ上記で、サニタイジング文字列(※注)については、mod_imagefightが挿入する部分です。BMPは上記のように単純な形式のため、カラーパレットの後にサニタイジング文字列が来ています。本来はカラーパレットの前にこれを起きたいのですが、BMPの構造上、それは不可能と思われます。id:takesakoさんも相当苦労されたのではないかと思います。
このため、カラーパレット(を含むヘッダ部分)については、サニタイジング文字列以外の方法で対処が必要となります。BMPの場合、カラーパレットは最大1024バイト確保されるので、とくにカラーパレットに対する対策は重要です。
mod_imagefightで採用されている方法は次の二点です。
まず、通常カラーパレットは24ビット(3バイト)で表現されますが、BMP形式の場合は、ワード境界に合わせたのか、カラーパレットは一色あたり4バイト使います。4バイト目は予約領域であり、0が入ることになっていますが、ここに攻撃用の文字列を挿入することは可能です。
このため、mod_imagefightでは、この4バイト目の領域を強制的に0にリセットしています。
次に、RGB値に対しては、たまたま'<'や'>'の値になった場合は、値を一つ増やすことによって'<'や'>'の出現を防止しています(関数sanitize_RGB)。ここは、mod_imagefightでもっとも苦しいなぁと感じるところで、微妙に色が変化することになりますが、実用上はそれほど問題にはならないのでしょう。きっと。
さて、この前提で、mod_imagefightに対する攻撃手法を検討します。
BMPは単純な構造であり、またヘッダの多くはmod_imagefightによる正規化により値をあるべき値に変更されています。攻撃文字列のほとんどは、カラーパレットに置くしかないでしょう。しかし、この部分には、肝心の'<'と'>'を使うことができません。
唯一、mod_imagefightが見逃している領域として、「002E:使用色数(4)」があります。ここにタグを書くことにしましょう。といっても、'<'は一つ書くのがせいぜいなので、JavaScriptはイベントハンドラの中に書くことにします。使用色数は4バイトしか使えないので、<IMG>を使うことにして、JavaScriptはonloadイベントとして記述します。
使用色数:<IMG
パレット: SRC="a.png" onload="alert('xss');"
ただし、このままでは、カラーパレットに対する4バイト目のゼロクリアで、JavaScriptがズタズタに切り裂かれますので、3バイトずつに区切った上で、間に一文字入れておきます。以下では、区切りを「~」で表現していますが、ここはゼロクリアされるので、値は何でもかまいません。IEがヌル文字(値0の文字)を無視する性質を利用しています。
パレット: SR~C="~a.p~ng"~ on~loa~d="~ale~rt(~'xs~s')~;"この状態で、mod_imagefightを通すと、以下のようになります。
また、IEでこの画像を表示されると、以下のようにJavaScriptが起動されます。a.pngが存在することが必要ですが、置き場所は調整可能です。
この攻撃への対策は簡単だと思いますので、id:takesakoさんが速攻で修正してくださることでしょう。イメージファイトはまだまだ続く・・・
PS.
mod_imagefightにはGET32LEとかGET32BEというマクロが出てきます。LEとBEはそれぞれリトルエンディアンとビッグエンディアンを表すような気がしますが、名前と実体が逆になっているようです。ご確認を。
参考文献
T.Teradaの日記 - [セキュリティ]ImageFight2
葉っぱ日記 - Apacheに埋め込まれたイメージファイトと戦う文字コードな方法
追記
id:takesakoさんからはてなブックマークコメントを頂戴しました。>ゼロじゃない別の文字でパディングする方法も検討してみます。
これは巧妙な方法ですね。カラーパレット中の予約領域をゼロでクリアしているために、却ってIEがゼロ(ヌル文字)を無視するという仕様を悪用されるわけで、意味のある文字を挿入したら、パレット領域に攻撃文字列を仕込むことは非常に困難になるでしょうね。
# どの文字だったら、攻撃が成立し得るかを考えることは、挑戦的なパズルではありますが。
今後の改良に期待します。
[ツッコミを入れる]
[TrackBack URL: http://www.tokumaru.org/d/tb.rb/20070821]
本日のリンク元
その他のリンク元
- http://www.tokumaru.org/ ×132
- http://labs.cybozu.co.jp/blog/takesako/2007/08/lls... ×22
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×15
- http://b.hatena.ne.jp/ockeghem/imagefight/ ×7
- http://search.live.com/results.aspx?q=imagefight&m... ×6
- http://b.hatena.ne.jp/HiromitsuTakagi/ ×6
- http://b.hatena.ne.jp/keyword/サニタイジング ×5
- http://labs.ceek.jp/hbnews/list.cgi ×4
- http://b.hatena.ne.jp/ockeghem/ ×4
- http://a.hatena.ne.jp/harupu/ ×4
- http://b.hatena.ne.jp/ockeghem/favorite ×4
- http://b.hatena.ne.jp/TAKESAKO/ ×3
- http://d.hatena.ne.jp/ockeghem/?of=5 ×3
- http://b.hatena.ne.jp/keyword/サニタイズ ×3
- http://d.hatena.ne.jp/ockeghem/about ×3
- http://www.tokumaru.org/index.htm ×3
- http://b.hatena.ne.jp/t/tksk ×3
- http://b.hatena.ne.jp/entry/5644709 ×3
- http://d.hatena.ne.jp/butyricacid/20070820/1187561... ×3
- http://b.hatena.ne.jp/ockeghem/bmp/ ×3
- http://d.hatena.ne.jp/monjudoh/20070807/1186505259... ×2
- http://b.hatena.ne.jp/ockeghem/bmp/?mode=detail ×2
- http://b.hatena.ne.jp/keyword/bmp ×2
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×2
- http://a.hatena.ne.jp/ockeghem/ ×2
- http://b.hatena.ne.jp/Kanatoko/20070822 ×2
- http://b.hatena.ne.jp/hasegawayosuke/イメージファイト/ ×2
- http://b.hatena.ne.jp/TAKESAKO/20070822 ×2
- http://b.hatena.ne.jp/hasegawayosuke/ ×2
- http://search.live.com/results.aspx?q=imagefight ×2
- http://d.hatena.ne.jp/teracc/20070808 ×2
- http://b.hatena.ne.jp/Kanatoko/favorite ×2
- http://b.hatena.ne.jp/hasegawayosuke/イメージファイト/?mod... ×2
- http://www.tokumaru.org ×2
- http://b.hatena.ne.jp/entrylist?sort=hot&of=100&th... ×1
- http://labs.ceek.jp/hbnews/ ×1
- http://b.hatena.ne.jp/keyword/サニタイジング?threshold=3 ×1
- http://b.hatena.ne.jp/keyword/エンディアン ×1
- http://dragon.jp/column/archives/cookie.html ×1
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=400&th... ×1
- http://b.hatena.ne.jp/miyagawa/favorite ×1
- http://b.hatena.ne.jp/keyword/サニタイズ?threshold=1 ×1
- http://d.hatena.ne.jp/keyword/LLSpirit ×1
- http://b.hatena.ne.jp/keyword/XSS?of=25&sort=hot&t... ×1
- http://b.hatena.ne.jp/t/mod_imagefight ×1
- http://wafful.org/mod_imagefight/mod_imagefight.c ×1
- http://d.hatena.ne.jp/ockeghem/20070528 ×1
- http://b.hatena.ne.jp/t/bmp?threshold=3 ×1
- http://b.hatena.ne.jp/ockeghem/xss/imagefight/ ×1
- http://b.hatena.ne.jp/ockeghem/bmp/xss/ ×1
- http://a.hatena.ne.jp/mao140/ ×1
- http://www.junk-search.com/tag/nsr250r 88.html ×1
- http://209.85.175.104/search?q=cache:sv9x_B88euYJ:... ×1
- http://209.85.175.104/search?q=cache:sv9x_B88euYJ:... ×1
- http://b.hatena.ne.jp/entrylist?url=http://&thresh... ×1
- http://b.hatena.ne.jp/entrylist?url=http://&sort=h... ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=100&th... ×1
- http://tokumaru.org/ ×1
- http://b.hatena.ne.jp/TAKESAKO/イメージファイト/ ×1
- http://d.hatena.ne.jp/keyword/サニタイジング ×1
- http://d.hatena.ne.jp/ockeghem/ ×1
- http://209.85.165.104/search?q=cache:sv9x_B88euYJ:... ×1
- http://b.hatena.ne.jp/send/?of=800 ×1
- http://b.hatena.ne.jp/ockeghem/20070822 ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&threshold... ×1
- http://d.hatena.ne.jp/keyword/トルエン ×1
- http://b.hatena.ne.jp/monjudoh/xss/?mode=detail ×1
- http://209.85.175.104/search?q=cache:HRihFNOG1hQJ:... ×1
- http://b.hatena.ne.jp/t/イメージファイト ×1
- http://b.hatena.ne.jp/t/imagefight ×1
- http://b.hatena.ne.jp/t/mod_imagefight?sort=eid ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=0&thre... ×1
- http://labs.ceek.jp/hbnews/list.cgi?p=1&c=0 ×1
- http://b.hatena.ne.jp/t/security ×1
- http://b.hatena.ne.jp/entry/http://labs.cybozu.co.... ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=50&thr... ×1
- http://search.live.com/results.aspx?q=imagefight&f... ×1
- http://b.hatena.ne.jp/hiro_y/favorite?of=80 ×1
- http://d.hatena.ne.jp/ockeghem/20070502/1178042280... ×1
- http://b.hatena.ne.jp/t/apache?sort=hot ×1
- http://b.hatena.ne.jp/entrylist?url=http://www.tok... ×1
- http://b.hatena.ne.jp/Kanatoko/ ×1
- http://b.hatena.ne.jp/t/xss ×1
- http://209.85.175.104/search?q=cache:sv9x_B88euYJ:... ×1
- http://b.hatena.ne.jp/keyword/XSS ×1
- http://d.hatena.ne.jp/teracc/20070715 ×1
- http://b.hatena.ne.jp/ockeghem/サニタイズ/ ×1
- http://r.hatena.ne.jp/NSR250R-SP/受信箱/ ×1
- http://r.hatena.ne.jp/Kur/ ×1
- http://b.hatena.ne.jp/t/サニタイズ ×1
- http://d.hatena.ne.jp/keyword/エンディアン ×1
検索
- mod_imagefight ×17 / サニタイジング文字 ×8 / キーワード不明 ×7 / javascript cookie XSS ×3 / サニタイズ言うな ×3 / 画像にJavascript ×3 / ウェブアプリケーションセキュリティ ×3 / ウェブアプリケーションセキュリティ 金床 ×3 / Oracle 暗黙の型変換 ×2 / エンディアン bm ビッグ ×2 / イメージファイト RFI ×2 / javascript サニタイズ ×2 / visible hidden 画像 ×2 / サニタイズ ×2 / ieee754 範囲 ×2 / apache mod_imagefight ×2 / img src jpeg xss ×2 / RFI XSS ×2 / 画像版 ×2 / IEEE754 ×1 / HTML 表示 サニタイズ ×1 / パレット領域 ×1 / png ヘッダ カラーパレット ×1 / Imagefight2 ×1 / 画像 XSS IE ×1 / 画像 xss サニタイズ ×1 / javascript イメージサイズ ×1 / PHP ウィルスチェック アップロード JPGファイル ×1 / IEEE754 エンディアン ×1 / Javascript 文字列 サニタイズ ×1 / mod_ImageFight ×1 / IE null文字 XSS ×1 / IEEE754 ×1 / 仮数部が全て1 ×1 / javascrip バイト数 ×1 / HTML タグ サニタイズ ×1 / javascript 画像 ×1 / イメージファイト PNG ×1 / php html サニタイズ ×1 / xss javascript ×1 / サニタイジング on ×1 / javascript パスワード サニタイズ 文字 ×1 / IEEE754 仮数部 ×1 / Javascript サニタイズ ×1 / oracle 文字 リテラル ×1 / SQL 型変換 ×1 / SQL文字 サニタイジング ×1 / 画像 カラーパレット javascript ×1 / サニタイジング 言うな ×1 / png jpeg htaccess ×1 / RFI攻撃 ×1 / Apache サニタイジング ×1 / 金床 ウェブ ×1 / カラーパレット bitmap ×1 / 画像 XSS ×1 / テスト画像 ×1 / BMP パレット 予約領域 ×1 / 画像 パレット領域 php ×1 / カラーパレットの前に ×1 / 画像ファイル サニタイズ ×1 / WAF セキュリティ ×1 / CSRF 徳丸 ×1 / img src xss ファイル アップロード ×1 / サニタイズ ヌル ×1 / tkprof 脆弱性 ×1 / xss イベントハンドラ ×1 / イベントハンドラ xss onload ×1 / KCCS WAF ×1 / サニタイズ javascript ×1 / イメージファイト ×1 / サニタイジング 方法 javascript ×1 / SQLインジェクション 対策 ×1 / javascript 画像 バイト数 src this onload ×1 / サニタイジング イベントハンドラ クロスサイトスクリプティング ×1 / Webアプリケーションセキュリティ ×1 / Guardian WAF ×1 / web 4バイト文字 検証 ×1 / JavaScript テスト ×1 / bmp カラーパレット 24 ×1 / bmp カラーパレット ×1 / 徳丸 セキュリティ ×1 / サニタイジング イメージ ×1 / PNG ヘッダーサイズ ×1 / SQLインジェクション Perl エスケープ ×1 / ieee754 ×1 / ビッグエンディアン デメリット ×1 / 2 53乗 整数 ×1 / SQL 文字列 数値に変換 ×1 / 4バイト境界 8ビット ビットマップ ×1 / ruby イメージ 横幅 ×1 / びん 画像 ×1 / sqlserver サニタイジング ×1 / Rubyでサニタイジング ×1 / bmp ヘッダ パレット ×1 / サニタイジング いうな ×1 / 画像 サニタイズ ×1 / IE ヌル文字 ×1 / sqlsever sql サニタイジング ×1 / サニタイズ 文字コード ×1 / サニタイズ 対策 Javascript ×1
| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |