好久没更新文章了 ,大家有没有想我阿
什么是XXE
XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击(那为啥不叫XEE)。对于 XXE 想要真正的了解它,就需要先来了解一下XML是什么。
XML(Extensible Markup Language)英文直译就是可扩展标记语言,“标记” 是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。
如果把 HTML 和 XML 进行对比的话, HTML 旨在显示数据信息,而 XML 旨在传输数据信息。(说到传输数据自然而然肯定会想到json格式,相比XML,现在用的更多是json格式来传输数据)
XML基本知识
<?xml version="1.0" encoding="utf-8"?>
<note>
<to>fenghua</to>
<from>njupt</from>xml
</note>
在上面代码中的第一行,定义XML的版本与编码。
在XML文档中,所有的元素都必须正确的嵌套,形成树形结构。并且整个XML文档中必须要有一个根元素。如上代码,<note>是整个文档的根元素。嵌套在note标签中的<to>
和<from>
则是根的子元素。
同时,所有的XML元素都必须有关闭标签,这点不像html语法那样松散。如果缺失关闭标签,则会导致XML解析失败。
实体
所有的XML文档都由五种简单的构建模块(元素,属性,实体,PCDATA CDATA)构成。这里着重介绍一下实体:实体是用于定义引用普通文本或特殊字符的快捷方式的变量,实体引用是对实体的引用。实体可在内部或外部进行声明。因此我们利用引入实体,构造恶意内容,从而达到攻击的目的。
实体总共有四种,分别是:
- 内置实体 (Built-in entities)
- 字符实体 (Character entities)
- 通用实体 (General entities)
- 参数实体 (Parameter entities)
其中内置实体和字符实体都和 HTML 的实体编码类似,但如果从另一个角度看,实体完全可以分成两个派别:通用实体和参数实体。
DTD
XML的语言规范是由DTD(Document Type Definition)来控制,类似编程语言的语法,它定义了XML文档的合法构建模块,即声明了XML的内容格式规范。
DTD 的声明方式分为两种:内部 DTD 和外部 DTD ,其区别就在于:对 XML 文档中的元素、属性和实体的 DTD 的声明是在 XML 文档内部引用还是引用外部的 dtd 文件。
内部引用
下面是一个内部DTD的XML示例:
<!--XML声明-->
<?xml version="1.0" encoding="UTF-8"?>
<!--DTD,文档类型声明-->
<!DOCTYPE note [ #定义此文档是note类型
<!ELEMENT note (body)> #定义note元素有一个元素:"body"
<!ELEMENT body (#PCDATA)> #定义body元素为"#PCDATA"类型
<!ENTITY writer "hello world"> #定义一个内部实体
]>
<!--文档元素-->
<note>
<body>&writer;</body>
</note>
上面第7行定义了一个内部实体,第11行中对上面定义的writer实体进行了引用,到时候输出的时候&writer就会被"hello world"替换。
<!DOCTYPE 根元素名称 PUBLIC “DTD标识名” “公用DTD的URI”>
这个在我们的攻击中也可以起到和 SYSTEM 一样的作用,但实际上实体远不止这一种,我们以上涉及的实体只是其中的一种,被称为通用实体。
参数实体
<!ENTITY % an-element "<!ELEMENT mytag (subtag)>">
<!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd">
%an-element; %remote-dtd;
在上面的代码示例中,可以看到实体名前多了一个 “%” ,在参数实体中使用 “% 实体名” (这里面的空格不能少) 定义,并且只能在 DTD 中使用 “% 实体名” 引用。
另外和通用实体一样,参数实体也可以外部引用,同时只有在 DTD 文件中,参数实体的声明才能引用其他实体。
XML注入
下面是一个普通的XML注入例子:
# 注入前XML代码
<?xml version="1.0" encoding="UTF-8">
<USER role="admin">用户输入位置</USER>
当用户输入一些恶意代码,比如User1</USER><USER role="admin">User2
,原XML代码就变成了下面的样子:
# 注入后XML代码
<?xml version="1.0" encoding="UTF-8">
<USER role="admin">User1</USER>
<USER role="admin">User2</USER
可以看到通过XML语句的前后拼接, XML代码被插入了进去。
对普通的 XML 注入,利用面比较狭窄,现实中也是比较鸡肋的存在,因此几乎用不到,如果有的话应该也是逻辑漏洞,下面就重点介绍XXE的利用。
大佬大佬,终于回来了