java代码学习(一)——java命令执行的方式


Java命令执行的方式

在最开始的时候,还不懂java代码就去复现了fastjson的反序列化漏洞,发现真的是晦涩难懂。好在后面学了java基础、web开发和框架的相关内容,才能读懂部分。所以建议初学者还是要一步步学习,从最开始的java基础代码,包括JDBC、多线程、IO、泛型、java反射机制等等。

然后就可以去读一些开源cms的源码,老一些的源码,不建议直接去读若依、铭飞这些cms。复现的话可以去复现,只需要到gitee或者github上面去查找版本更新的代码,就可以看出漏洞是怎么产生和修复的。

最后再去读一些经典漏洞的复现文章,一步步调试,查找代码的功能,才能更好地理解漏洞的底层原理。当然了,调试之前如果有时间去好好读一读框架或者组件的源码会更好。因为我记得P牛说过一句话,跟着别人的文章学习学到的东西永远是很少的。P牛自己也说了,他复现漏洞的时候很少参考别人的文章,而是去读源码,靠自己的思路去分析漏洞。能做到这样最好。

大概讲了java审计的学习流程,相关视频和文章在谷歌上搜就能搜到了。那么废话不多说,先进行审计的第一节——java命令执行的方式。

Java命令执行一共有三种方式,分别是Runtime.getRuntime().exec、processBuilder和Processlmpl。其中Processlmpl是最底层的实现。processBuilder为中间层的实现。Runtime.getRuntime().exec为最上层的实现。意思就是前两种方式最后都是通过调用Processlmpl进行命令执行的。

 

Runtime.getRuntime().exec的实现代码:

 

public class ExecTest {
public static void main(String[] args) throws IOException {
String[] cale = new String[]{"cmd.exe","/c","calc.exe"};
Runtime.getRuntime().exec(cale);
System.out.println(cale);
}
}

 

processBuilder的实现代码:

 

public class ProcessBuilderTest {
public static void main(String[] args) throws IOException{
ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe","/c","calc.exe");
Process start = processBuilder.start();
System.out.println(start);
}
}

 

Processlmpl的实现代码:

 

import java.io.IOException;
import java.lang.Process;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

public class ProcesslmplTest {
public static void main(String []args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException{
Class clazz = Class.forName("java.lang.ProcessImpl"); // 获取ProcessImpl的Class对象
Method method = clazz.getDeclaredMethod("start", String[].class, Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class); // 获取start方法对象
method.setAccessible(true); // 设置方法允许在当前代码使用
Process p = (Process) method.invoke(null, new String[]{"cmd.exe","/c","calc.exe"}, null, ".", null, true); // 调用start方法
System.out.println(p);
}
}

至于Processlmpl的实现代码,需要等到下一节的java反射机制再讲解

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM