XXE XML外部实体注入

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>Toveto>  
  <from>Janifrom>  
  <heading>Reminderheading>  
note>

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

1. 内部实体引用

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


DOCTYPE note [   
  <!ENTITY myEntity 'This is my entity'>
]>  
<note>&myEntity;note>  

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

2. 外部实体引用

DOCTYPE note [
    
]>
<note>&file;note>
3. 外部引用

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

Note.dtd 文件:

DOCTYPE note [  
  <!ENTITY myEntity 'This is my entity'>  
]>

xml 文件:


DOCTYPE note SYSTEM "Note.dtd">  
<note>&myEntity;note>  

三, XXE 实验

编写一个接受xml数据的api: http://192.168.112.200/security/xxe.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; // 输出解析后的内容
}
?>

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

1. 读取服务器的敏感文件 /etc/passwd 文件的内容.

DOCTYPE note [
    
]>
<note>&file;note>
2. 探测服务器内网的ip和端口.

DOCTYPE note [
    
]>
<note>&file;note>

你可能感兴趣的:(渗透测试,渗透测试,安全,XXE)