XXE漏洞学习
类似前言一样的废话
在周日刚结束的红帽杯比赛中,很遗憾的是,一道web题,都没有做出来,总结一下就是,突发性的神智不清导致很多原本应该有思路做出来的题目都是打开就放弃。例如这次的XXE,提示都到脸上了就是没想到,那么为了开始准备下一次的比赛,现在开始慢慢的会写一些类似的学习笔记(当然因为懒,有的并不会写),就当是整理一下,记忆一下
正文
那么为了方便实验,首先搭建一个xxe漏洞的环境,直接上github找就好了
github地址:https://github.com/c0ny1/xxe-lab
下载完之后,直接将文件夹部署到php环境中就好了
开启抓包工具 burpsuite
,抓取一下数据看结构
看到类似这样的包结构,都可以尝试用xxe漏洞,当然不同编程语言写的页面,解析出来的结果也不一样,这里针对PHP环境
那么接下来就是构造语句的问题了
这里就得提一下DTD这个东西了
DTD又称为 DOCTYPE声明
、 DocumentTypeDefinition文档类型定义
,它的作用是用于定义一些我们自己定义的标记的含义
举个例子, <eee></eee>
这个标签,我们可以定义它为某一个类型分别为
名称 |
PCDATA |
CDATA |
---|---|---|
介绍 |
PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。 |
CDATA 的意思是字符数据(character data)。CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开 |
它两者作用都相同,但是区别在于 PCDATA
和 CDATA
的针对特殊字符上的处理
在XML中,<>&这些是不合法的,例如
<elapse>you age > 18</elapse>
这其中的 >
会导致报错,而如果将 <elapse>
设置为 PCDATA
类型,那么他就会将这个标签中的内容转义成合法的字符串<
实体如下
实体引用 |
字符 |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
而CDATA会将它内容中的所有<>当成正常字符来处理,但是不会用于XML解析器
例如
在一个环境中确实需要用到<而不是<,例如在编写sql查询语句,这是就可以使用CDATA类型,这时候xml解析器理都不带理一下这其中的所有内容,不会拿去解析
那么回到主题上,DTD的作用基本就是这些,去定义元素的类型
那么为啥要解释这个DTD呢,因为DTD可以去定义元素类型,反之,也可以利用它去定义实体,接着调用它,导致XXE漏洞,也就是实体注入漏洞
DTD中有一个写法
DTD 实例:
<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">
XML example:
<author>&writer;©right;</author>
这是调用外部实例的写法,但是稍微改动一下
改动:
<!ENTITY writer SYSTEM "file:///etc/passwd">
XML example:
<author>&writer;</author>
那么这个时候,通过 file://
这个协议,他就会去读取本机上 /etc/passwd
这个文件内容,接着输出出来
除了 file://
外,还有其他的协议
libxml2 |
PHP |
Java |
.NET |
---|---|---|---|
file |
file |
http |
file |
http |
http |
https |
http |
ftp |
ftp |
ftp |
https |
php |
file |
ftp |
|
compress.zlib |
jar |
||
compress.bzip2 |
netdoc |
||
data |
mailto |
||
glob |
gopher * |
||
phar |
当然你也可以通过 except://
来执行命令,只是多半情况下PHP都不会有这个插件(反正我挺少遇到能直接执行的)
- 49. 访问PostgreSQL数据库增删改查 | 厚土Go学习笔记
- Golang中Interface类型详解
- Go语言的网络编程简介
- 一条关于swap争用的报警邮件分析(二)(r8笔记第4天)
- Golang泛型编程初体验
- 厚土Go学习笔记 | 14. switch 的条件写的有点灵活,不过风格还是go的一贯风格
- Go语言·我的性能我做主
- 47. 访问MySql数据库实现增删改查 | 厚土Go学习笔记
- system表空间不足的问题分析(二) (r8笔记第5天)
- golang基于redis lua封装的优先级去重队列
- python基础知识——内置数据结构(元组)
- python基础知识——控制语句
- python基础知识——基本语法
- 11g主库归档自动删除的小问题分析 (r8笔记第1天)
- 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 数组属性和方法
- BERT源码分析(PART III)
- springboot之整合基本的jdbc并操作Mysql数据库
- springboot缓存之自定义CacheManager
- springboot缓存之使用redis作为缓存管理
- 【python-leetcode904-滑动窗口法】水果成篮
- 【python-leetcode03-滑动窗口法】无重复字符的最大子串
- 编程语言中的值数据类型和引用数据类型之间的区别
- c++之结构体
- c++结构体实例之按结构体中指定变量进行排序
- springboot消息之整合rabbitmq
- springboot消息之@RabbitListener和@EnableRabbit
- c++实例之通讯录管理系统之显示菜单和退出功能(一)
- c++实例之通讯录管理系统之添加联系人功能(二)
- c++实例之通讯录管理系统之显示联系人功能(三)
- c++实例之通讯录管理系统之删除联系人功能(四)