Hatena::ブログ(Diary)

hoshikuzu | star_dust の書斎 このページをアンテナに追加 RSSフィード Twitter

hoshikuzu|star_dustの日記について

書く内容の方針とかはフラフラしているのです。あまり考えていないかも知れません。面白いなぁと思うこと、大事なことだなぁと思うことを書いています。あんまり悲しいことは書かない主義。

 | 

2009-06-10 記号禁止一歩手前でJavaScriptを書いてみよう

XSSフィルターの評価について XSSフィルターの評価についてを含むブックマーク XSSフィルターの評価についてのブックマークコメント

たとえば以下のように、script要素の中に第三者の記述(=$userdata)が埋め込まれるとします。


<script type="text/javascript" >
$userdata
</script>

防衛観点からみれば、こんなことが可能なようでは、まず駄目というのが定説です。まぁそれでもなんらかのフィルターがあればまだましだろう、という考え方もあろうかと思います。私はそのような隙のある考え方にはおおいに問題があるとかねてより考えております。ですから、強力なフィルターを脳内で考えてはそれを打破してみる、といった遊びを時々行うわけです。変なフィルターに頼ることだけでは駄目である、という事実を知りたいのですね。

記号だけでJavaScriptを実行する 記号だけでJavaScriptを実行するを含むブックマーク 記号だけでJavaScriptを実行するのブックマークコメント

記号だけでJavaScriptを実行するというid:hasegawayosukeさんの最近の素晴らしいアイデアにはほとほと感服しました。文字列を拾ってブラックリストにのっていればこれを拒否するタイプのフィルターは無意味であると高らかに宣言しているからです。

遊びでやってみよう::記号禁止一歩手前でJavaScriptを書く 遊びでやってみよう::記号禁止一歩手前でJavaScriptを書くを含むブックマーク 遊びでやってみよう::記号禁止一歩手前でJavaScriptを書くのブックマークコメント

以下の断片が含まれるHTMLを吐き出すウェブアプリがあったとします。


<script type="text/javascript" >
$userdata
</script>

において、$userdataには以下のフィルターがかかっています。text/htmlでcharsetがiso-8859-1の世界で考えてください。

  • 数字オッケー
  • 英小文字オッケー
  • 英大文字オッケー
  • スペースオッケー
  • 改行オッケー
  • 等号(=)オッケー
  • 上記以外は全部改行に変換される
  • SGMLやiso-8859-1に不適合なら改行に変換される。たとえば[0x00]など

等号以外の記号は全部禁止です。かなり安全に見えますが、実は、以下のようなことが可能です。

document.URL(もしくはdocument.cookie)を読み出して悪意あるサイトにその内容を送りつける。

実際に、Firefoxの最新版で今朝、確認しました。ver 1.5.0.8のバージョンでも確認しました。(※)

コードは今回記しませんが、皆さんちょっと考えてみませんか?

注※昨夜、記号としてドット(.)も必要でしたが今朝方それを不要であると気がついたのです。ユーレカ!

詰めXSS 詰めXSSを含むブックマーク 詰めXSSのブックマークコメント

以上、hasegawayosukeさんにインスパイアされて詰めXSSを作ってみました。もうひとつ別ねたもありますので、現在磨いております。連続するアルファベットは全部禁止というネタです。禁止する記号としては「=」「"」「'」「+」「-」「.(=ドット)」などでして、要するに文字列結合系を楽しむという…(笑

hasegawayosukehasegawayosuke 2009/06/11 12:36 生成された$userdata の部分には [a-zA-Z0-9 =\n] の39種類しか存在しないという認識であってますか?

hoshikuzuhoshikuzu 2009/06/12 12:33 スペースもつけてください…って、9とイコールのあいだにあるこれですか…
それでいいと思います。

hoshikuzuhoshikuzu 2009/06/12 12:40 ん?39種類?アルファベットって何文字でしたっけ?26文字。小文字と大文字とで倍にカウントして小計52文字。それにイコールとスペースと改行と。総合計55文字。(汗
すれ違いの理由はなんだろう55-39=16? なんか、26に字面が似ていますね。英文字を倍カウントしなかった上に繰り上がりを一回間違えて10の誤差?

hasegawayosukehasegawayosuke 2009/06/12 13:06 わー。数字も使えるので10の誤差はなしってことで。

hoshikuzuhoshikuzu 2009/06/12 14:44 わー(笑
訂正しようとおもったら先に真相が明らかに!!
これでわかったこと。hasegawayosukeさんは英大文字を使うつもりがまったくかったこと、想定される私の頭の中の解には数字がはいっていそうにないこと。【謎】

 | 
最近のコメント