首页 > 编程语言 >学习笔记-java代码审计-命令执行

学习笔记-java代码审计-命令执行

时间:2022-11-13 08:45:14浏览次数:64  
标签:审计 java ProcessBuilder exec process 笔记 命令 Runtime

java代码审计-命令执行

0x01 漏洞挖掘

String cmd = request.getParameter("cmd");
Runtime runtime = Runtime.getRuntime(); //Runtime.getRuntime.exec
ProcessBuilder processBuilder = new ProcessBuilder(cmd); //ProcessBuilder.start()

String result = "";
try {
  //Process process = runtime.exec(cmd);
  Process process = processBuilder.start();
  //只是调用了对应进程没有回显,需要从流中读取
  BufferedInputStream bis = new BufferedInputStream(process.getInputStream());
  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(bis));
  String line = "";
  while (null != (line = bufferedReader.readLine())) {
    result += line + "\n";
  }
  if (process.waitFor() != 0) {
    if (process.exitValue() == 1)
      response.getWriter().println("command exec failed");
  }
  bufferedInputStream.close();
  bufferedReader.close();
} catch (Exception e) {
  response.getWriter().println("error");
  return;
}
response.getWriter().println(result);

java的Runtime.getRuntime.execProcessBuilder.start,都是直接启动传入参数对应的进程。以curl为例,php的system会启动系统shell,然后通过shell来启动curl进程,这个过程中,如果传入的命令带有shell能解析的语法,就会首先解析。

所以,如果只是命令执行的部分参数可控,想在java中通过;、|、&等实现命令注入,是行不通的。当然不排除程序本身存在漏洞,只需传入参数即可造成漏洞。

如果命令以字符串形式传入Runtime.getRuntime.exec,程序会将传入的命令用空格来拆分。

Process process = runtime.exec("ping -c 1 " + ip);
//这种传入 127.0.0.1 | id,是无法正常执行的

如果执行命令使用的是ProcessBuilder.start,那么只能执行无参数的命令。因为ProcessBuilder不支持以字符串形式传入命令,只能拆分成List或者数组的形式传入,才能执行。

如果参数完全可控,可自行启动shell,然后在执行命令。

Process process = runtime.exec("sh -c whoami");

0x02 漏洞防御

命令执行漏洞的防御需要结合实际场景,没有很通用的防御手段。

  1. 尽量避免调用shell来执行命令。
  2. 如果是拼接参数来执行命令,对参数进行严格过滤,比如只允许字母数字。

0x03 参考资料

https://b1ngz.github.io/java-os-command-injection-note/

https://blog.csdn.net/u013256816/article/details/54603910

https://mp.weixin.qq.com/s/zCe_O37rdRqgN-Yvlq1FDg

点击关注,共同学习!
安全狗的自我修养

github haidragon

https://github.com/haidragon

标签:审计,java,ProcessBuilder,exec,process,笔记,命令,Runtime
From: https://www.cnblogs.com/haidragon/p/16885375.html

相关文章

  • 学习笔记-java代码审计-文件操作
    java代码审计-文件操作0x01文件上传这段代码来自菜鸟教程:privatestaticfinalStringUPLOAD_PATH="/tmp/upload";privatebooleanuploadWithFileUpload(HttpServ......
  • 学习笔记-java代码审计-反序列化
    Java代码审计-反序列化0x00漏洞挖掘业务代码简单来说,找readObject/readUnshared就好了protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresp......
  • 学习笔记-java代码审计-环境搭建+前置知识
    Java代码审计-环境搭建+前置知识0x00中间件tomcat因为个人比较矫情,不想在mac搭java的开发环境,就想着有没有本地写代码然后部署到虚拟机上运行。毕竟java是静态语言,在编......
  • 学习笔记-java代码审计-表达式注入
    java代码审计-表达式注入0x01漏洞挖掘spelspel表达式有三种用法:注解@value("#{表达式}")publicStringarg;这种一般是写死在代码中的,不是关注的重点。xml<b......
  • 【Javaweb】做一个房产信息管理系统三(src目录的部署工作【三层框架】各个层含义)
    接下来,我打算进行Java文件的部署工作,但实际上为了得到更多的分数,我们还是应该先做页面首先我们需要了解对于Javaweb,src下的目录应该如何部署:(三层架构单独开一篇讲) 那......
  • java.util.List如何用
    起因是这样,我在学习Javaweb,然后就突然有很多类似的语句  这是什么意思呢?让我们一起来解决看看吧!List有序集合(也成为序列),用户可以精确控制列表中每个元素的插入位置。......
  • 工业机器人基础笔记(一)
    第一章续论读者可自行学习,笔记从第二章开始。此笔记仅仅为抄录,便于复习。按照拓扑结构分类,我们把工业机器人分为三类。串联机器人并联机器人混联机器人那什么是拓扑......
  • JAVA注解(Annotation)
    注解(Annotation)什么是注解Annotation的作用:不是程序本身,可以对程序做出解释,这一点和注释(comment)没什么区别。可以被其他程序(比如编译器)读取Annotation的格式:注......
  • 【Javaweb】做一个房产信息管理系统二
    由于我还不太熟练用sql语句写数据库,所以直接用navicate了我们需要新建四个数据表:adimin(超级管理员信息)customer(顾客)property(房产信息)realestate(房产经纪人信息)我发现......
  • 【读书笔记】《Verilog HDL数字设计与综合(第二版 本科教学版)》第一章:Verilog HDL数字
    一、数字电路CAD技术的发展历史真空管晶体管,集成电路(IntegratedCircuit,IC)小规模集成电路(SmallScaleIntegrated,SSI):逻辑门数量很少中规模集成电路(MediumScaleI......