代码审计——XXE详解

简介: 代码审计——XXE详解

01 漏洞描述

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

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

image.png

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');
{
   
   mathJaxContainer[0]}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数据来源用户是否可控的情况。

<?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外部实体注入漏洞,漏洞验证如下:

image.png

image.png

05 修复方案

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

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

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

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

目录
相关文章
|
Java 数据安全/隐私保护 Spring
SpringSecurity 权限管理的实现
SpringSecurity是一个权限管理框架,核心是认证和授权,前面介绍过了认证的实现和源码分析,本文重点来介绍下权限管理这块的原理。
238 0
|
网络协议 Linux 网络安全
干货|不出网上线CS的各种姿势(二)
干货|不出网上线CS的各种姿势
788 0
|
资源调度 前端开发 测试技术
React Router 路由管理
【10月更文挑战第10天】本文介绍了 React Router,一个在 React 应用中管理路由的强大工具。内容涵盖基本概念、安装与使用方法、常见问题及解决方案,如路由嵌套、动态路由和路由守卫等,并提供代码示例。通过学习本文,开发者可以更高效地使用 React Router,提升应用的导航体验和安全性。
848 19
|
缓存 安全 前端开发
Cloudflare
【7月更文挑战第13天】Cloudflare
760 5
|
SQL 安全 关系型数据库
sql注入原理和sqlmap命令的基础命令以及使用手法
sql注入原理和sqlmap命令的基础命令以及使用手法
|
存储 弹性计算 负载均衡
网络安全技术及应用期末考试题库
网络安全技术及应用期末考试题库
1066 0
|
SQL 存储 安全
CTF--Web安全--SQL注入之报错注入
CTF--Web安全--SQL注入之报错注入
|
监控 Java API
Java的日志框架
Java的日志框架
180 2
|
Linux 网络安全 Apache
Redhat 9 搭建Apache服务
Apache HTTP Server,开源且广泛使用的Web服务器,以其高效、可靠和可扩展性著称。它有两种工作模式:prefork(多进程单线程)和worker(多进程多线程)。在Redhat 9.2系统上安装Apache,涉及安装httpd服务及相关依赖,配置文件位于`/etc/httpd/conf/httpd.conf`。安装后,需关闭防火墙和SELinux,重启服务并设置开机启动,确保80端口监听。最后,通过IP地址访问测试页面以验证配置成功。
476 0
Redhat 9 搭建Apache服务