原标题:Java安全之命令执行
前言
java安全里无论是反序列化还是什么其他漏洞,要说最终最能体现漏洞价值的话,那就是非命令执行莫属了。这次打算花点时间好好总结整理下java命令执行的几种方式,并做些浅面的分析。最近刚好看到了360BugCloud公众号的一篇java命令执行的调试分析文章,也跟着调试了一遍,期间学到了不少,链接会在文末贴出来。
首先总的的来说,java命令执行可以分为4种方法,分别是 java.lang.Runtime#exec、java.lang.ProcessBuilder#start、java.lang.ProcessImpl#start以及通过JNI的方式调用动态链接库,最后一种方式这篇文章暂不做分析,先看下前面比较常用的三种方法。
Runtime命令执行
在java反序列化中用到最多的就是Runtime类的exec方法来命令执行了,用法:
Runtime.getRuntime. exec( "whoami")
实际上Runtime类的exec的重载方法有6个,如下:
例如本地运行命令ipconfig查看网络配置并返回信息:
InputStream ins = Runtime.getRuntime.exec( "ipconfig").getInputStream;ByteArrayOutputStream bos = newByteArrayOutputStream;byte[] bytes = newbyte[ 1024];intsize;while((size = ins.read(bytes)) > 0)bos.write(bytes, 0,size);System. out.println(bos.toString);
但是这里有个问题,在渗透的过程中如果要遇到要写入文件的话,这里使用”echo xxx>test.txt”等类似的命令就会爆出如下的错误:
下面就跟入代码调试查看下具体原因,直接在exec方法处打断点
首先是跳到另外一个exec的重载方法,envp参数为null,file类型的dir参数也为null
接着将我们传入的command字符串带入到StringTokenizer类进行处理,跟入查看下