前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java代码审计| Spring框架知识篇

Java代码审计| Spring框架知识篇

作者头像
漏斗社区
发布于 2018-07-26 07:25:45
发布于 2018-07-26 07:25:45
98902
代码可运行
举报
文章被收录于专栏:漏斗社区漏斗社区
运行总次数:2
代码可运行

在上期的Java代码审计Spring框架思路篇中,斗哥为大家讲述了如何得到Spring审计的Demo,审计源码,根据Spring框架审计思路初步判定是否存在漏洞,剩下就是构造POC,动态调试分析修改POC。本期Java代码审计Spring框架知识篇将讲述Spring构造POC要必备的知识。

0X01 传统Java代码命令执行

1.知识说明

由于业务需求,程序有可能要执行系统命令的功能,但如果执行的命令用户可控,业务上有没有做好限制,就可能出现命令执行漏洞。 但Spring框架漏洞则是某组件可能存在解析执行系统命令代码的方法并根据命令执行方法(Runtime.getRuntime().exec(cmd))构造执行系统命令的POC,如果命令执行成功,造成Spring远程命令执行漏洞。

2.例子

此处以getRuntime为例,Runtime.getRuntime().exec(cmd)执行系统命令并弹出计算器。 示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.IOException;

public class Cmd {//在linux系统下运行计算器
    public static void main(String[] args){
        String cmd = "gnome-calculator";//gnome-calculator计算器进程名
        try {
            Process ps = Runtime.getRuntime().exec(cmd);//执行命令
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

系统命令的执行结果:

此方法将产生一个本地的进程,并返回一个Process子类的实例(注意:Runtime.getRuntime().exec(cmd)返回的是 一个Process类的实例)该实例可用于控制进程或取得进程的相关信息。

由于调用 Runtime.exec()方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过 Process.getOutputStream() 输入流 Process.getInputStream() 输出流 Process.getErrorStream() 错误流 等方法重定向给它的父进程了。 用户需要用这些Stream来向子进程输入数据或获取子进程的输出,使用getInputStream()去读取命令执行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Cmd {
    public static void main(String[] args){
        String cmd = "ifconfig";
        try {
            Process run = Runtime.getRuntime().exec(cmd);//执行
            InputStream is = run.getInputStream();//取得执行结果输出流
            InputStreamReader isr =new InputStreamReader(is);//读输出流读取
            BufferedReader br=new BufferedReader(isr);//缓冲器读取
            String line=null;
            while((line=br.readLine())!=null)
            {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

执行结果:

3.补充

例如要执行带参数的命令等,exec有下列的方法重载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Process exec(String var1) throws IOException {
    return this.exec((String)var1, (String[])null, (File)null);
}

public Process exec(String var1, String[] var2) throws IOException {
    return this.exec((String)var1, var2, (File)null);
}

public Process exec(String var1, String[] var2, File var3) throws IOException {
    if (var1.length() == 0) {
        throw new IllegalArgumentException("Empty command");
    } else {
        StringTokenizer var4 = new StringTokenizer(var1);
        String[] var5 = new String[var4.countTokens()];

        for(int var6 = 0; var4.hasMoreTokens(); ++var6) {
            var5[var6] = var4.nextToken();
        }

        return this.exec(var5, var2, var3);
    }
}

public Process exec(String[] var1) throws IOException {
    return this.exec((String[])var1, (String[])null, (File)null);
}

public Process exec(String[] var1, String[] var2) throws IOException {
    return this.exec((String[])var1, var2, (File)null);
}

public Process exec(String[] var1, String[] var2, File var3) throws IOException {
    return (new ProcessBuilder(var1)).environment(var2).directory(var3).start();
}

sdfd

sdfd

0X02 SpEL表达式

1.知识说明

在Spring框架漏洞中大多数的远程命令执行漏洞,都不是直接解析执行系统命令代码,而是解析SpEL表达式。这时要构造的就是包含执行系统命令代码的SpEL表达式。

2.SpEL表达式介绍

Spring表达式语言全称Spring Expression Language是一种表达式语言,是一种可以与一个基于Spring的应用程序中的运行时对象交互。SpEL表达式是一种简化开发的表达式,通过使用表达式来简化开发,减少一些逻辑、配置的编写。SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用。

3.功能特性

SpEL支持以下的一些特性: 字符表达式 布尔和关系操作符 正则表达式 类表达式 访问properties,arrays,lists,maps等集合 方法调用 关系操作符 赋值 调用构造器 Bean对象引用 创建数组 三元操作符 变量 用户自定义函数 集合选择

4.SpEL基础表达式用法

用来计算String类型的字面值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#{'HELLO'}

为了在SpEL中表达使用Java的Runtime类,可以调用T()运算符所得到类型的静态方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T(java.lang.Runtime).getRuntime()

计算正则表达式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9._%+-]+\\.com'}

sdfd

0X03 SpEL表达式与命令执行组合

此处以SpEL表达式与getRuntime组合为例,T(java.lang.Runtime).getRuntime().exec('gnome-calculator')SpEL表达式中包含 执行系统命令并由parseExpression解析弹出计算器 示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;

public class Sdemo {
        public static void main(String[] args){
          ExpressionParser parser = new SpelExpressionParser();
          String expression = "T(java.lang.Runtime).getRuntime().exec('gnome-calculator')";//构造好的SpEL表达式
          String result = parser.parseExpression(expression).getValue().toString();//解析SpEL

        }
}

系统命令的执行结果:

0X04 小总结

此篇讲述Spring框架构造POC必备的知识,如java命令执行函数,SpEL表达式使用、两者的配合使用构造Spring框架的POC。下期斗哥将带来Java代码审计Spring框架实例篇将以Spring框架漏洞中的某个远程命令执行漏洞的Demo。根据审计思路来分析,深入学习Spring框架的代码审计。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漏斗社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
代码审计| Spring框架实例篇
Java代码审计Spring框架思路篇中,斗哥为大家讲述了如何得到Spring审计的Demo,审计源码,根据IDEA与Spring框架审计思路初步判定是否存在漏洞。
漏斗社区
2018/08/20
1.2K0
代码审计| Spring框架实例篇
Spring框架漏洞学习
自从算法和操作系统考试以来对Java的学习就摆的很严重了可以说,今天就从Spring的框架漏洞来学习一下Java吧…
h0cksr
2023/05/17
1.4K0
代码审计 | 表达式注入
表达式语言(Expression Language)简称 EL 表达式,是一种 JSP 内置的语言。
TeamsSix
2022/09/20
6550
代码审计 | 表达式注入
代码审计 | 命令注入和代码注入
在开发过程中,开发人员可能需要对系统文件进行移动、删除或者执行一些系统命令,这时如果执行的命令用户可控,就会导致命令执行漏洞。
TeamsSix
2022/09/20
1.4K0
代码审计 | 命令注入和代码注入
java spel_SPEL表达式注入-入门篇
Spring Expression Language(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。语言语法类似于Unified EL,但提供了额外的功能,特别是方法调用和基本的字符串模板功能。同时因为SpEL是以API接口的形式创建的,所以允许将其集成到其他应用程序和框架中。
全栈程序员站长
2022/10/01
2.5K0
java spel_SPEL表达式注入-入门篇
Spring相关漏洞集合
上一篇说了Struct2的相关漏洞,这一篇就复现一下Spring相关的漏洞,关于spring产生的漏洞,其实他跟struct2都差不多,都是因为对用户的参数没有采用严格的控制,导致传入表达式而导致的,只不过struct2是OGNL,而spring是spel表达式造成的。(声明:本篇中的实列均在vulhub中完成)
Tommonkey
2023/03/20
1K0
Spring相关漏洞集合
Java代码审计基础之反射
参考了大佬的文章(参考文章在本文末尾 Referer 中),文章说 jdk1.4和 jdk1.5 处理调用的方法有区别
FB客服
2020/07/28
5070
Java Web安全之代码审计
信息安全的75%发生在Web应用而非网络层。本文内容主要以Java Web安全-代码审计为中心展开。
lyb-geek
2019/03/07
2.1K0
Java Web安全之代码审计
【Java 代码审计入门-05】RCE 漏洞原理与实际案例介绍
为什么会有这一些列的文章呢?因为我发现网上没有成系列的文章或者教程,基本上是 Java 代码审计中某个点来阐述的,对于新人来说可能不是那么友好,加上本人也在学习 Java 审计,想做个学习历程的记录和总结,因此有了本系列的文章。
p4nda
2023/01/03
1.8K0
【Java 代码审计入门-05】RCE 漏洞原理与实际案例介绍
基于字节码的Java代码审计
之前看了基于字节码的Java代码审计工具的实现,最近终于有空可以好好看一下其是如何实现的了。本文并不会从代码出发,而是试图从字节码角度分析其可行性。
JDArmy
2022/06/06
7850
基于字节码的Java代码审计
记一次 RCE 0day 的审计过程
大家好,我是 Sukali,首次在信安之路上投稿,并获得免费加入信安之路知识星球的机会,同时解锁了信安之路成长平台、文库以及 POC 管理系统的使用权限,今天来为大家分享一下自己挖掘的一个 RCE 0day 的审计过程。
信安之路
2025/03/20
750
记一次 RCE 0day 的审计过程
Java代码审计 -- 反射
Java 反射机制可以无视类方法、变量去访问权限修饰符(如protected、private 等),并且可以调用任何类的任意方法、访问并修改成员变量值。换而言之,在能够控制反射的类名、方法名和参数的前提下,如果我们发现一处 Java 反射调用漏洞,则攻击者几乎可以为所欲为
Gh0st1nTheShel
2022/01/19
5720
Java代码审计| Spring框架思路篇
相信小伙伴们通过Java代码审计入门篇对Java的环境和工具有了一定的了解,重点掌握了Tomcat部署使用、IDEA部署WEB项目与调试、Maven项目管理工具的使用。Java的WEB框架是Java进阶课程,当要进行Spring的漏洞分析,要有一定的Java代码知识储备。
漏斗社区
2018/07/26
2.5K0
Java代码审计| Spring框架思路篇
框架安全之Spring渗透
Spring框架是一个开放源代码的J2EE应用程序框架,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。
FB客服
2021/07/02
1.8K0
代码审计 | 模板注入
这里主要学习下 FreeMarker 模板注入,FreeMarker 是一款模板引擎,FreeMarker 模板文件与 HTML 一样都是静态页面,当用户访问页面时,FreeMarker 引擎会进行解析并动态替换模板中的内容进行渲染,然后将渲染后的结果返回到浏览器中。
TeamsSix
2022/09/20
1.3K0
代码审计 | 模板注入
Java代码审计之SpEL表达式注入
Spring Expression Language(简称 SpEL)是一种功能强大的表达式语言、用于在运行时查询和操作对象图;语法上类似于 Unified EL,但提供了更多的特性,特别是方法调用和基本字符串模板函数。SpEL 的诞生是为了给 Spring 社区提供一种能够与 Spring 生态系统所有产品无缝对接,能提供一站式支持的表达式语言。
FB客服
2019/05/09
2K0
Java代码审计之SpEL表达式注入
Spring Cloud Gateway远程代码执行漏洞(CVE-2022-22947)
- Spring Cloud Gateway远程代码执行漏洞(CVE-2022-22947) -
LuckySec
2022/11/15
7.6K0
Spring Cloud Gateway远程代码执行漏洞(CVE-2022-22947)
Spring Data Commons 远程命令执行漏洞
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令。
用户8478399
2022/09/22
5470
Spring Data Commons 远程命令执行漏洞
Spring实战3:装配bean的进阶知识主要内容:
在装配bean—依赖注入的本质一文中,我们探讨了Spring的三种管理bean的方式:自动装配、基于JavaConfig、基于XML文件。这篇文字将探讨一些Spring中关于bean的管理的高级知识,这些技能你可能不会每天都用,但是非常重要。
阿杜
2018/08/06
1.2K0
Spring实战3:装配bean的进阶知识主要内容:
【Java 代码审计入门-06】文件包含漏洞原理与实际案例介绍
为什么会有这一些列的文章呢?因为我发现网上没有成系列的文章或者教程,基本上是 Java 代码审计中某个点来阐述的,对于新人来说可能不是那么友好,加上本人也在学习 Java 审计,想做个学习历程的记录和总结,因此有了本系列的文章。
p4nda
2023/01/03
1.6K0
【Java 代码审计入门-06】文件包含漏洞原理与实际案例介绍
相关推荐
代码审计| Spring框架实例篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文