零基础学黑客,搜索公众号:白帽子左一
什么是xxe
XML External Entity Injection 外部实体注入,该漏洞发生在应用程序解析XML输入时,
没有禁止外部实体的加载,导致可加载任意外部文件,造成文件读取、命令执行(有点极端)、内网端口扫描、攻击内网网站、发起dos攻击等危害。
什么是xml
一种标记语言,被设计用来传输和存储数据(html是用来显示数据):
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>john</name>
</person>
第一行是xml文档的说明,在很多时候可以不写,其中是根元素标签,
这里注意,xml不像html一样标签都是固定的,这里可以根据需求自己定义(区分大小写),
name是子元素标签,注意标签是成对存在
所以也就造成了在xml文档中不能存在< > " '等容易影响xml解析器解析的内容。
为了解决这种状况,引入实体的概念。
实体是用于定义引用普通文本或特殊字符的快捷方式的变量,其不仅能用来存储指定数值,还可以从本地文件或者远程文件中调用相关数据作为后续实体引用
实体就类似与变量,不仅可以对其赋值,也能在文档的各个地方进行引用,实体在xml文档中的DTD部分被定义,如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE perion [
<!ENTITY name "gouzi"> // 定义个实体 name 值为gozi
] >
<person>
<name>&name;</name> //<name>gouzi</name>
</person>
DTD的作用是定义该xml文档包含哪些模块,这些模块包含了哪些内容:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
由于其中的实体部分可以加载外部实体等操作,所以在可以控制xml的地方就容易造成xxe漏洞。
实体分为三种:
1.一般实体
<!ENTITY name "gouzi">
……
<name>&name;</name>
在 DTD 中被定义,在xml 引用,调用方式为 &实体名;
2.参数实体
<!ENTITY % data "<!ENTITY % name 'gouzi'>">
%data