前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初始XXE

初始XXE

作者头像
vFREE
发布2022-08-08 15:35:55
2900
发布2022-08-08 15:35:55
举报
文章被收录于专栏:博客原创文章博客原创文章

1.什么是XXE?

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

1.2 危害

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

2.认识XML

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

3.认识DTD

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

4.第一个XML文档

代码语言:javascript
复制
<!--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之类的关键字

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.什么是XXE?
    • 1.2 危害
    • 2.认识XML
    • 3.认识DTD
    • 4.第一个XML文档
    • 5.内部dtd和外部dtd
      • 1.1 数据类型
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档