加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 服务器 > 安全 > 正文

从JDK源码来看XXE的触发原理和对应的防御策略

发布时间:2023-09-22 10:58:51 所属栏目:安全 来源:
导读:这几天继续在重写GadgetInspector工具,进一步的增强该自动化工具的source点和sink点,同时增强过程中的漏报和误报的问题。这里主要是对其中有关于XXE中的两点sink进行几点分析。sinksDocumentBuilder类这个JDK中内置

这几天继续在重写GadgetInspector工具,进一步的增强该自动化工具的source点和sink点,同时增强过程中的漏报和误报的问题。

这里主要是对其中有关于XXE中的两点sink进行几点分析。

sinks

DocumentBuilder类

这个JDK中内置的类是一种的DOM型的解释器,该种Parser的特点是将完整的xml文档内容加载到树结构中去,然后我们通过遍历结点来获取我们需要的内容。

首先编写一段实例代码,来使用DocumentBuilder类来读取xml文档的内容。

Employee.xml

<employees>

<employee id="111">

<firstName>Rakesh</firstName>

<lastName>Mishra</lastName>

<location>Bangalore</location>

</employee>

<employee id="112">

<firstName>John</firstName>

<lastName>Davis</lastName>

<location>Chennai</location>

</employee>

<employee id="113">

<firstName>Rajesh</firstName>

<lastName>Sharma</lastName>

<location>Pune</location>

</employee>

</employees>

DOMParserDemo.java。

public class DOMParserDemo {

public static void main(String[] args) throws Exception{

// 获取DOM Builder Factory

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

// 获取DOM Builder

DocumentBuilder builder = factory.newDocumentBuilder();

// 加载xml文档

Document document = builder.parse("Employee.xml");

// 建立一个链表存放Employee对象

List<Employee> employeeList = new ArrayList<>();

// 提取数据

NodeList nodeList = document.getDocumentElement().getChildNodes();

// 迭代进行读取xml文档

for (int i = 0; i < nodeList.getLength(); i++) {

// 获取对应结点,这里的结点是employee标签

Node node = nodeList.item(i);

if (node instanceof Element) {

// 创建一个Employee空对象

Employee employee = new Employee();

// 获取xml文档中的id值

employee.id = node.getAttributes().getNamedItem("id").getNodeValue();

// 获取子结点信息

NodeList childNodes = node.getChildNodes();

for (int j = 0; j < childNodes.getLength(); j++) {

// 获取对应结点

Node node1 = childNodes.item(j);

if (node1 instanceof Element) {

// 获取对应的信息

String content = node1.getTextContent().trim();

switch (node1.getNodeName()) {

case "firstName":

employee.firstName = content;

break;

case "lastName":

employee.lastName = content;

break;

case "location":

employee.location = content;

break;

}

}

}

// 将获取的每一个对象添加进入列表中去

employeeList.add(employee);

}

}

// 打印数据

for (Employee employee : employeeList) {

System.out.println(employee);

}

}

}

这种方式就是遍历xml文档中的一个一个的文档来进行对应信息的读取。

这里只是一个简单的使用该种解释器进行xml文档的读取。

我们主要是进行XXE的展示。

XXE.xml

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

<!DOCTYPE test [

<!ENTITY xxe SYSTEM "http://127.0.0.1:9999">

]>

<doc>&xxe;</doc>

主要的漏洞点是在调用DocumentBuilder#parse方法进行xml文档的加载的时候,如果加载的是上面给出的xml内容,将会导致XXE。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章