从JDK源码来看XXE的触发原理和对应的防御策略
这几天继续在重写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。 (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |