まだ重たいCMSをお使いですか?
毎秒1000リクエスト を捌く超高速CMS「adiary

2006/08/23(水)CSSXSS

CSSの中でjavascript実行しちゃったりする問題

CSSXSSというのがあるんですが、もちろんIE専用。要するに「罠サイトからスタイルシートに見せかけることで好きなサイトのデータを(クライアントに)取得させ、それをJavaScriptで処理することで罠サイト側に情報漏洩出来る」セキュリティホールです。さすがIEやることが違う!

というわけなんですが、CSSXSSさせない(加害者にならない)対策は取れても、CSSXSSされない(被害者にならない)対策は取りようがない。漏洩したことろでセッションは盗めないのですが(でも機密とかダダ漏れ)、CSSXSS+CSRFされるともはや手の打ちようがない。

世の中のIE使ってる人、危険極まりないですよこれは(汗

2006/05/29(月)POSTしたものを保存させると……

Content-Type技、色々

データをブラウザで開くのではなく、直接ファイルに保存させたい場合は、

Content-Type: application/xxx-data

という風にしておけば、大抵は未登録のコンテントタイプなので保存指示ウィンドウが出るようになります。

しかし、POST時にこの方法を用いてファイルを保存させようとすると、ファイル名選択ダイアログが出てきません(Firefoxにて確認)。各種blogツールにおいて、エクスポート時のメソッドがなぜGETなのか今まで疑問だったのですが、ようやく謎が解けました。

教訓:POSTメソッド発行時にファイルに保存させようとしてはいけない

おまけ

cgiのファイルなどを実行させずに、そのままのファイル名でブラウザで表示させたい場合は

AddType text/plain .cgi
RemoveHandler .cgi

というふうにします(Apache2用)。http://adiary.abk.nu/tools/tdiary2adiary.cgiで使ってる技です。

追記。mod_perlの影響か、RemoveHandler がうまく働かなくなってましたので、次のようにしました。

AddType text/plain .cgi
AddHandler default-handler .cgi

Content-Typeを変更せずにファイルとして保存させる

cgiの場合、もっとスマートにファイルとして保存させる方法を発見しました。

Content-Disposition: attachment; filename=export_file_name.txt
Content-Type: text/plain; charset=(文字コード);

とすれば良いようです。

2006/05/25(木)タグの認識を正規表現で

一昔前の掲示板などで利用出来るタグを制限できるものがありますが、それと同等のモジュール(自作)をadiaryでは使用しています。属性値を認めると途端にタグの解析が難しくなります。

#!/usr/local/bin/perl
use strict;

my $inp = join('', <>);
while($inp =~ /(<\w([^>"']|[=\s\n]".*?"|[=\s\n]'.*?')*?>)/s) {
	$inp = $';
	print "$1\n";
}

だいたいこれでタグを認識できますが、IE/Firefox/Operaなどで色々確認した結果、壊れた(不正な形式の)htmlタグの解釈は統一されておらず、結局、その辺の仕様まで完全にサポートすることは非常に難しく、そこをつつけば、この手のタグ制限ルーチンの解析を避けて、ブラウザに対し不正なタグを認識させる(XSSする)ことが可能なようです。

2006/04/21(金)multipart/form-data

日記への画像添付に向けて、multipart/form-data の解析ルーチンでも作ろうかと思って調べ始めてみると……

  1. とりあえずネットで仕様書を検索。RFC1876, RFC2388だということは分かるが……見ても分かりにくいぞ、これは。
  2. 仕方ないので perl で書かれたサンプル(アップローダ)でも探してみると、CGI.pm を使用したものばかり見つかる。
  3. しょうがないので、ENCTYPE="multipart/form-data" なフォームで POST してデータを全部ファイルにはき出してみる。実に分かりやすい。
  4. 結局 boundary を認識しつつ読み出す必要があるので、perl 的にデリミタを書き換えてと思ったものの、例えば 100MB とか大きなファイルを受け取るとき、それだけメモリを食うこととなる。 → 常識的にはNG
  5. なんかいい方法ないかなぁーと再びネット内のcgiスクリプトを検索。…………見るんじゃなかった(笑)

どうしてネットに転がってる cgi (with perl) スクリプトってのは、有名どころ含め、汚いのばかりかなぁ(苦笑)*1

*1 : もっとも2年ぐらい前までヒトのこと言えないソースばかりですが(汗)

multipart/form-dataの例

というわけで例をアップしておきます。参考にどうぞ。アップロードしたファイルは、C++のソースです。

続きを読む