什么是RCE漏洞?RCE漏洞也叫命令执行或者远程命令执行漏洞,可让攻击者直接向后台服务器写入系统命令,从而执行系统命令后通过系统命令获得系统权限盗取敏感信息
出现此类漏洞通常由于应用系统从设计上须要给用户提供指定的远程命令操做的接口。通常会给用户提供一个ping操做的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。而若是设计者在完成该功能时,没有作严格的安全控制,则可能会致使攻击者经过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
java命令执行函数
Runtime.exec()
RuntimeJava中的类是一个高级类,它存在于每个Java应用程序中。通过它,应用程序本身可以与其所在的环境进行通信。
通过该getRuntime()方法提取与我们的应用程序关联的运行时,我们可以使用该exec()方法直接执行命令或运行.bat/.sh文件。
ProcessBuilder 执⾏命令
通过Java执行系统命令,与cmd中或者终端上一样执行shell命令,
最典型的用法就是使用Runtime.getRuntime().exec(command)或者new ProcessBuilder(cmdArray).start()。
从JDK1.5开始,官方提供并推荐使用ProcessBuilder类进行shell命令操作
SpEL 表达式
Spring 表达式语言(Spring Expression Language,SpEL)是 Spring Framework 的核心技术之一,其支持在运行时查询和操作对象图。SpEL 语法类似于 Unified Expression Language,但提供了更加丰富的功能,最特别的是方法调用与字符串模板功能。SpEL 主要支持以下功能:
• 文字表达式
• 布尔和关系运算符
• 正则表达式
• 类表达式
• 访问 properties, arrays, lists, maps
• 方法调用
• 关系运算符
• 参数
• 调用构造函数
• Bean 引用
• 构造 Array
• 内嵌 lists
• 内嵌 maps
• 三元运算符
• 变量
• 用户定义的函数
• 集合投影
• 集合筛选
• 模板表达式
SpEL 功能强大,可以操作类和方法。
• 引用方法:dog.run()
• 引用静态方法:T(java.lang.Math).PI
• 类实例化:使用 new 实例化对象,类名必须是全限定名,java.lang 包内的除外如 Integer、String 等
• 变量定义及赋值引用
在解析 SpEL 之后,获取表达式结果时,可以指定表达式的上下文对象:EvaluationContext
• (默认)StandardEvaluationContext:支持全套 SpEL 语言和功能配置选项,功能强大但存在隐患
java sec code靶场 Runtime.exec()命令执行
@RestController
@RequestMapping("/rce")
public class Rce {
@GetMapping("/runtime/exec")
//@GetMapping 获取包含的路径才能执行下期
//也就是获得这个路径/runtime/exec
//@RequestMapping注解表示这个控制器处理的所有HTTP请求都是以“/runtime/exec”为前缀的。@GetMapping注解指定了一个处理HTTP GET请求的方法
public String CommandExec(String cmd)
//获得cmd 参数
{
Runtime run = Runtime.getRuntime();
StringBuilder sb = new StringBuilder();
try {
Process p = run.exec(cmd);
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
String tmpStr;
//定义new 了数据流的给方法
while ((tmpStr = inBr.readLine()) != null) {
sb.append(tmpStr);
//使用了while循环将数据流给读写出来
}
if (p.waitFor() != 0) {
if (p.exitValue() == 1)
return "Command exec failed!!";
}
inBr.close();
in.close();
} catch (Exception e) {
return e.toString();
}
return sb.toString();
}
命令执行
总结
一、这里首先是了解了 java 命令执行函数,也知道了命令执行的危害,并且通过java sec code靶场 成功执行了命令并获得了 root 权限
二、是如果要对 java 代码进行审计,那么就需要懂一些java代码的一些基础知识,并且是框架相关的知识,如:在代码审计的时候怎么并且路径?怎么传输方法 ?@RequestMapping 该方法就是Spring Boot中的接收GET传参的方法
三、合计总结:@RequestMapping 第一个就是必须有 /rce 然后就是 必须有/runtime/exec 然后就是接收GET方法 那么路径就是这样
/rce/runtime/exec?cmd=
那么就得到了 上面的路径并且成功命令执行
如果还不知道前面的路径的就需要一步步的拼接路径出来即可
原文始发于微信公众号(漏洞404):java-命令执行(RCE)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论