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都不会有这个插件(反正我挺少遇到能直接执行的)
- 微信终于做了它最擅长的业务,市场已经轰动
- Bootstrap Metronic 学习记录(二)菜单栏
- WCF技术剖析之十一:异步操作在WCF中的应用(上篇)
- Bootstrap Metronic 学习记录(一)简介
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(49)-工作流设计-我的申请
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(47)-工作流设计-补充
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(46)-工作流设计-设计分支
- 瑞典研发未来概念车,车厢、底盘能分离,颠覆汽车使用方式
- WCF技术剖析之十一:异步操作在WCF中的应用(下篇)
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(45)-工作流设计-设计步骤
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(44)-工作流设计-设计表单
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(43)-工作流设计-字段分类设计
- 因为这个原因,你的工作即将被取代!
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(73)-微信公众平台开发-消息管理
- 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 数组属性和方法
- 清华大佬教你用一篇文章完全学会Git,GitHub,Git Server
- 《闲扯Redis九》Redis五种数据类型之Set型
- 【每日一题】28. Implement strStr()
- 小程序组件开发 -- 疫情动态
- 超干货!为了让你彻底弄懂MySQL事务日志,我通宵肝出了这份图解!
- Tomcat 的使用及原理分析(IDEA版)
- 面试了个30岁的程序员,让我莫名其妙的开始慌了
- GitLab CI + Docker 持续集成操作手册
- centos7 如何安装与使用 Anaconda
- Launcher 启动 activity 流程
- 【每日一题】29. Divide Two Integers
- Ubuntu19.1 中 GitLab 的安装配置与卸载
- Linux 中的存储结构与磁盘划分
- Linux 中用户与权限管理
- Netty入门教程——认识Netty