当前位置:   article > 正文

php xxe注入,XXE的原理利用方式及修复

php xxe

注:本文仅供参考学习

XXE定义:

XXE,"xml external entity injection",即"xml外部实体注入漏洞"

攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题。

XXE原理:

服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害

先来了解一下XML和DTD

DTD的基本概念:document type definition 文档类型定义

XML的基本概率:可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言

DTD文件一般和XML文件配合使用,主要是为了约束XML文件。

XML文件引入DTD文件,这样XML可以自定义标签,但又受到DTD文件的约束。

格式示例:

我们还以班级为例,编写如下DTD文件,myClass.dtd:

1.

2.

3.

4.

5.

第一行表示根元素为班级,并且有学生这个子元素,子元素为1或者多个。

第二行表示学生的子元素为名字,年龄,介绍

名字下面没有子元素了,那么#PCDATA表示名字里面可以放任意文本。

年龄和介绍也是类似。

编写myClass.xml文件并引入DTD文件如下:

周小星名字\>

23年龄\>

学习刻苦介绍\>

学生\>

林晓名字\>

25年龄\>

是一个好学生介绍\>

学生\>

班级\>

system表示当前的DTD文件是本地的

public表示引入的DTD文件是来自于网络的

外部实体就是DTD没有约束的部分,就是指用户输入的数据,因为没做过滤所以就产生了这个漏洞

实战

这是个xml的api接口

我们先正常查询一下

]>

&xxe;

fbc1115faffef5b9d453df10505a6e77.png

读取成功

接下来我们尝试构造读取/etc/passwd下的文件

]>

&xxe;

8d19296fbaa8573a180eac451a8cdc52.png

成功读取,可以去读取其他一些文件或者做一些内网的端口探测等等操作

实战二

看到一个登陆界面

随便输账号密码抓包

0cf9b265a6fa7d740bbec845721c1111.png

4b851a46d73d604cf09e0ade01628094.png

发现了类似xml的东西

尝试构造xml文件读取/etc/passwd文件

fb8fd8a25cd55e4311765828f1593926.png

读取成功

值得注意的是,在PHP里面解析xml用的是libxml,其在 ≥2.9.0 的版本中,默认是禁止解析xml外部实体内容的。所以就不存在xxe漏洞

xxe修复

方案:使用开发语言提供的禁用外部实体的方法

1.PHP:

libxml\_disable\_entity\_loader(true);//设置为true时禁止解析xml外部实体

2.JAVA:

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();

dbf.setExpandEntityReferences(false);

3.Python:

from lxml import etree

xmlData=etree.parse(xmlSource,etree.XMLParser(resolve\_entities=False))

关于XXE的基本学习先告一段落了!继续加油^^

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/612736
推荐阅读
相关标签
  

闽ICP备14008679号