应用软件安全编程--03净化传递给 Runtime.exec() 方法的非受信数据

每个 Java 应用都有一个 Runtime 类的实例, 一般需要使用 shell 时调用它,从而可以在 POSIX  中 使用/bin/sh 或者在Windows  平台中使用cmd.exe。 当参数中包含以空格、双引号或者其他以一/开头 的用来表示分支的字符时,就可能发生参数注入攻击。任何源于程序受信边界之外的字符串数据,在当 前平台作为命令来执行之前,都应经过净化。

对于净化传递给 Runtime,exec() 方法的非受信数据的情况,示例1给出了不规范用法(Java 语言) 示例。示例2给出了规范用法(Java 语言)示例。

示例1(Windows):

class     DirList     {

public static void main(String[] args) throws Exception {

String  dir  =  System.getProperty("dir");

Runtime  rt  =  Runtime.getRuntime();

Process  proc  =  rt.exec("cmd.exe  /C  dir"+  dir);

int  result  =  proc.waitFor();

if    (result!=     0){

System.out.printIn("process     error:"+    result);

 

InputStream    in    =(result    ==0)?    proc.getInputStream():

proc.getErrorStream();

int     c;

while((c        =        in.read())!=- 1){

System.out.print((char)c);

 }

该代码示例使用dir命令列出目录列表。这是通过 Runtime.exec() 方法调用 Windows  的 dir命令来实现的。因为Runtime.exec() 方法接受源于运行环境的未经净化的数据,所以这些代码会引起命令 注入攻击。

攻击者可以通过以下命令利用该程序:

java-Ddir='dummy &.echo bad'Java

该命令实际上执行的是两条命令:

cmd.exe /C dir dummy &. echo bad

第一条命令会列出并不存在的dummy文件夹,并且在控制台上输出 bad。

示例2(净化):

if(!Pattern.matches("[0-9A-Za-z@.]+",dir)){

 //..

 }

这个符合规范的代码实例会对非受信的用户输入进行净化,只允许白名单中的字符出现在参数中,并传给 Runtime.exec()方法,其他所有的字符都会被排除掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的老人吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值