
上QQ阅读APP看书,第一时间看更新
2.1.4 XXE攻击定义及产生原理
XML外部实体(XML External Entity,XXE)攻击是由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。很多XML的解析器默认是含有XXE漏洞的,这意味着开发人员有责任确保这些程序不受此漏洞的影响。
XXE攻击产生原理:
XML元素以形如<tag>foo</tag>的标签开始和结束,如果元素内部出现如<的特殊字符,解析就会失败,为了避免这种情况,XML用实体引用替换特殊字符。XML预定义了五个实体引用,即用<>&'"替换< >&'"。
实际上,实体引用可以起到类似宏定义和文件包含的效果,为了方便,我们会希望自定义实体引用,这个操作在称为文档类型定义(DTD)的过程中进行。DTD是XML文档中的几条语句,用来说明哪些元素/属性是合法的,以及元素间应当怎样嵌套/结合,也用来将一些特殊字符和可复用代码段自定义为实体。DTD成为XXE攻击的突破口。
DTD有两种形式:

可以在元素声明中自定义实体,与DTD类似也分为内部实体和外部实体,此外还有普通实体和参数实体之分:

直接通过DTD外部实体声明。XML外部实体攻击样例1如下:

通过DTD外部实体声明引入外部实体声明。XML外部实体攻击读取任意文件。样例2如下:

继续扩展:构造本地XML接口,先包含本地XML文件,查看返回结果,正常返回后再换为服务器接口。
1.任意文件读取
payload(攻击载荷)如下:


2.探测内网地址
payload如下:
