前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XXE的原理利用方式及修复

XXE的原理利用方式及修复

作者头像
黑白天安全
发布2020-03-08 13:54:48
1.9K0
发布2020-03-08 13:54:48
举报

注:本文仅供参考学习

XXE定义: XXE,"xml external entity injection",即"xml外部实体注入漏洞" 攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题。

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

先来了解一下XML和DTD

代码语言:javascript
复制
DTD的基本概念:document type definition 文档类型定义
XML的基本概率:可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言
DTD文件一般和XML文件配合使用,主要是为了约束XML文件。
XML文件引入DTD文件,这样XML可以自定义标签,但又受到DTD文件的约束。

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

代码语言:javascript
复制
1.  <!ELEMENT 班级 (学生+)>  
2.  <!ELEMENT 学生 (名字,年龄,介绍)>    
3.  <!ELEMENT 名字 (#PCDATA)>    
4.  <!ELEMENT 年龄 (#PCDATA)>    
5.  <!ELEMENT 介绍 (#PCDATA)>

第一行表示根元素为班级,并且有学生这个子元素,子元素为1或者多个。 第二行表示学生的子元素为名字,年龄,介绍 名字下面没有子元素了,那么#PCDATA表示名字里面可以放任意文本。 年龄和介绍也是类似。 编写myClass.xml文件并引入DTD文件如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<!--引入dtd文件,约束这个xml-->
<!DOCTYPE 班级 SYSTEM "myClass.dtd">
<班级\>
  <学生\>
    <名字\>周小星</名字\>
    <年龄\>23</年龄\>
    <介绍\>学习刻苦</介绍\>
</学生\>
  <学生\>
   <名字\>林晓</名字\>
   <年龄\>25</年龄\>
   <介绍\>是一个好学生</介绍\>
  </学生\>
</班级\>

system表示当前的DTD文件是本地的 public表示引入的DTD文件是来自于网络的 外部实体就是DTD没有约束的部分,就是指用户输入的数据,因为没做过滤所以就产生了这个漏洞

实战 这是个xml的api接口 我们先正常查询一下

代码语言:javascript
复制
<?xml version = "1.0"?>  
<!DOCTYPE note [
<!ENTITY xxe "wulaoban">
]>  
<name>&xxe;</name>

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

代码语言:javascript
复制
<?xml version = "1.0"?>  
<!DOCTYPE note [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>  
<name>&xxe;</name>

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

实战二 看到一个登陆界面 随便输账号密码抓包

发现了类似xml的东西 尝试构造xml文件读取/etc/passwd文件

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

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

代码语言:javascript
复制
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的基本学习先告一段落了!继续加油^^

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑白天实验室 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档