XXEインジェクションの例をググると、次のような結果が得られます。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
攻撃がDTD内から実行される場所-文書の最上部。
その代わりに、DTDではなくXML文書の本文内からXML外部エンティティを挿入することは可能ですか。
編集:例として、データベースからユーザー提供のデータを使用してXMLドキュメントを生成するシステムがあります。システムはCDATAを使用してこれらの値をエスケープしますが、それ以外には何もしません。そのため、(悪意のある)ユーザーは簡単にデータを保存してCDATAセクションを閉じ、XMLを書き込むことができます。 XMLが正しく、XSD検証に合格している限り、システムは満足のいくシステムです。
編集: xs:import(または同様のもの)を使用できますか?
XMLパーサーが準拠していれば、大丈夫です。 XML 1.1仕様 、
文書型宣言は、文書の最初の要素の前に出現する必要があります。
ただし、XMLパーサーがこの制限の適用に失敗することは前例のないことではありません。最初の要素の後に<!DOCTYPE
タグが付いたXMLドキュメントは整形式ではありませんが、一部のパーサーによるものと同様に扱われ、不正な形式のHTMLがブラウザで許容されることが多いのと同じ方法で処理されます。
さらに、攻撃者はXMLドキュメント全体を閉じて、新しいドキュメントを開始する可能性があります。新しいものにはまだ要素がないため、Doctypeを正しい場所に配置できます。それから問題は、あなたのパーサーが1つしか期待していなかったときに、2つの(整形式の)ドキュメントをどうするかです。