Java命令注入_Java OS 命令注入学习笔记

Thursday. September 27, 2018

– 6 mins

0x01 简介

Java 执行系统命令的方法

易导致命令注入的危险写法以及如何避免

0x02 注意点

首先要注意的是,通过 Java 来执行系统命令时,并不是通过 shell 来执行 (Linux下),因此如果需要用到如 pipeline ( |

)、 ;

、 &&

、 ||

等 shell 特性时,需要创建 shell 来执行命令,如:

/bin/sh -c "ls -lh; pwd"

具体可参考 https://alvinalexander.com/java/java-exec-system-command-pipeline-pipe

0x03 执行方式

ProcessBuilder

java.lang.ProcessBuilder

中 start()

方法可以执行系统命令,命令和参数可以通过构造方法的 String List 或 String 数组来传入

ProcessBuilder(List command)

ProcessBuilder(String... command)

如执行 ls -lh /home/www

的例子

String[] cmdList = new String[]{"ls", "-lh", "/home/www"};

ProcessBuilder builder = new ProcessBuilder(cmdList);

builder.redirectErrorStream(true);

Process process = builder.start();

因为 Java 中执行命令不是通过 shell,若没有手动创建 shell 来执行命令,命令非完全可控时,正常的情况下是无法使用 ;

、 &&

等来实现命令注入的,例如

命令的某个参数可控

// String dir = "xx";

String[] cmdList = new String[]{"ls", "-lh", dir};

ProcessBuilder builder = new ProcessBuilder(cmdList);

builder.redirectErrorStream(true);

Process process = builder.start();

printOutput(process.getInputStream());

dir

参数用户可控,如想通过传入 /home/www;id

, 来执行 id 命令,是无法成功的,程序的输出为

<
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值