【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带

目录:

  • 1. 基本知识
  • 2.XML的安全性问题
      • 当文件内容和 xml 格式相冲突的时候,
      • 其他利用

https://www.freebuf.com/video/209186.html
这个是那个pvs的网站,要学习一下curl命令,然后就可以当作一个vps来用了
https://beeceptor.com/console/qwert

1. 基本知识

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第1张图片xml是一种可扩展标记语言,和html类似,
主要区别是 HTML 主要和 数据表示相关。而xml 更多与数据传输和存储有关。

xml可以用在这些地方,等等

在这里插入图片描述

我们现在看一个简单的xml例子:
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第2张图片
version是规范版本的,有些可以有,有些没有。

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第3张图片这个例子的根元素Root element 是Person,符合规则的XML文档必须有且只有一个根元素

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第4张图片这些叫做子元素Children

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第5张图片
这些符号<>"'不能够出现,xml分不清,这些是我们输入的内容,还是标签

那么我们怎么来传输这些符号呢??。

这就要用到我们的实体了ENTITY。实体,是一种简单的存储单元。
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第6张图片

就好像XML的变量一样。
你可以将它们赋值,然后再XML文档的不同地方对它进行引用,

实体(Entity) 再XML文档中的文档类型定义部分(DTD)被单独定义描述。

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第7张图片

我们通过一个简单实例,来了解实体(Entity) 的工作机制

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第8张图片

这个是我们之前的一个XML文档,

这里通过DTD 的方式 创建了一个ENTITY实例,name。
实际上也是告知XML解析器,这是一个DTD定义类型。,
其中,我们定义了一个存贮单元,这个简单的ENTITY的名字就是name
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第9张图片

为了避免对标签反复赋值 ,我们直接把它定义到了名字 name 的ENTITY中去了

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第10张图片
这在XML文档 对该值得多处调用过程中,,会节省很多时间

ENTITY大体分为三种:分别是一般实体参数实体预定义实体

1.一般实体:
上述的那个就是一般实体,

在这里插入图片描述

这个实体通常会在其他的地方引用。

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第11张图片2.参数实体:

参数实体有点特殊,它必须定义在单独的DTD区域中, 并且这种参数实体相对灵活。

比如:用一个ENTITY给另一个ENTITY进行赋值
在这里插入图片描述

这个特点,在我们进行外部实体注入(XXE)的过程中非常有用。

3.预定义实体:
然后我们看看预定义实体:

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第12张图片

它是由一些 特殊符号 组成的一组 预定义数值集,比如"&#之类的 ,这些符号通常会破坏正常的XML文档格式。

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第13张图片比如,我们在XML中用<小于号当作数值使用时,xml解析器就会报错

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第14张图片
所以,为了避免这种情况,我们使用预定义实体

比如这里,我们想用小于号,可以这样,
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第15张图片<来表示 小于号<.。它是十六进制形式的小于号引用表示。<的html编码之后就是<。可以在burp中的decoder中看,

2.XML的安全性问题

实体ENTITY相当于变量,可以存储数值以备后续的使用。但是XML的实体ENTITY的应用不仅仅是存储

还可以访问本地文件
还可以从远程网络中调用相关的数据,作为后续的实体进行引用,
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第16张图片然后我们看一个例子:
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第17张图片

我们定义了一个名字为subscirbe的实体,它会在后续的pwn中调用。

这里比之前一般实体多了一个关键词:: SYSTEM.。
SYSTEM的作用就是 让XML解析器知道 ,这个实体,是一个外部实体,需要XML解析器去解析,获取其中的内部资源,然后把它存储到内部实体中去。
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第18张图片
这里需要注意的是,如果这个文件中的内容,是某种标签和XML语法很类似的字符,那么XML解析器就会报错,让你知道XML解析失败了。
这是一种预期行为,

当有SYSTEM的时候,就会解析文件中的内容,而不是文件名,

还支持一些协议。

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第19张图片

接下来,我们讲一下盲注。
Out-of-band

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第20张图片
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第21张图片
我们访问,外部的dtd文件
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第22张图片有反应,!这就意味着,受害端有效解析了我们构造的XML,并且,正在尝试 我们再 attacker.com上的资源 ,作为实体进行引用。

这样我们就能够以服务端的身份发起请求了,也就是SSRF

从服务器读取本地文件是可以的。
那么这种读显方式能否用于 Blind XXE攻击的文件内容提取呢?

这里先看看DTD。

它以DOCTYPE打头,并且DTD并不是 XML 数据的一部分。他总是在根元素之上声明
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第23张图片
这也就说明了: DTD像实体一样可以从外部加载

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第24张图片
这里也可是一个URI,然后解析器将从这个外部的DTD中提取 并 解析内容。
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第25张图片
这种方法能够使XML文档有一个很好的结构,将 文档定义部分DTD 和 数据部分 分开。

如果我们可以加载外部DTD文件,那么理所当然,你就可以理解另一个概念:
:在DTD内部调用参数实体

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第26张图片

这里有一个内部的DTD定义,

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第27张图片
我们在其中定义了参数实体,它的定义又是通过 另一个实体进行定义。

参数实体只能够在同一个 DTD 中调用,
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第28张图片
让我们从XML解析器的角度来分析一下啊。
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第29张图片
这个%,是参数实体的标志,调用这个参数实体,

然后最终的解析方法这个,

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第30张图片

这样,我们就能够调用这个实体了。

下面是我们的 盲注xxe的payload。

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第31张图片经过XML解析之后,就是这个样子,
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第32张图片这样,我们就带着文件的内容去访问url了,我们在url的日志中就能够看到。
但是这样不行,

在这里插入图片描述

XML文档中规定,在DTD内部子集中的参数实体调用 不能够混杂到标记语言中。
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第33张图片

也就是说,(在内联DTD中)我们不能够在 标记语言中 调用参数实体

但是,在同级别中可以当作标记语言来调用,

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第34张图片

那么为了解决这个问题,我们需要bypass一下,
上面说了不能够再内部的DTD中的标记语句中调用参数实体,

但是XML规范还声明了一点:外部实体不受此限制,
在这里插入图片描述

这就说我们就要用到外部DTD了

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第35张图片
这个send实体,就是在外部的dtd文件中,但是外部的DTD中,我们就不仅能够使用参数实体,还能够在 标记语句中 调用参数实体

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第36张图片
passwd先获取到文件的内容,然后wrapper的实体定义中用到了参数实体passwd。
然后调用wrapper,最后解析如下:
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第37张图片
然后拼接到url上,定义到了实体send上,我们就能够得到我们想要的东西了,

这时候,他不会有任何相应,但我们已经将内容获取到了,

当文件内容和 xml 格式相冲突的时候,

我们这里获取一下/etc/fstab

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第38张图片但是失败了,,

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第39张图片

按理说不会啊,我们知识换了一下文件名称而已,
我们看一下这个文件的内容。
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第40张图片

xml在解析的时候会报错,
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第41张图片

PCDATA, 语法如下:两侧的是闭合标签

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第42张图片
用到外部实体来进行闭合

【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第43张图片【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第44张图片

其他利用

API
SVG
【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带_第45张图片

你可能感兴趣的:(【xxe主看这个1】学习xxe稍微进阶的知识 ---- OOB xxe盲注,外带)