【一文读懂【Java代码审计】之命令执行的三种方式

admin 2022年6月11日01:36:53代码审计评论10 views4962字阅读16分32秒阅读模式

介绍

这是java代码审计学习系列的开篇

本篇主要讲解三种方式的命令执行,它们的区别、原理、用途等

命令执行的三种方式

java基本语法知识是java代码审计的基础
在学会了java基础语法后,还要对javaweb有了解,如什么是servlet、jsp,怎么用,什么原理?
了解了javaweb后,就是对框架、中间件的了解,如spring、spring boot、mybatis、shiro、fastjson、tomcat等等
了解了框架后,应该就能感觉到spring框架的设计模式了,它用的就是mvc设计模式。
学习java的设计模式,,有助于理解代码
java面向对象,如类、接口、抽象类,继承,上转型、下转型、泛型,什么叫创建对象、实例化对象等等

既然要审代码,当然是对java越了解越好(上面这些我也在学)

这系列教程暂时用的是java11,其它版本可能源码有些区别

java代码如何执行命令?

大概有下面三种方式

  1. java.lang.Runtime#exec()

  2. java.lang.ProcessBuilder#start()

  3. java.lang.ProcessImpl#start()

下面调试一下 java.lang.Runtime执行代码的过程
示例代码如下

public class Main {

static void runtime() throws IOException {
Process Runexec = Runtime.getRuntime().exec("cmd /c dir");
InputStream in = Runexec.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int size;
while((size = in.read(bytes)) > 0)
bos.write(bytes,0,size);
System.out.println(bos.toString());
}
public static void main(String []args) throws IOException {
runtime();
}
}

Runtime的exec又把参数传给了重载的exec
【一文读懂【Java代码审计】之命令执行的三种方式
传入参数通过空格分割成数组
【一文读懂【Java代码审计】之命令执行的三种方式
【一文读懂【Java代码审计】之命令执行的三种方式
然后将数组形式的命令传给了ProcessBuilder
至此,前几个exec操作都是处理命令的,如果直接这样调用Runtime.getRuntime().exec(new String[]{"cmd","/c","dir"},null,null);就会直接到最后一个exec
下面进入ProcessBuilder的start函数
【一文读懂【Java代码审计】之命令执行的三种方式
先看第一个红框,说明java在创建进程时会先进行一个安全检查(如果有配置安全策略的话)
但下一步,下一个红框可以看见,又将命令传给了ProcessImpl,那如果直接调用ProcessImpl是不是可以绕过安全策略?
【一文读懂【Java代码审计】之命令执行的三种方式
然后是ProcessImpl的start方法,把命令信息传入,创建了ProcessImpl对象
【一文读懂【Java代码审计】之命令执行的三种方式
这里又检查了jdk.lang.Process.allowAmbiguousCommands
【一文读懂【Java代码审计】之命令执行的三种方式
如果为true,那就直接调用createCommandLine生成cmdstr

cmdstr = createCommandLine(
//legacy mode doesn't worry about extended verification
VERIFICATION_LEGACY,
executablePath,
cmd);

如果为false,就要对执行的程序进行分类,然后生成命令

boolean isShell = allowAmbiguousCommands ? isShellFile(executablePath)
: !isExe(executablePath);
cmdstr = createCommandLine(
// We need the extended verification procedures
isShell ? VERIFICATION_CMD_BAT
: (allowAmbiguousCommands ? VERIFICATION_WIN32 : VERIFICATION_WIN32_SAFE),
quoteString(executablePath),
cmd);

【一文读懂【Java代码审计】之命令执行的三种方式
然后通过create函数创建进程
【一文读懂【Java代码审计】之命令执行的三种方式
而create是一个native函数(就是其它语言写的函数,做成动态库,java在运行时就加载了,所以这里声明一下就可以直接调用)

private static synchronized native long create(String cmdstr,
String envblock,
String dir,
long[] stdHandles,
boolean redirectErrorStream)
throws IOException;

至此回顾一下调用过程
runtime的exec方法内执行了:return new ProcessBuilder(命令信息),=》
ProcessBuilder执行了:return ProcessImpl.start(命令信息) =》
ProcessImpl.start执行了 return ProcessImpl(命令信息)
而ProcessImpl通过native函数create创建了进程,然后将创建进程的信息存到了对象的属性中

所以最终exec或得到的是ProcessImpl的对象,又因为ProcessImpl继承自Process,所以可以使用Process接收返回值

现在知道了
Runtime是调用的ProcessBuilder
而ProcessBuilder是调用的ProcessImpl
所以上面三种方式本质都是调用ProcessImpl创建进程,命令执行

刚才是通过Runtime命令执行的
再换ProcessBuilder试试
回想起刚才runtime的exec是这样调用ProcessBuilder的
【一文读懂【Java代码审计】之命令执行的三种方式

可实际这样写的时候,发现调用environment报错
【一文读懂【Java代码审计】之命令执行的三种方式
因为源码中environment方法没写作用域,默认default作用域,只能同包下的类可以调用,而runtime和他都是java.lang包下,所以runtime可以调用
把environment(null)去掉试试:Process p = new ProcessBuilder(new String[]{"cmd","/c","dir"}).directory(null).start();
命令执行成功

下面再试试ProcessImpl
再模仿ProcessBuilder调用的方式试试
【一文读懂【Java代码审计】之命令执行的三种方式

ProcessImpl直接爆红,原因是ProcessImpl也是default作用域,,
【一文读懂【Java代码审计】之命令执行的三种方式

那问题就出现了,如果一个对象或方法,作用域是default或private,当前代码不在作用域内
是不是真的就不能调用了?

本文作者:z3, 转载请注明来自FreeBuf.COM


【一文读懂【Java代码审计】之命令执行的三种方式

————————————————

【2022HW系列】|10-一次某次攻防演练种的分析溯源

【2022HVV系列】|9-红蓝对抗-红队打点的那些事

【2022HVV系列】|8-应急响应之入侵排查

【2022HVV系列】|7-Windows主机入侵痕迹排查办法

【2022HVV系列】|6-记一次hw中的上线骚姿势(异速联+用友U8)

【2022HVV系列】|5-记一次溯源过程

【2022HVV系列】|4-红蓝对抗 | 红队打点的那些事

【2022HVV系列】|3-服务器入侵排查

【2022HVV系列】| 2-应急响应常用工具

【2022HVV系列】| 1-应急响应方法论思维导图


————————————————


【Hacking黑白红】,一线渗透攻防实战交流公众号

【一文读懂【Java代码审计】之命令执行的三种方式

回复“电子书”获取web渗透、CTF电子书:

回复“视频教程”获取渗透测试视频教程;  

回复“内网书籍”获取内网学习书籍;        

回复“CTF工具”获取渗透、CTF全套工具;

回复“内网渗透;获取内网渗透资料;

回复护网;获取护网学习资料 ;

回复python,获取python视频教程;

回复java,获取Java视频教程;

回复go,获取go视频教程


知识星球


【Hacking藏经阁】知识星球致力于分享技术认知

1、技术方面。主攻渗透测试(web和内网)、CTF比赛、逆向、护网行动等;

400G渗透教学视频、80多本安全类电子书、50个渗透靶场(资料主要来自本人总结、以及学习过程中购买的课程)

2、认知方面。副业经营、人设IP打造,具体点公众号运营、抖*yin等自媒体运营(目前主要在运营两个平台4个号)。


如果你也想像我一样,不想35岁以后被动的去面试,那么加入星球我们一起成长。





【一文读懂【Java代码审计】之命令执行的三种方式


欢迎加入99米/年,平均每天2毛7分钱,学习网络安全一整年。


【一文读懂【Java代码审计】之命令执行的三种方式




渗透实战系列


【渗透实战系列】|44-记一次授权渗透实战(过程曲折,Java getshell)

【渗透实战系列】|43-某次通用型漏洞挖掘思路分享

【渗透实战系列】|42-防范诈骗,记一次帮助粉丝渗透黑入某盘诈骗的实战

【渗透实战系列】|41-记一次色*情app渗透测试

【渗透实战系列】|40-APP渗透测试步骤(环境、代理、抓包挖洞)

▶【渗透实战系列】|39-BC渗透的常见切入点(总结)

【渗透实战系列】|38-对某色情直播渗透

【渗透实战系列】|37-6年级小学生把学校的网站给搞了!

【渗透实战系列】|36-一次bc推广渗透实战

【渗透实战系列】|35-旁站信息泄露的dedecms站点渗透

【渗透实战系列】|34-如何用渗透思路分析网贷诈骗链

【渗透实战系列】|33-App渗透 ,由sql注入、绕过人脸识别、成功登录APP

【渗透实战系列】|32-FOFA寻找漏洞,绕过杀软拿下目标站

【渗透实战系列】|31-记一次对学校的渗透测试

【渗透实战系列】|30-从SQL注入渗透内网(渗透的本质就是信息搜集)

【渗透实战系列】|29-实战|对某勒索APP的Getshell

【渗透实战系列】|28-我是如何拿下BC站的服务器

【渗透实战系列】|27-对钓鱼诈骗网站的渗透测试(成功获取管理员真实IP)

【渗透实战系列】|26一记某cms审计过程(步骤详细)

【渗透实战系列】|25一次从 APP 逆向到 Getshell 的过程

【渗透实战系列】|24-针对CMS的SQL注入漏洞的代码审计思路和方法

【渗透实战系列】|23-某菠菜网站渗透实战

【渗透实战系列】|22-渗透系列之打击彩票站

【渗透实战系列】|21一次理财杀猪盘渗透测试案例

【渗透实战系列】|20-渗透直播网站

【渗透实战系列】|19-杀猪盘渗透测试

【渗透实战系列】|18-手动拿学校站点 得到上万人的信息(漏洞已提交)

【渗透实战系列】|17-巧用fofa对目标网站进行getshell

【渗透实战系列】|16-裸聊APP渗透测试

【渗透实战系列】|15-博彩网站(APP)渗透的常见切入点

【渗透实战系列】|14-对诈骗(杀猪盘)网站的渗透测试

【渗透实战系列】|13-waf绕过拿下赌博网站

【渗透实战系列】|12 -渗透实战, 被骗4000花呗背后的骗局

【渗透实战系列】|11 - 赌博站人人得而诛之

【渗透实战系列】|10 - 记某色X商城支付逻辑漏洞的白嫖(修改价格提交订单)

【渗透实战系列】|9-对境外网站开展的一次web渗透测试(非常详细,适合打战练手)

【渗透实战系列】|8-记一次渗透测试从XSS到Getshell过程(详细到无语)

【渗透实战系列】|7-记一次理财杀猪盘渗透测试案例

【渗透实战系列】|6- BC杀猪盘渗透一条龙

【渗透实战系列】|5-记一次内衣网站渗透测试

【渗透实战系列】|4-看我如何拿下BC站的服务器

【渗透实战系列】|3-一次简单的渗透

【渗透实战系列】|2-记一次后门爆破到提权实战案例

【渗透实战系列】|1一次对跨境赌博类APP的渗透实战(getshell并获得全部数据)

【一文读懂【Java代码审计】之命令执行的三种方式

    

长按-识别-关注

【一文读懂【Java代码审计】之命令执行的三种方式

Hacking黑白红

一个专注信息安全技术的学习平台

【一文读懂【Java代码审计】之命令执行的三种方式

点分享

【一文读懂【Java代码审计】之命令执行的三种方式

点收藏

【一文读懂【Java代码审计】之命令执行的三种方式

点点赞

【一文读懂【Java代码审计】之命令执行的三种方式

点在看

原文始发于微信公众号(Hacking黑白红):【一文读懂【Java代码审计】之命令执行的三种方式

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月11日01:36:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  【一文读懂【Java代码审计】之命令执行的三种方式 http://cn-sec.com/archives/1107416.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: