java之命令执行审计思路

1 漏洞原理

因用户输入未过滤或净化不完全,导致Web应用程序接收用户输入,拼接到要执行的系统命令中执行。一旦攻击者可以在目标服务器中执行任意系统命令,就意味着服务器已被非法控制。

2 审计中常用函数

一旦攻击者可以在目标服务器中执行任意系统命令,就意味着服务器已被非法控制。 在Java中可用于执行系统命令的方式有API有:

java.lang.Runtime

java.lang.ProcessBuilder

java.lang.ProcessImpl

2.1 java.lang.Runtime

java.lang.Runtime中提供了getRuntime()内置方法获取类实例。在java中用到最多的就 是java.lang.Runtime#exec() 来命令执行。

例1:

    public static void main(String[] args) throws IOException {
        String command = "calc";
        Runtime.getRuntime().exec(command);
    }

输出结果

例2:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
​
public class Demo06 {
    public static void main(String[] args) {
        try {
            String command = "ping ej0v42.dnslog.cn";
            Process proc = Runtime.getRuntime().exec(command); //打印执行结果
            InputStream in = proc.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF8"));
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
​
}
​

输出结果

Runtime#exec() 调用链

断点后进入

点击步过进入

往上看代码哪里调用了它

接着往下走

接着步过到

剩下一路步过到这里java.security.AccessController.doPrivileged进行执行

根据系统类型区分底层要调用详细参考:

Runtime (Java Platform SE 7 )

2.2 java.lang.ProcessBuilder

ProcessBuilder类是JDK 1.5在java.lang中新添加的一个类,用于创建操作系统进程。 通常使用java.lang.ProcessBuilder#start() 来启动和管理进程。

import java.io.IOException;
​
public class Demo02 {
    static {
        try {
            Runtime.getRuntime().exec("calc");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
       Demo02 evilClass=new Demo02();
    }
}

输出结果

2.3 java.lang.ProcessImpl

ProcessImpl类通常是为ProcessBuilder.start()创建新进程服务的,不能直接去调用。 看到

ProcessImpl类构造器私有,所以不能直接对其进行实例化,为了演示可以用反射

例1: 在获取到一个静态方法后,必须用 setAccessible 修改它的作用域,否则不能调用。

    public static void impCommandExec2() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
            String[] cmds = {"calc"};
            Class clazz = Class.forName("java.lang.ProcessImpl");
            Method method = clazz.getDeclaredMethod("start",
                    new String[]{}.getClass(),
                    Map.class,String.class,
                    ProcessBuilder.Redirect[].class,
                    boolean.class);
            //获取到要调用的方法:java.lang.ProcessImpl,start,并且按照规范传递相关的参数
            method.setAccessible(true);//开启程序利用反射机制对私有的属性或方法进行访问
            method.invoke(null,cmds,null,".",null,true);//通过方法的对象调用期执行的方法
        }

输出结果

测试案例- 1:反射调用Runtime#exec()时的失败写法

Class clazz = Class.forName("java.lang.Runtime");
clazz.getMethod("exec", String.class).invoke(clazz.newInstance(), "id");

无法执行的原因: Clazz.newInstance() 中要求访问目标类构造函数,由于 java.lang.Runtime 的构造函数 私有,所以执行失败。

Method.invoke()

Clazz.newInstance() 中要求访问目标类构造函数,由于 java.lang.Runtime 的构造函数 私有,所以执行失败。

Method.invoke()

写法一: 通过java.lang.Runtime类内部方法getRuntime()获取当前实例。

Class clazz = Class.forName("java.lang.Runtime");
clazz.getMethod("exec",
String.class).invoke(clazz.getMethod("getRuntime").invoke(clazz),
"calc.exe");

关于反射调用静态方法: 由于静态方法不属于任何对象,只属于类本身,所以使用invoke时不需要传实例对象。

写法二: 反射获取私有构造函数。用 setAccessible 修改它的作用域。

Class clazz = Class.forName("java.lang.Runtime");
Constructor m = clazz.getDeclaredConstructor();
m.setAccessible(true);
clazz.getMethod("exec", String.class).invoke(m.newInstance(), "calc");

总结:注意利用反射机制调用命令API时是否具有访问权限的问题

例2: 使用ProcessBuilder.start()执行"ifconfig -a"命令

InputStream in = new ProcessBuilder("ifconfig -a").start();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/759934.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AIGC】AnimateAnyone:AI赋予静态照片生命力的魔法

摘要: 在人工智能技术的不断进步中,AnimateAnyone项目以其创新性和易用性脱颖而出,成为GitHub上备受瞩目的AI项目之一。由阿里巴巴智能计算研究院开发的这一技术,允许用户通过提供一张静态照片,快速生成动态角色。本文…

SpringBoot(一)创建一个简单的SpringBoot工程

Spring框架常用注解简单介绍 SpringMVC常用注解简单介绍 SpringBoot(一)创建一个简单的SpringBoot工程 SpringBoot(二)SpringBoot多环境配置 SpringBoot(三)SpringBoot整合MyBatis SpringBoot(四…

docker安装rocketMq5x以上的版本

1.背景 安装RocketMQ 5.x以上的版本主要是因为新版本引入了许多性能优化、新功能以及对已有特性的增强,这些改进可以帮助提升消息队列系统的稳定性和效率。 1.性能提升:RocketMQ 5.x版本通常包括了对消息处理速度、吞吐量和延迟的优化,使得系…

在Linux (Ubuntu 16) 下安装LabVIEW

用户尝试在Ubuntu 16操作系统上安装LabVIEW,但找不到合适的安装文件来支持Ubuntu。已经下载了运行时文件,并尝试将.rpm包转换为.deb包并安装在Ubuntu上。然而,安装完成后,没有在应用程序中看到LabVIEW的图标。 用户希望能够在Ubu…

Spring MVC中的DispatcherServlet、HandlerMapping和ViewResolver的作用

在Spring MVC框架中,DispatcherServlet、HandlerMapping和ViewResolver是核心组件,它们各自承担着不同的角色和任务: 1.DispatcherServlet:它是Spring MVC生命周期中的前端控制器,负责接收HTTP请求并将它们分发给相应的…

【OpenREALM学习笔记:13】pose_estimation.cpp和pose_estimation.h

UML Class Diagram 图中红色框为头文件中所涉及到的函数、变量和结构体 核心函数 PoseEstimation::process() 其核心作用为执行位姿估计的处理流程,并返回是否在此循环中进行了任何处理。 在这个函数中判断并完成地理坐标的初始化或这地理坐标的更新。 这里需要…

论文阅读_基本于文本嵌入的信息提取

英文名:Embedding-based Retrieval with LLM for Effective Agriculture Information Extracting from Unstructured Data 中文名:基于嵌入的检索,LLM 从非结构化数据中提取有效的农业信息 地址: https://arxiv.org/abs/2308.03107 时间&…

昇思25天学习打卡营第04天|数据集 Dataset

数据是深度学习的基础,高质量的数据输入将在整个深度神经网络中起到积极作用。MindSpore提供基于Pipeline的数据引擎,通过数据集(Dataset)和数据变换(Transforms)实现高效的数据预处理。其中Dataset是Pipel…

【linux】网络基础(1)

文章目录 网络基本概念网络的定义网络的类型局域网(LAN)广域网(WAN) 网络协议OSI七层模型TCP/IP模型TCP/IP模型的结构 网络传输的基本流程计算机与计算机之间的通信计算机的信息处理封装报头 网络基本概念 网络的定义 1.网络是指…

1.搭建篇——帝可得后台管理系统

目录 前言项目搭建一、搭建后端项目1.初始化项目Maven构建 2.MySQL相关导入sql配置信息 3. Redis相关启动配置信息 4.项目运行 二、 搭建前端项目1.初始化项目2.安装依赖3.项目运行 三、问题 前言 提示:本篇讲解 帝可得后台管理系统 项目搭建 项目搭建 一、搭建后…

【2024-热-办公软件】ONLYOFFICE8.1版本桌面编辑器测评

在今日快速发展的数字化办公环境中,选择一个功能全面且高效的办公软件是至关重要的。最近,我有幸体验了ONLYOFFICE 8.1版本的桌面编辑器,这款软件不仅提供了强大的编辑功能,还拥有众多改进,让办公更加流畅和高效。在本…

DCS-11双位置继电器 DC220V 板前接线带底座 约瑟 JOSEF

系列型号: DCS-11双位置继电器; DCS-12双位置继电器; DCS-13双位置继电器; ​用途 RXMVB2(DCS-10)系列双位置继电器用于需要大容量双稳态触点的工业控制和其它一般控制场合。 特点 体积小,拆装方便,能安…

Halcon 椭圆

一 椭圆 方差的概念: 例1 两人的5次测验成绩如下:X: 50,100,100,60,50 E(X)72;Y: 73, 70, 75,72,70 E(Y)72。平均成绩相同&#xff0c…

[Cloud Networking] OSPF

OSPF 开放式最短路径优先(Open Shortest Path First)是一种动态路由协议,它属于链路状态路由协议,具有路由变化收敛速度快、无路由环路、支持变长子网掩码和汇总、层次区域划分等优点。 1 OSPF Area 为了适应大型网络&#xff0…

类似李跳跳的软件有什么,强烈推荐所有安卓手机安装!!!

今天阿星分享一款让安卓手机更顺滑的神器——智慧岛。你问我李跳跳?由于大家都知道的原因,那是个曾经让广告无处遁形的神兵利器,可惜现在它已经退休了。不过别担心,智慧岛接过了接力棒,继续为我们的安卓体验保驾护航。…

vue3 全局引入 onMounted, reactive, ref 的插件全局引入

webpack 的引入 npm install -D unplugin-auto-import const AutoImport require(unplugin-auto-import/webpack).default;configureWebpack: {devtool: source-map,module: {rules: [{test: /\.mjs$/,include: /node_modules/,type: javascript/auto}],}, plugins: [Aut…

【C++深度探索】继承机制详解(一)

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:大耳朵土土垚的博客 &#x1…

【高中数学/基本不等式】已知:x,y皆为正实数,且2xy+x+6y=6 求:x+2y的最小值

【题目】 已知:x,y皆为正实数,且2xyx6y6 求:x2y的最小值 【解答】 解法一:因为2xyx6y6 可转换为(x3)(2y1)-36 得到(x3)(2y1)9 而x2yx3-32y1-1 (x3)(2y1)-4 >2*根号下[(x3)(2y1)]-4 2*3-4 2 解法二&#xff1a…

Powershell 简易爬虫,提取种子网站的磁力链接

目录 一. 需求二. 分析2.1 思路分析2.2 技术点 三. 代码四. 效果 一. 需求 ⏹有网站如下所示,先要求从按照关键词搜索到的网页中,提取出所有的磁力链接。 二. 分析 2.1 思路分析 打开网页之后,从网页中先提取出所有的标题相关的url然后再打…

sqlmap注入详解

免责声明:本文仅做分享... 目录 1.介绍 2.特点 3.下载 4.帮助文档 5.常见命令 指定目标 请求 HTTP cookie头 HTTP User-Agent头 HTTP协议的证书认证 HTTP(S)代理 HTTP请求延迟 设定超时时间 设定重试超时 设定随机改变的参数值 利用正则过滤目标网址 避免过多的…