初始XXE

vFREE
2022-01-28 / 0 评论 / 26 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年01月28日,已超过240天没有更新,若内容或图片失效,请留言反馈。

1.什么是XXE?

xxe即"XML外部实体注入漏洞",顾名思义,是由于XML允许引入外部实体导致的漏洞,当程序没有禁止或者对外部实体做验证,攻击者构造特殊的xml语句传到服务器,服务器在传输给XML解释器,xml解释器根据外部实体进行处理后返回对应的内容给服务器,服务器再返回给用户

1.2 危害

  • 任意文件读取(最常见)
  • 命令执行(需要except模块支持)
  • DOS攻击
  • 端口扫描

2.认识XML

XML即可扩展标记语言,是一种类似于HTML具有标签且可以使电子文件具有结构性的一种语言,xml支持合法的自定义标签,用户可随意定义标签,常用于传输数据和存储数据

3.认识DTD

DTD即文档类型定义,用于规范一个XML文档的数据类型或者文档的结构,在内部定义或者外部定义

4.第一个XML文档

<!--xml标记头-->
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--内部的dtd-->
<!DOCTYPE info [
    <!ELEMENT info (user,age)>
    <!ELEMENT user (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
]>
<!--xml文档内容-->
<info>
<user>vFREE</user>
<age>19</age>
</info>

上面的内部dtd头中的内容,ELEMENT是固定的关键字

info(user,age)规定了,在info中,有user和age两个自定义的标签,且顺序要先是user,再写age

user (#PCDATA)意思就是user标签中的内容是可以被解析的,下同
info就是根元素,可以理解成html的\<body>标签

![图片占位-1]()

5.内部dtd和外部dtd

1.1 数据类型

开始之前,先了解一波dtd中可以定义的数据类型

  • 空字符用 "EMPTY"
例子:\<!ELEMENT 元素名 EMPTY>

> - 可以被解析的数据 "PCDATA" > >> 例子:\ >>
<元素名>(中间这一部分也是可以被解析的) >>
> - 标记内容不被解析,仅仅只是作为字符 "CDATA" >
> 以 "\"结尾 > >> 例子:\vFREE\ ]]> >>
> - 包含所有可解析的类型 "ANY" > >> 例子:\ >>
> 带有子元素的字符序列 "\" > >> 例子:\ >>
> 必须出现一次或者多次的元素 "+" > >> 例子:\ >>
> 出现零次或者多次的元素 "*" > >> 例子: >>
> 必须出现零次或者一次 "?" > >> 例子:\ >> ## 1.2 内部dtd > 内部dtd就是在XML文档中定义的dtd,用关键字DOCTYPE标记 ```xml ]> <根元素> xxxxxx ``` > 大概例子就是上面那样,使用关键字ELEMENTl来声明元素,例子如下 ![图片占位-1](https://pic.imgdb.cn/item/61f38a6b2ab3f51d91ca39b9.png) ## 1.2 外部dtd ### 1.2.1 SYSTEM关键字 > SYSTME关键字适用于引用系统文件夹下的dtd文件 ```xml ``` ### 1.2.2 PUBLIC关键字 > PUBLIC适用于引用外部服务器上的公共dtd文件 ```xml ``` # 6.实体 > 实体是用于定义普通文本为一个变量,用ENTITY关键字定义,实体引用则就是调用变量 > 引用实体用 " &实体名称; " ```xml ]> &name;&age; ``` ## 6.1 内部实体 ```xml 语法: 例子: &name; ``` ## 6.2 外部实体 > 外部实体使用SYSTEM关键字进行引用 ```xml ]> &user; ``` ## 6.3 实体小结 > 注意了,引用外部的dtd和引用外部的实体是不一样的,即使SYSTEM关键字一样,且无论是引用外部实体还是内部的dtd,都是要通过DOCTYPE关键字进行定义,定义实体使用ENTITY关键字,定义数据类型/类别用ELEMENT关键字 # 7.危害 - 文件读取 - 命令执行 - DOS攻击 - 内网端口探测 - ... ... ## 7.1 文件读取 - file协议 - php伪协议 ### 7.1.1 file协议 > 文件读取在XXE利用中是最常见的,通过加载外部实体构造恶意的payload传到xml解析器让其执行获取内容,从而造成了文件读取 > 其原理也是因为允许外部实体的加载,导致可以加载本地的文件 ```xml ]> &passwd; ``` > 通过构造上述的payload,如果服务器存在xxe漏洞,并且还会输出处理后的结果的话,就会输出/etc/passwd文件中的内容 ![图片占位-2](https://pic.imgdb.cn/item/61f38a6b2ab3f51d91ca39c7.png) > 参考例题:http://ctf.vfree.ltd/ 中WEB题目**xxelab1** ### 7.1.2 PHP伪协议 > 上面的file多数用于读取普通文件,如果需要读取的文件是php呢?用file协议肯定不行的,因为用file协议读取相当于调取,被调取的php文件会被执行,但是不会输出php文件的内容,包括jsp,asp等语言也是不能直接用file协议读取,这里的话,需要用到php伪协议 ```php php://fileter/read=convert.base64-encode/resource=xxx.php ``` ```xml ]> &flag; ``` > 用file协议读取php文件 ![图片占位-3](https://pic.imgdb.cn/item/61f38a6b2ab3f51d91ca39c7.png) > 很明显,根据响应内容并没有读取到内容 > 用php伪协议读取php文件 ![图片占位-4](https://pic.imgdb.cn/item/61f38a6b2ab3f51d91ca39a0.png) > 将文件以base64的形式读取出来,成功读取 ### 7.1.3 XXE盲注 > XXE盲注是指不会在我们传入恶意xml数据到服务器,xml解释器处理完后,不会输出我们想要的内容,此时需要通过数据外带的方式,通过在自己的服务器上开启一个监听端口,然后通过外部dtd文件访问服务器端口带上读取到的内容,这样子就可以监听到了 > 盲注需要用到参数实体,这里要用到%,用法差不多,多了一个%,其他的不变 ```xml ``` #### 7.1.3.1 所需文件配置 > xml文件 ```xml %flag; ]> ``` > flag.dtd文件 ```xml "> %url; %url2; ``` > 这里没有环境可以练习,暂时先这样子,以后有环境再补图,嘻嘻~ ## 7.2 命令执行 > 命令执行的利用条件可能比较苛刻,需要支持expect协议 ```xml ]> &flag; ``` > 和引用外部实体的方法一样,不同的是,SYSTEM后面的内容是expect协议 ![图片占位-5](https://pic.imgdb.cn/item/61f38a6b2ab3f51d91ca39b0.png) ## 7.3 DOS攻击 > DOS攻击的原理就是通过不断引用调用自己定义的实体,从而导致xml解析器不断循环解析同一个外部实体,造成高并发 ```xml ]> &dos6; ``` > 大概和上面的差不多道理,通过定义dos1,然后定义dos2调用dos1,定义dos3调用dos2,然后dos2又调用dos,如此循环下去,过多的话,xml解释器就会占用过高的内存去处理 # 8.防御 > - 解铃还须寄铃人,既然漏洞本身是因为允许解析外部实体而导致的漏洞,所以第一想到的防御方法就是禁用解析外部实体 ```php libxml_disable_entity_loader(true); //php代码中使其成为true即可 ``` > - 过滤SYSTEM,ENTITY之类的关键字
> 文中只介绍了xxe的冰山一角和基础的利用方式,更多的利用方式还在冰山底下,要后面可能还会更新,欢迎大家关注丫~ ```php $ vFREE博客 = "http://www.vfree.ltd/" $ catf1ag CTF训练平台 = "http://ctf.vfree.ltd/"
0

评论 (0)

取消