XXE漏洞产生及利用
最后更新时间:
文章总字数:
预计阅读时间:
XXE漏洞产生及利用
知识点:XXE漏洞(XML External Entity Injection)全称为XML外部实体注入漏洞。
XML基本概念
首先,XML指的是一种可扩展标记语言,和HTML类似,但功能不同,XML用于结构化,存储以及传输信息,而HTML用于显示信息,如今XML大部分被JSON取代。
XML基本格式和语法
1 | <!--xml文件的声明,可选,必须放在文件开头,standalone=yes表示DTD仅用于验证文档结构,从而外部实体被禁用,也就是说不存在XXE漏洞,默认下是no--> |
基本语法:
- 所有 XML 元素都须有关闭标签。
- XML 标签对大小写敏感。
- XML 必须正确地嵌套。
- XML 文档必须有根元素。
- XML 的属性值须加引号。
DTD基本概念
XML 文档有自己的一个格式规范,这个格式规范是由一个叫做 DTD(document type definition) 的东西控制的。
DTD用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在另外一个单独的文件中(外部引用)。是XML文档中的几条语句,用来说明哪些元素/属性是合法的以及元素间应当怎样嵌套/结合,也用来将一些特殊字符和可复用代码段自定义为实体。
DTD就是我们XXE漏洞产生的关键,由于我们可以控制引入外部文件,导致任意文件读取漏洞。
DTD实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
一般实体的声明:<!ENTITY 实体名称 "实体内容">
引用一般实体的方法:&实体名称;
外部实体用于引入外部资源,有SYSTEM
和PUBLIC
两个关键字,表示实体来自本地计算机还是公共计算机。
1 |
|
php可以利用各种协议来引用外部实体,file,伪协议等等,各语言引用方式不同
XXE漏洞
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
读取任意文件payload
1 |
|
下面的标签根据题目传输时使用的标签来替换,system后面写协议,读取文件
有回显的可以直接看到,无回显则需要通过Blind XXE
方法加上外带数据通道来提取数据,先使用php://filter
协议获取目标文件的内容,然后将内容以http
请求发送到攻击服务器来读取数据。虽无法直接查看文件内容,但我们可以使用易受攻击的服务器作为代理,在外部网络上执行扫描以及代码。即,当无回显情况时,可以将数据发送到远程服务器(攻击服务器)。
也可以将协议改为ip地址,来探测内网端口<!ENTITY xxe SYSTEM “http://127.0.0.1:80" >]>是否开放,或者接上payload来攻击内网,结合ssrf攻击。
识别:发现题目使用xml传输数据即可尝试。
两种常见利用方式
通过两道例题来看这两种常见的XXE利用方式
Fake XML Book
这一题主要利用了任意文件读取,这道题打开就是一个简单的登录框,通过抓包可以看到这个登录是利用了xml协议来传输数据,直接使用任意文件读取的payload
1 |
|
成功读取到flag。
Ture XML Book
这一题主要利用了内网ip探测
和上一题一样,看到xml传输,先故技重施,结果报错,这种报错一般是因为没有该文件引起的,但是通过报错知道了文件路径,
使用文件路径尝试读取登录页面源码,没报错但是也啥都没读出来,那就换一个协议读,payload改为:
1 | <?xml version="1.0" encoding="UTF-8"?> |
成功读到源码,里面有admin的登录账号和密码,登录进去依然什么都没有发生,推测flag文件并不在本机上,尝试读取关键文件来探测端口,关键文件如/proc/net/arp,/proc/net/fib_trie等,经过尝试,10.244.80.187很有可能是存活的ip,但是直接访问依然报错。
1 | SYSTEM "http://10.244.80.187" |
尝试对最后一段,也就是187进行爆破,探测该网段下所有存活的ip,爆破的很慢,爆到143发现响应长度偏短,查看得到flag。