首页 > 编程语言 >java基础漏洞学习----基础命令执行漏洞

java基础漏洞学习----基础命令执行漏洞

时间:2023-10-21 11:11:39浏览次数:29  
标签:java String exec ip ---- 漏洞 command import

java基础漏洞学习----基础命令执行漏洞

基础命令执行常见方法

1.ProcessBuilder

package com.example.servletdemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Command1 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        String ip = request.getParameter("ip");
        if(ip!=null && !ip.isEmpty()){
            try{
                String command = "ping "+ip;
                ProcessBuilder pb = new ProcessBuilder("cmd","/c",command);
                Process p = pb.start();
                BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
                StringBuilder result = new StringBuilder();
                String line;
                while((line = reader.readLine())!=null){
                    result.append(line).append("\n");
                }

                response.getWriter().print(result.toString());
            } catch (IOException e){
                e.printStackTrace();
                response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            }
        } else {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        }
    }
}

web.xml中添加路由

    <servlet>
        <servlet-name>Command1</servlet-name>
        <servlet-class>com.example.servletdemo.Command1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Command1</servlet-name>
        <url-pattern>/command1</url-pattern>
    </servlet-mapping>

传参ip=127.0.0.1%26dir
但是好像命令里面不让有反斜杠

2.Runtime exec
1)Runtime exec执行字符串参数和数组参数
1.字符串参数
稍微修改一下代码

import java.lang.Runtime;

...

                String command = "ping "+ip;
                Process p = Runtime.getRuntime().exec(command);

此时再传入ip=baidu.com%26dir会报错,显然将传入的参数当一个整体让ping命令执行了

然后再改

String command = "cmd.exe /c ping "+ip;

ip=baidu.com%26dir 这样可以了

2.数组参数
再改

String[] command = {"cmd.exe","/c","ping"+ip};

ip=baidu.com%26dir 这样可以了 但是不让有空格
3.深入理解其原因
先选择exec,然后ctrl+右键进入类

发现

  public Process exec(String cmdarray[]) throws IOException {
        return exec(cmdarray, null, null);
    }

然后再跟进exec

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


然后在当前类里搜索exec 发现如果传入的是字符串类型的话会经过StringTokenizer处理

    public Process exec(String command, String[] envp, File dir)
        throws IOException {
        if (command.isEmpty())
            throw new IllegalArgumentException("Empty command");

        StringTokenizer st = new StringTokenizer(command);
        String[] cmdarray = new String[st.countTokens()];
        for (int i = 0; st.hasMoreTokens(); i++)
            cmdarray[i] = st.nextToken();
        return exec(cmdarray, envp, dir);
    }

根据此处的英文注释发现\t\n\r\f会对传入的字符串进行分割,分割完成后会返回一个cmdarray数组,所以传入字符串参数和传入数组参数返回结果不同

例如linux命令

String command = "/bin/sh -c \"ping -t 3 baidu.com;id\"";

会被拆分为

{"/bin/sh","-c",""ping","-t","3","baidu.com;id","""}

相当于ping 'baidu.com;id'这个域名
3.Reflect Method
用途:jsp免杀木马
通过Class.forName获得恶意类
通过runtimeClass.getMethod获得恶意类中的方法
使得恶意类和恶意方法可以通过编码进行混淆绕过静态检测

package com.example.servletdemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

public class Command3 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        String ip = request.getParameter("ip");
        if(ip!=null && !ip.isEmpty()){
            try{

                // 获取Runtime类
                Class<?> runtimeClass = Class.forName("java.lang.Runtime");
                // 获取getRuntime方法
                Method getRuntimeMethod = runtimeClass.getMethod("getRuntime");
                // 调用getRuntime方法获取Runtime对象
                Object runtimeObject = getRuntimeMethod.invoke(null);
                // 获取exec方法
                Method execMethod = runtimeClass.getMethod("exec", String.class);
                // 执行命令
                String command = "cmd.exe /c ping "+ip;
                Process p = (Process) execMethod.invoke(runtimeObject, command);

                BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
                StringBuilder result = new StringBuilder();
                String line;
                while((line = reader.readLine())!=null){
                    result.append(line).append("\n");
                }

                response.getWriter().print(result.toString());
            } catch  (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException | IOException e ){
                e.printStackTrace();
                response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            }
        } else {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        }
    }
}

ip=baidu.com%26dir

代码审计

搜索ProcessBuilder,Process,exec,Runtime,getRuntime,追踪反射类等等

标签:java,String,exec,ip,----,漏洞,command,import
From: https://www.cnblogs.com/thebeastofwar/p/17767488.html

相关文章

  • Conditional Probability Models for Deep Image Compression
    深度神经网络被训练来作为图像压缩的自动编码器是一个前沿方向,面临的挑战有两方面——量化(quantization)和权衡reconstructionerror(distortion)andentropy(rate),这篇文章关注后者。主要思想是使用上下文模型直接对潜在表示的熵建模;3D-CNN一个学习自动编码器潜在分布的条......
  • MySQL CASE()用法
    MySQL中的CASE表达式用于根据条件进行条件判断和返回多个可能的值。它允许在查询中执行简单的逻辑判断,并根据不同的条件返回不同的值或执行不同的操作。CASE表达式有两种形式:简单CASE和搜索CASE。简单CASE形式:CASEexpressionWHENvalue1THENresult1WHE......
  • 触想五代强固型工业一体机在近海船舶上的应用
    1、行业发展背景近海船舶的发展紧密关联着海上运输、渔业贸易、旅游开发、能源探测等多领域,带动区域经济、文化繁荣发展。随着现代科学与信息技术在各行各业的作用增强,工业4.0带动的产业升级逐步渗透进船舶领域,在此背景下,船舶终端设备的应用也呈现自动化、智能化、......
  • MySQL IF()用法
    MySQL中的IF函数用于根据条件返回两个值中的一个。它可以应用于复杂查询和更新语句中,以便根据条件动态生成值。IF函数的语法如下:IF(condition,value_if_true,value_if_false)其中,condition是一个布尔表达式或一个返回布尔值的函数,value_if_true是条件为TRUE时返回......
  • Docker启动报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock
    问题描述:  Docker启动报错:CannotconnecttotheDockerdaemonatunix:///var/run/docker.sock.Isthedockerdaemonrunning?  CannotconnecttotheDockerdaemonatunix:///var/run/docker.sock.Isthedockerdaemonrunning?输入dockerps命令无法显示服......
  • 学习笔记6
    教材第三章知识点总结Unix/Linux进程管理:多任务处理:多任务处理是指操作系统同时运行多个进程或线程的能力。操作系统通过时间片轮转或优先级调度等算法来实现多任务处理。多任务处理可以提高系统的资源利用率和响应速度。进程的概念理解:进程是程序的执行实例,是操作......
  • 12、Linux中shell脚本
    Linux中shell脚本目录Linux中shell脚本一、基础知识1、第一个shell脚本程序2、shell变量定义3、shell变量的赋值、修改、删除4、shell特殊变量二、脚本使用1、静态IP修改-交互式脚本2、主机存活探测-if脚本3、主机存活探测-for脚本4、主机存活探测-while脚本5、纯净查杀-case脚本......
  • Linux (7) NetworkManager重置resolve.conf
    《WindowsAzurePlatform系列文章目录》 在默认情况下,AzureLinuxVM会安装waagent,而waagent会依赖于NetworkManager服务。当我们修改了resolve.conf的时候,如果重启NetworkManager或者重启了LinuxVM,NetworkManager会重置resolve.conf。 目前有两个......
  • HTML标签之列表标签
    一无序列表1.默认是竖着排列,默认前面有实心圆符号2.想要修改符号样式给ul添加type属性3.type属性{circle:空心圆,square:方形,none:去除符号,disc:默认实心圆}①默认样式<ul><li>我是无序列表1</li><li>我是无序列表2</li><li>我是无序列表3</li><li>......
  • 10.21算法
    颠倒二进制位颠倒给定的32位无符号整数的二进制位。提示:请注意,在某些语言(如Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在Java中,编译器使用二......