Java 8 中使用反射进行命令执行的 5 个方法
今天在逛先知的时候看到了一篇文章:《探究使用反射进行除Runtime的命令执行方法》https://xz.aliyun.com/t/12446 其中大概讲了下命令执行的其他构造方式,但最后没有给出实例,所以我这里就简单研究了一下。
概述
在RASP等安全产品防护严密的现在,普通的寻找Runtime.getRuntime().exec(cmds)的调用已经成为了一件不现实的事情
同样的,在Java中盛行的反序列化漏洞中,如果将RCE的功能简单的通过Runtime.getRuntime().exec(cmds)这种结构来进行实现可能大概率也不能达到我们的目的,所以探索一下Runtime的底层实现,使用更加底层且复杂的调用来进行RCE功能的实现相对来说更加的可行
命令执行
文章接下里要用到反射技术,这里就不细讲了,可以看看其他的文章学习一下:https://www.yuque.com/sanqiushu-dsz56/efe3vx/hchx1p
命令执行 1:Runtime.getRuntime().exec()
这个是大家所熟知的 java 中执行外部命令的方法。
首先我们跟踪Runtime执行命令的过程
exec() 函数在这里接收一个String类型的参数,调用 exec() 的另一个重载方法对参数进行处理,将其通过分隔符(默认为空格),将其封装成了数组对象
然后继续调用 exec() 重载方法,执行字符串数组类型的命令。
然后通过 ProcessBuilder()....start()
去执行命令了。那么我们自己也是可以通过反射去手动调用这个方法的,构造一下。
命令执行 2:ProcessBuilder().start()
environment() 是设置环境遍历的函数,directory() 是设置执行目录的函数,然而我们都没传值,所以直接可以忽略。继续看 start() 函数
继续跟进,系统先进行了一番检查,然后新建了一个 SecurityManager 进行检测命令是否允许,但默认情况下 SecurityManager 是 null ,不进行检查。
然后就发现了系统调用的是 ProcessImpl.start() 进行命令执行。
那么到这里我们又可以自己构造了
命令执行 3 ProcessImpl.start()
继续跟踪 ProcessImpl.start() 方法,在经过一番准备之后,系统来到了 UNIXProcess() 构造方法(我是 linux 系统)(Windows 系统是调用 create() 方法)
那么是不是意味着我们又可以构造了
命令执行 4 UNIXProcess()
那么继续往下看 UNIXProcess() 构造函数里面的代码
这里就一句话,调用 forkAndExec() 函数,那么我们可以手动调用这个函数,开始构造
命令执行 5: forkAndExec()
不过这个有点牵强,因为需要先构造一个 UNIXProcess 的实例才行。
当然,我这传入的都是 byte[] ,只能用于验证,后续需要对照源码,将每个参数的生成给自动化才行。
Windows 的最后面的代码执行途径不太一样,但是同理构造即可。
__EOF__

本文链接:https://www.cnblogs.com/Nestar/p/17335689.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:Nestar,转载请注明原文链接:https://www.cnblogs.com/Nestar/p/17335689.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律