首页 > 其他分享 >代码审计——XXE详解

代码审计——XXE详解

时间:2023-06-25 18:02:07浏览次数:39  
标签:审计 XML 实体 漏洞 详解 XXE 服务器 解析


01 漏洞描述

XXE(XML External Entity Injection)是一种针对XML终端实施的入侵,漏洞产生的根本原因就是在XML1.0标准中引入了“entity”这个概念,且“entity”可以在预定义的文档中进行调用,XXE漏洞的利用就是通过实体的标识符访问本地或者远程内容。

黑客想要实施这种入侵,需要在XML的payload包含外部实体声明,且服务器本身允许实体扩展。这样的话,黑客或许能读取WEB服务器的文件系统,通过UNC路径访问远程文件系统,或者通过HTTP/HTTPS连接到任意主机。

代码审计——XXE详解_XML

02 审计要点

XXE漏洞发生的根本原因是"用户可控的"、”服务器允许的实体拓展”被服务器解析。

因此,XXE代码审计的重点落脚于以下两点:

1、参数是否用户可控,用户是否可以控制输入的XML内容,服务端是否对用户输入的内容进行校验?

2、XML解析是否禁止了外部实体的解析?用户定义的外部实体声明是否会被服务器解析?

03 漏洞特征

XXE漏洞发生于XML解析的过程,若解析过程中没有限制doctype、entity等节点实体的解析,就会产生XML外部实体解析漏洞。

Java

InputStream xml=request.getInputStream();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource is = new InputSource(xml); 	
Document doc = builder.parse(is);
Element element = doc.getDocumentElement();
NodeList nodes = element.getChildNodes();
out.print("<br/>Result:<br/>");
out.print("---------------------<br/>");
for (int i = 0; i < nodes.getLength(); i++) {
	out.print(nodes.item(i).getNodeName()+" : " + 	
	nodes.item(i).getFirstChild().getNodeValue().toString());
    out.print("<br/>");
}

PHP

<?php
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data);
echo $xml->name;
?>

客户端构造以下payload即可实现XML外部实体的注入:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>

04 漏洞案例

在代码中搜索“xml”或“DocumentBuilder”等字符,搜索出所有的与XML解析操作相关的代码,查看是否存在未设置禁止XML外部实体解析的情况,以及XML数据来源用户是否可控的情况。

代码审计——XXE详解_服务器_02

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>

当服务器后端对于XML解析的过程为以上逻辑时,存在XXE外部实体注入漏洞,漏洞验证如下:

代码审计——XXE详解_xml_03

代码审计——XXE详解_服务器_04

05 修复方案

1、严格检查用户输入的字符。

2、检查使用的底层XML解析库,使用JAVA语言提供的禁用外部实体的方法:DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false)。

3、操作XML时对格式字符进行转义处理。

4、升级到较新的解析jar包,如Apache poi、xlsx-streamer.jar、poi-ooxml等第三方jar包。

标签:审计,XML,实体,漏洞,详解,XXE,服务器,解析
From: https://blog.51cto.com/u_16170213/6547605

相关文章

  • 代码审计——XSS详解
    01漏洞描述跨站脚本入侵(CrossSiteScript)是一种将恶意JavaScript代码插入到其他Web用户页面里执行以达到入侵目的的漏洞。入侵者利用应用程序的动态展示数据功能,在html页面里嵌入恶意代码。当用户浏览该页之时,这些嵌入在html中的恶意代码会被执行,用户浏览器被入侵者控制,从而达到......
  • 代码审计——硬编码口令/弱口令详解
    01漏洞描述根据网站所使用的第三方组件,寻找特定的弱口令或默认口令进行登录。或在代码层面寻找写死的账号口令,尝试进行登录。02审计要点对前端源代码以及系统后台代码进行全文关键字检索,如key、pass、pwd、password,查看是否存在明文显示的账号密码。03漏洞案例源码中某前端js......
  • 关于Java中ArrayList类的toArray方法详解
    先上源码:publicObject[]toArray(){returnArrays.copyOf(elementData,size);}可以看到ArrayList类的toArray()方法调用了Arrays.copyOf(elementData,size)(其中的elementData是ArrayList类中用来存储对象的数组,size是数组大小),接下来进入其内部:publicsta......
  • Crontab 命令详解
    一. Crontab介绍      crontab命令的功能是在一定的时间间隔调度一些命令的执行。1.1/etc/crontab文件      在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。      如:[root@dave~]#cat/etc/cro......
  • IPv4地址详解
    ip地址格式:<网络号,主机号>IPv4地址分类:A类:网络号8位,高位0B类:网络号16位,高位10C类:网络号24位,高位110D类:多播地址,高位1110E类:保留使用,高位1111特殊地址:主机号全0:表示网络本身0.0.0.0:表示本网络上的本主机主机号全1:表示本网络的广播地址255.255.255.255:表示整个网络的......
  • Linux usb 4. Device 详解【转】
    转自:https://blog.csdn.net/pwl999/article/details/120997525文章目录1.简介2.PlatformLayer2.1PlatformDevice2.2PlatformDriver3.UDC/GadgetLayer3.1GadgetBus3.2GadgetDevice3.2.1EndpointAlloc3.2.2EndPointAccess3.2.3UDCControl3.3GadgetDriver(Con......
  • Linux mem 2.8 Kfence 详解【转】
    转自:https://pwl999.blog.csdn.net/article/details/1244949581.原理介绍Kfence(KernelElectricFence)是Linux内核引入的一种低开销的内存错误检测机制,因为是低开销的所以它可以在运行的生产环境中开启,同样由于是低开销所以它的功能相比较KASAN会偏弱。Kfence的基本原......
  • 09-操作符详解
    @目录一.算数操作符二.移位操作符三.位操作符四.赋值操作符五.单目操作符一.算数操作符1.算数操作符分类:+-*/%除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是......
  • spring-boot-maven-plugin插件详解
    一、为什么SpringBoot项目自带这个插件当我们在SpringBoot官方下载一个脚手架时,会发现pom.xml会自带spring-boot-maven-plugin插件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2......
  • 详解 HTTPS 概念
    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。HTTPS简介HTTPS其实是有两部分组成:HTTPSSL/TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传......