https://www.freebuf.com/video/209186.html
这个是那个pvs的网站,要学习一下curl命令,然后就可以当作一个vps来用了
https://beeceptor.com/console/qwert
xml是一种可扩展标记语言,和html类似,
主要区别是 HTML 主要和 数据表示相关。而xml 更多与数据传输和存储有关。
xml可以用在这些地方,等等
我们现在看一个简单的xml例子:
version是规范版本的,有些可以有,有些没有。
这个例子的根元素
Root element
是Person,符合规则的XML文档必须有且只有一个根元素
这些符号<>"'
不能够出现,xml分不清,这些是我们输入的内容,还是标签
那么我们怎么来传输这些符号呢??。
这就要用到我们的实体了ENTITY
。实体,是一种简单的存储单元。
就好像XML的变量一样。
你可以将它们赋值,然后再XML文档的不同地方对它进行引用,
实体(Entity) 再XML文档中的文档类型定义部分(DTD)被单独定义描述。
我们通过一个简单实例,来了解实体(Entity) 的工作机制
这个是我们之前的一个XML文档,
这里通过DTD 的方式 创建了一个ENTITY实例,name。
实际上也是告知XML解析器,这是一个DTD定义类型。,
其中,我们定义了一个存贮单元,这个简单的ENTITY的名字就是name
为了避免对标签反复赋值 ,我们直接把它定义到了名字 name 的ENTITY中去了
ENTITY大体分为三种:分别是一般实体,参数实体,预定义实体。
1.一般实体:
上述的那个就是一般实体,
这个实体通常会在其他的地方引用。
参数实体有点特殊,它必须定义在单独的DTD区域中, 并且这种参数实体相对灵活。
这个特点,在我们进行外部实体注入(XXE)的过程中非常有用。
3.预定义实体:
然后我们看看预定义实体:
它是由一些 特殊符号 组成的一组 预定义数值集,比如"
之类的 ,这些符号通常会破坏正常的XML文档格式。
比如,我们在XML中用
<
小于号当作数值使用时,xml解析器就会报错
比如这里,我们想用小于号,可以这样,
用
<
来表示 小于号<
.。它是十六进制形式的小于号引用表示。<
的html编码之后就是<
。可以在burp中的decoder中看,
实体ENTITY相当于变量,可以存储数值以备后续的使用。但是XML的实体ENTITY的应用不仅仅是存储
还可以访问本地文件,
还可以从远程网络中调用相关的数据,作为后续的实体进行引用,
然后我们看一个例子:
我们定义了一个名字为subscirbe的实体,它会在后续的pwn中调用。
这里比之前一般实体多了一个关键词:: SYSTEM.。
SYSTEM的作用就是 让XML解析器知道 ,这个实体,是一个外部实体,需要XML解析器去解析,获取其中的内部资源,然后把它存储到内部实体中去。
这里需要注意的是,如果这个文件中的内容,是某种标签和XML语法很类似的字符,那么XML解析器就会报错,让你知道XML解析失败了。
这是一种预期行为,
当有SYSTEM的时候,就会解析文件中的内容,而不是文件名,
还支持一些协议。
接下来,我们讲一下盲注。
Out-of-band
我们访问,外部的dtd文件
有反应,!这就意味着,受害端有效解析了我们构造的XML,并且,正在尝试 我们再 attacker.com上的资源 ,作为实体进行引用。
这样我们就能够以服务端的身份发起请求了,也就是SSRF
从服务器读取本地文件是可以的。
那么这种读显方式能否用于 Blind XXE攻击的文件内容提取呢?
这里先看看DTD。
它以DOCTYPE打头,并且DTD并不是 XML 数据的一部分。他总是在根元素之上声明
这也就说明了: DTD像实体一样可以从外部加载
这里也可是一个URI,然后解析器将从这个外部的DTD中提取 并 解析内容。
这种方法能够使XML文档有一个很好的结构,将 文档定义部分DTD 和 数据部分 分开。
如果我们可以加载外部DTD文件,那么理所当然,你就可以理解另一个概念:
:在DTD内部调用参数实体
这里有一个内部的DTD定义,
我们在其中定义了参数实体,它的定义又是通过 另一个实体进行定义。
参数实体只能够在同一个 DTD 中调用,
让我们从XML解析器的角度来分析一下啊。
这个%,是参数实体的标志,调用这个参数实体,
然后最终的解析方法这个,
这样,我们就能够调用这个实体了。
下面是我们的 盲注xxe的payload。
经过XML解析之后,就是这个样子,
这样,我们就带着文件的内容去访问url了,我们在url的日志中就能够看到。
但是这样不行,
XML文档中规定,在DTD内部子集中的参数实体调用 不能够混杂到标记语言中。
也就是说,(在内联DTD中)我们不能够在 标记语言中 调用参数实体。
但是,在同级别中可以当作标记语言来调用,
那么为了解决这个问题,我们需要bypass一下,
上面说了不能够再内部的DTD中的标记语句中调用参数实体,
这就说我们就要用到外部DTD了
这个send实体,就是在外部的dtd文件中,但是外部的DTD中,我们就不仅能够使用参数实体,还能够在 标记语句中 调用参数实体
passwd先获取到文件的内容,然后wrapper的实体定义中用到了参数实体passwd。
然后调用wrapper,最后解析如下:
然后拼接到url上,定义到了实体send上,我们就能够得到我们想要的东西了,
这时候,他不会有任何相应,但我们已经将内容获取到了,
我们这里获取一下/etc/fstab
按理说不会啊,我们知识换了一下文件名称而已,
我们看一下这个文件的内容。
PCDATA, 语法如下:两侧的是闭合标签