第12章 XML外部エンティティ XML外部エンティティ
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
XML External Entity (XXE) は、実行するのは非常に単純であることが多いが、壊滅的な結果をもたらす攻撃の分類である。この攻撃の分類は、アプリケーションのコード内で不適切に設定された XML パーサーに依存する。
一般的に言って、ほとんど全ての XXE 攻撃の脆弱性は、XML(または XML に似た)ペイロードを受け入れる API エンドポイントの結果として発見される。XMLを受け入れるHTTPエンドポイントは珍しいと思うかもしれないが、XMLライクな形式にはSVG、HTML/DOM、PDF(XFDF)、RTFなどがある。これらのXMLライクな形式は、XML仕様と多くの共通点があり、その結果、多くのXMLパーサーもこれらを入力として受け付ける。
XXE攻撃の背後にあるマジックは、XML仕様が外部ファイルをインポートするための特殊な注釈を含んでいることである。この特別なディレクティブは external entity と呼ばれ、XML ファイルが評価されるマシンで解釈される。つまり、特殊な細工を施した XML ペイロードをサーバの XML パーサーに送信すると、そのサーバのファイル構造内のファイルを危険にさらすことになる。XXEは、他のユーザのファイルを侵害したり、/etc/shadowのようなUnixベースのサーバが正しく機能するために必要な重要な資格情報を格納するファイルにアクセスするためによく使用される。
ゼクシオの基礎
すべてのXXE攻撃の核心は、XML仕様と、その弱点である エンティティの扱いである。XMLエンティティとは、XMLファイルやXML仕様の中で別のデータを参照するために使用される文字のセットである。おそらく、& や< のようなXMLエンティティを見たことがあるだろう。これらは、アンパサンド(&)や小なり(<)という文字を参照する。これらは常に同じASCII文字を参照するため、 定義済み実体として知られている。
XML文書内で参照できるエンティティの中で、より危険な形式は カスタムエンティティである。これらの実体は、現在のXML文書外のデータを含め、プログラマが定義した広範囲のデータを参照することができる。
カスタム・エンティティの中で最も危険なのは、もちろん外部エンティティ参照である。XML文書型定義(DTD)内で外部エンティティを参照することで、外部ファイルを解析前のXMLファイルに取り込むことができる。次の例を考えてみよう:
<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd">]>
この例のエンティティは、Linuxシステムのユーザ・アカウントに関する機密情報を含むファイルetc/passwdを参照している。XXE攻撃は、このような外部参照を利用して、機密情報を漏えいさせたり、意図したアプリケーションの機能を変更したり、時にはリモートでコードを実行させたりする。
ダイレクトXXE
direct XXEでは、外部エンティティ・フラグを持つXMLオブジェクトがサーバに送信される。その後、XMLオブジェクトは解析され、外部エンティ ティを含む結果が返される(図 12-1を参照)。
図12-1. ディレクトリXXE
mega-bank.comには ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access