[ 代码审计篇 ] 代码审计案例详解(二) XXE代码审计案例

我不是女神ヾ 2024-04-29 02:28 167阅读 0赞

? 博主介绍

?? 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~
✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】
?点赞➕评论➕收藏 == 养成习惯(一键三连)?
?欢迎关注?一起学习?一起讨论⭐️一起进步?文末有彩蛋
?作者水平有限,欢迎各位大佬指点,相互学习进步!

文章目录

  • ? 博主介绍
  • 一、什么是 XXE 漏洞?
    • 1、XXE 简介
    • 2、XML结构介绍
      • 1.第一部分:声明
      • 2.第二部分:DTD(文档类型定义)
      • 3.第三部分:文档的元素
  • 二、案例讲解
    • 1、环境搭建
      • 1.准备 vulns.war 包
      • 2.启动 tomcat
      • 3.查看环境目录
      • 4.访问环境
    • 2、工具扫描
    • 3、漏洞复现
      • 1.获取文件
      • 2.解释payload
    • 4、漏洞修复
      • 1.XXE怎么防御的?
      • 2.禁用外部实体进行防御
      • 3.修复成功
  • 四、相关资源

一、什么是 XXE 漏洞?

1、XXE 简介

XXE(XML External Entity)是指xml外部实体攻击漏洞。XML外部实体攻击是针对解析XML输入的应用程 序的一种攻击。当包含对外部实体的引用的XML输入被弱配置XML解析器处理时,就会发生这种攻击。 这种攻击通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

2、XML结构介绍

要了解XXE漏洞,那么一定要先学习一下有关XML的基础知识。
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

1.第一部分:声明

主要会定义一些版本,编码之类的东西。

2.第二部分:DTD(文档类型定义)

也就是他的文档类型定义,形成漏洞部分。
可以定义很多的实体内容,实体内容会对后面整个XML的文档去做一个对应的约束。

DTD格式如下:

  1. 第一个是内部声明
  2. <!DOCTVYPE 根元素 [元素声明]>
  3. 第二个是外部实体(我们这次漏洞用的)
  4. <!DOCTVYPE 根元素名称 SYSTEM "外部DTD的URI"
  5. 第三个是public类型的
  6. <!DOCTVYPE 根元素名称 PUBLIC "DTD标识名" "公用DTD的URI">

3.第三部分:文档的元素

也就是他的正文,在这个里面会通过一下标签去定义一些key和value属性跟值,这样的一些东西。

二、案例讲解

1、环境搭建

1.准备 vulns.war 包

下载连接在文末给出
把 vulns.war 包放入tomcat webapps 目录下

在这里插入图片描述

2.启动 tomcat

下载连接在文末给出
进入 tomcat bin 目录,管理员身份运行 startup.bat 文件启动 tomcat 。
Tomcat 启动默认会将 webapps 目录下所有的 war 包解析一遍。

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

3.查看环境目录

回到我们 webapps 目录下,发现多了一个 vulns 目录。这就是 tomcat 解析 war 包生成的。

在这里插入图片描述

4.访问环境

  1. http://localhost:8080/vulns/

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

2、工具扫描

使用 fortify 扫描,发现源代码中存在一个XXE漏洞

在这里插入图片描述

3、漏洞复现

1.获取文件

  1. http://localhost:8080/vulns/007-xxe.jsp?data=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22ISO-8859-1%22%3F%3E%3C%21DOCTYPE%20foo%20%5B%20%20%20%3C%21ELEMENT%20foo%20ANY%20%3E%20%20%3C%21ENTITY%20xxe%20SYSTEM%20%22file%3A%2F%2F%2Fc%3A%2Fwindows%2Fwin.ini%22%20%3E%5D%3E%3Cfoo%3E%26xxe%3B%3C%2Ffoo%3E

在这里插入图片描述

2.解释payload

我们解码一下payload
在这里插入图片描述

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <!DOCTYPE foo [
  3. <!ELEMENT foo ANY >
  4. <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>
  5. <foo>&xxe;</foo>

此处将本地计算机中 file:///c:/windows/win.ini 文件的内容取出,赋值给了实体 xxe
然后实体 xxe 的值作为元素 foo 中的字符串数据被解析的时候取出,作为对象里的内容然后再输出该对象的时候被打印出来。

4、漏洞修复

1.XXE怎么防御的?

  1. 1.禁用外部实体
  2. 2.过滤用户提交的XML数据
  3. 过滤关键词:!ENTITY,或者SYSTEMPUBLI
  4. 3.使用第三方应用代码及时升级

2.禁用外部实体进行防御

我们就直接禁用外部实体来演示一下防御,使用开发语言提供的禁用外部实体的方法

  1. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  2. dbf.setExpandEntityReferences(false);

我们打开环境源代码

在这里插入图片描述

在如下位置添加一行

  1. docFactory.setExpandEntityReferences(false);

保存

在这里插入图片描述

3.修复成功

打开漏洞环境,在验证XXE是不是存在。

  1. http://localhost:8080/vulns/007-xxe.jsp?data=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22ISO-8859-1%22%3F%3E%3C%21DOCTYPE%20foo%20%5B%20%20%20%3C%21ELEMENT%20foo%20ANY%20%3E%20%20%3C%21ENTITY%20xxe%20SYSTEM%20%22file%3A%2F%2F%2Fc%3A%2Fwindows%2Fwin.ini%22%20%3E%5D%3E%3Cfoo%3E%26xxe%3B%3C%2Ffoo%3E

发现漏洞已经不存在了,我们刚刚的修复是有效的。

在这里插入图片描述

四、相关资源

1、vulns.war包下载链接
2、Tomcat下载链接
3、[ 代码审计篇 ] Fortify 安装及使用详解(一)
4、[ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例

发表评论

表情:
评论列表 (有 0 条评论,167人围观)

还没有评论,来说两句吧...

相关阅读

    相关 codeql 代码审计

    刚刚把环境搭建好了。。。搭建环境永远是最讨厌的一步 如果你只是想看看codeql运行起来有什么效果 ,怎么运行,大概怎么使用。那么我建议你打开这个公共课程 [CodeQL