web狗之xml实体攻击浅学
我们先来了解一下xml
<?xml version="1.0" encoding="utf-8"?>
<note>
<to>chybeta</to>
<from>ph0en1x</from>
</note>
在上面代码中的第一行,定义XML的版本与编码。
在XML文档中,所有的元素都必须正确的嵌套,形成树形结构。并且整个XML文档中必须要有一个根元素。如上代码,<note>是整个文档的根元素。嵌套在note标签中的<to>和<from>则是根的子元素。
同时,所有的XML元素都必须有关闭标签,这点不像html语法那样松散。如果缺失关闭标签,则会导致XML解析失败。
我们再了解一下实体:
所有的XML文档都由五种简单的构建模块(元素,属性,实体,PCDATA CDATA)构成。这里着重介绍一下实体:实体是用于定义引用普通文本或特殊字符的快捷方式的变量,实体引用是对实体的引用。实体可在内部或外部进行声明。因此我们利用引入实体,构造恶意内容,从而达到攻击的目的。
实体类型:
XML实体分为四种:字符实体,命名实体,外部实体,参数实体。
文档类型定义:DTD
简单的说,DTD的作用是定义XML文档的合法构建模块。如前所述,实体也是构建模块之一。因此可以利用DTD来内部或外部引入实体。
其基本格式:
<!DOCTYPE 根元素名 [ 元素描述 ]>
内部引入
格式:
将DTD和XML放在同一份文档中,利用DTD定义的实体即为内部实体。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY chybeta "Hello World!">
]>
<xxe>
&chybeta;
</xxe>
访问该XML文档,&chybeta;会被解析为Hello World!并输出。
外部引入
基本格式:
<!ENTITY 实体名称 SYSTEM "URI">
通过引用定义在外部的DTD中的实体,我们称之为外部实体。
之后呢,我们通过jarvis上的一道web题来尝试一下:
http://web.jarvisoj.com:9882/
我们先进行一下抓包
之后呢我们发现第一个红箭头的位置,使用的是json方式传入
我们改为xml,之后编写代码进行传入
go后我们得到flag
小白,还请多多关照