【java代码审计】命令注入

1 成因

开发者在某种开发需求时,需要引入对系统本地命令的支持来完成某些特定的功能,此时若未对用户的输入做严格的过滤,就可能发生命令注入。

2 造成命令注入的类或方法

  • Runtime类:提供调用系统命令的功能

    ①Runtime.getRuntime():获得JVM运行时的环境

    ②Runtime.getRuntime().exec(cmd)执行用户输入的cmd命令

    存在命令注入的代码如下:

    protected void doGet (HttpServletRequest req, HttpServletRequest resp) throws ServletException, IOException{
        String cmd = req.getParameter("cmd");
        Process process = Runtime.getRuntime().exec(cmd);
        InputStream in = process.getInputStream();
    
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] b = new byte[1024];//获取1M的一个缓冲区
        int i = -1;
        while((i=in.read(b)) != -1)//判断是否读完
        {
            byteArrayOutputStream.write(b,0,i);
        }
        PrintWriter Out = resp.getWriter();
        out.print(new String(byteArrayOutputStream.toByteArray()));
    }
    
  • ProcessBuilder:可以创建操作系统进程

    //利用指定的操作系统程序和参数构造一个进程生成器。
    ProcessBuilder(String… command) 
    
    //设置此进程生成器的操作系统程序和参数。 
    command(List<String> command) 
    command(String… command) 
     
    //设置此进程生成器的工作目录。
    directory(File directory) 
        
    //返回此进程生成器环境的字符串映射视图。 environment方法获得运行进程的环境变量,得到一个Map,可以修改环境变量 
    environment() 
        
    //使用此进程生成器的属性启动一个新进程。
    start() 
    
  • Groovy

    execute():可执行shell命令,eg:

    def command = "git log"
    def proc = command.execute()//执行git log的命令
    proc.waitFor()
    def status = proc.exitValue()
    

    result = sh(script: "shell command", returnStdout: true).trim()

    GroovyShell()

    //直接执行Groovy代码
    GroovyShell shell = new GroovyShell();shell.evaluate("\'calc\'.execute()");
    //通过加载本地脚本
    //1.
    GroovyShell shell = new GroovyShell();
    Script script = shell.parse(new File("src/main/java/ysoserial/vulndemo/GroovyTest.groovy"));
    script.run();
    //2.
    GroovyShell shell = new GroovyShell();
    shell.evaluate(new File("src/main/java/ysoserial/vulndemo/GroovyTest.groovy"));
    //通过加载远程脚本
    GroovyShell shell = new GroovyShell();shell.evaluate(new URI("http://127.0.0.1:8888/GroovyTest.groovy"));
    

3 连接符进行命令注入

在这里插入图片描述

如下代码不存在命令注入漏洞

protected ByteArrayOutputStream ping(String url) throws IOException{
	Process process = Runtime.getRuntime().exec("ping " + url);
	InputStream in = process.getInputStream();
	ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
	byte[] b = new byte[1024];
	int i = -1;
	while((i = in.read(b)) != -1){
		byteArrayOutputStream.write(b,0,i);
	}
	return byteArrayOutputStream;
}

若注入www.baidu.com&ipconfig时,java环境会把他当做完整的字符串,不会被当作两条命令执行。

对于Java环境中的命令注入,连接符的使用存在一些局限。

4 正确处理可控参数

public Process exec(String command) throws IOException {
        return exec(command, null, null);
    }
public Process exec(String command, String[] envp) throws IOException {
        return exec(command, envp, null);
    }
public Process exec(String cmdarray[]) throws IOException {
        return exec(cmdarray, null, null);
    }
public Process exec(String[] cmdarray, String[] envp, File dir)
        throws IOException {
        return new ProcessBuilder(cmdarray)
            .environment(envp)
            .directory(dir)
            .start();
    }

当传入的参数类型为字符串时,会先经过StringTokenizer的处理,主要是针对空格以及换行符等空白字符进行处理,后续会分割出一个cmdarray数组保存分割后的命令参数,其中cmdarray的第一个元素为所要执行的命令。经过处理后的参数www.baidu.com&ipconfig成为ping命令的参数,因此此时的连接符&并不生效,从而无法注入系统命令。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java代码审计中常见的问题包括: 1. SQL注入:当程序没有对输入数据进行验证或过滤时,攻击者可以通过输入恶意SQL语句来执行非法的数据库操作,例如删除、修改、查询等。在Java代码审计中,需要检查程序是否正确的进行输入验证和SQL语句过滤。 2. XSS攻击:当程序没有对输出数据进行转义或过滤时,攻击者可以通过在网页中注入恶意脚本来获取用户的敏感信息或执行非法操作。在Java代码审计中,需要检查程序是否正确的进行输出数据过滤和转义。 3. CSRF攻击:当程序没有正确的进行CSRF攻击防护时,攻击者可以通过伪造用户的请求来执行非法操作,例如修改用户密码、发送恶意邮件等。在Java代码审计中,需要检查程序是否正确的进行CSRF攻击防护。 4. 权限控制:当程序没有正确的进行权限控制时,攻击者可以通过越权访问来获取敏感信息或执行非法操作。在Java代码审计中,需要检查程序是否正确的进行权限控制。 5. 密码管理:当程序没有正确的处理密码时,攻击者可以通过猜测、撞库等方式来获取用户的密码。在Java代码审计中,需要检查程序是否正确的处理密码,包括密码的存储、传输、重置等。 6. 不安全的函数调用:当程序使用不安全的函数时,攻击者可以利用这些函数来执行非法操作,例如执行任意命令、读取敏感文件等。在Java代码审计中,需要检查程序是否使用了不安全的函数调用。 7. 日志记录:当程序没有正确的记录日志时,攻击者可以利用这些漏洞来进行攻击或隐藏攻击痕迹。在Java代码审计中,需要检查程序是否正确的记录了日志。 8. 安全设置:当程序没有正确的进行安全设置时,攻击者可以利用这些漏洞来进行攻击或绕过安全控制。在Java代码审计中,需要检查程序的安全设置,确保程序的安全策略符合最佳实践。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吃_早餐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值