惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security @ Cisco Blogs
罗磊的独立博客
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
T
The Blog of Author Tim Ferriss
美团技术团队
T
Tailwind CSS Blog
博客园 - 三生石上(FineUI控件)
博客园 - Franky
G
Google Developers Blog
Jina AI
Jina AI
Stack Overflow Blog
Stack Overflow Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
Visual Studio Blog
腾讯CDC
S
SegmentFault 最新的问题
Recent Announcements
Recent Announcements
博客园 - 叶小钗
Microsoft Security Blog
Microsoft Security Blog
雷峰网
雷峰网
L
LangChain Blog
Vercel News
Vercel News
Forbes - Security
Forbes - Security
PCI Perspectives
PCI Perspectives
N
News | PayPal Newsroom
S
Security Affairs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 司徒正美
J
Java Code Geeks
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Hacker News: Ask HN
Hacker News: Ask HN
Schneier on Security
Schneier on Security
A
About on SuperTechFans
Attack and Defense Labs
Attack and Defense Labs
Google Online Security Blog
Google Online Security Blog
aimingoo的专栏
aimingoo的专栏
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
酷 壳 – CoolShell
酷 壳 – CoolShell
Cloudbric
Cloudbric
B
Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Proofpoint News Feed
D
DataBreaches.Net
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
B
Blog RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News and Events Feed by Topic

SumSec's Blog

AI Agent 工程的必然演进:CLI、Skills、Harne… 从安全角度谈Java反射机制--前章 · SUMSEC 从安全角度谈Java反射机制--终章 · SUMSEC 逆向学习fastjson反序列化始 · SUMSEC 2020年研究回顾总结 · SUMSEC Abstract syntax tree classes for … Analyzing data flow in Java · SUM… Annotations in Java · SUMSEC Basic query for Java code · SUMSEC BypassSuper使用介绍说明 · SUMSEC CodeQL Create OpenJdk/Jdk8 Databa… CodeQL library for Java · SUMSEC Navigating the call graph · SUMSEC Overflow-prone comparisons in Jav… Types in Java · SUMSEC Working with source locations · S… Aliases · SUMSEC Expression · SUMSEC Formulas · SUMSEC Javadoc · SUMSEC Modules · SUMSEC Predicates · SUMSEC Queries · SUMSEC Type · SUMSEC Variables · SUMSEC 一道shiro反序列化题目引发的思考 · SUMSEC 修改ysoserial使其支持任意代码执行 · SUMSEC 自定义 ClassLoader 隔离运行不同版本jar包的方式 ·… 2020网鼎杯---Java文件上传wp · SUMSEC CNVD-2020-10487(CVE-2020-1938)tom… JDSRC安全课笔记 · SUMSEC Java反序列化链回显解决方案 · SUMSEC Skipped breakpoint because it hap… Windows Terminal 配置文件 · SUMSEC bypass 学习笔记之绕安全狗bypass safedog · … 一次意外的代码审计----JfinalCMS审计 · SUMSEC 一篇文章读懂Java代码审计之XXE · SUMSEC 小楼昨夜又春风,你知ysoserial-Gadget-URLDNS… 春眠不觉晓,RCE知多少? · SUMSEC 漫谈Commons-Collections反序列化 · SUMSEC 漫谈Java反序列化 · SUMSEC 白头搔更短,SSTI惹人心! · SUMSEC 记一次面试题 · SUMSEC About Me 关于我 · SUMSEC Apache Flink任意Jar包上传导致远程代码执行 · SU… CVE-2019-1388 UAC提权复现 · SUMSEC CVE-2019-16097 || Harbor任意管理员注册漏洞… Python加密shellcode免杀 · SUMSEC Telegram机器人作为渗透测试框架 · SUMSEC VM虚拟机无法安装vmtools解决|本程序需要您将此虚拟机上安装… 谁能想到,电视遥控器竟成了 Vibe Coding 神器 · SU… 从手改 Skill 到自动进化:评测结果和执行轨迹如何让 Agen… 模型人人都能用,什么才是你能带走的?我的答案是一个可进化的SKIL… 模型人人都能用,什么才是你能带走的?我的答案是一个可进化的Skil… AI 时代 ShiroAttack2 5.x:修改了什么 · SU… 在 AGI 降临前,先给 AI 开一条”脑内弹幕”通道 · SUM… 一篇博文,三种时间:网页幻灯与 Remotion 动效的交付逻辑 … 🔍 别让大模型”想太多”:SKILL开发中的语义陷阱与抗幻觉设计 … 2022 年年度总结 · SUMSEC Java Swing To RCE 漏洞分析 · SUMSEC SpringBoot GatewayEL表达式漏洞分析 · SUM… Sensitive keys in codebases · SUM… 论如何优雅注入 Java 内存马 · SUMSEC SUMSEC 知识点 · SUMSEC VMWare Workspace ONE Access Auth … Spring Framework RCE CVE-2022-229… 相似度算法调研 · SUMSEC CVE-2022-33891 Apache Spark shell… 正则匹配配置不当 · SUMSEC Spring Data MongoDB SpEL CVE-2022… CodeQl Usage Tricks · SUMSEC Spring Boot RCE到内存马探索 · SUMSEC Shiro后渗透拓展面 · SUMSEC shiro反序列化漏洞攻击拓展面–修改key · SUMSEC GitHub Java CodeQL CTF · SUMSEC Hack-Tools 转化成Web · SUMSEC CodeQL与Shiro550碰撞 · SUMSEC CodeQL初见Shiro550 · SUMSEC CodeQL与AST之间联系 · SUMSEC Java加载动态链接库 · SUMSEC Log4j2 漏洞分析 · SUMSEC Interprocedural-Analysis 过程间分析 · … Data Analysis Foundation 数据分析基础 ·… Data Flow Analysis · SUMSEC Intermediate Representation 中间代表(… PII泄露–用CodeQL识别日志中的PII数据 · SUMSEC CodeQL workshop for Java: Unsafe … 前言 · SUMSEC 漏洞环境的搭建 · SUMSEC Fastjson回显 · SUMSEC Tomcat通用回显学习笔记 · SUMSEC 从Java反序列化漏洞题看CodeQL数据流 · SUMSEC 概述 · SUMSEC 记一次Log4j失败的Gadget挖掘记录 · SUMSEC Ysoserial改造记录 · SUMSEC JNDI注入 · SUMSEC shiro JRMP gadget · SUMSEC Fastjson MySQL gadget复现 · SUMSEC 2021年度总结 · SUMSEC
从安全角度谈Java反射机制--序章 · SUMSEC
2026-07-17 · via SumSec's Blog

从安全角度谈Java反射机制–序章

前言

首发:https://www.sec-in.com/article/307
   众所周知,Java目前影响最大的是反序列化漏洞,换一句话说Java安全是从反序列化漏洞开始,但反序列化漏洞又可以基于反射,这次笔者带你走进Java安全的大门。
   Java反序列化的payload大多与反射机制密切相关,但仅仅是因为这个吗?答案肯定是片面的。反射作为大多数编程语言里必不可缺的组成部分,对象可以通过反射获取其他的类,类可以通过反射拿到所有的方法(包括私有方法),获取到方法可以调用。一句话,反射给Java等类似的静态语言赋予了“灵魂”

ps: 本文实验代码都上传JavaLearnVulnerability项目,为了让更多人知道,麻烦动动小手star一下。


反射基础

   Java反射操作的对象是java.lang.Class对象,如果想要使用Java反射,首先得获取Class对象。下面我们看一段代码。

public static void main(String[] args) throws Exception {
	Class cls = Class.forName(className);
	cls.getMethod(methodName).invoke(cls.newInstance());
}

示例代码中,笔者演示几个比较重要的方法:

  • 获取类对象的方法forName
  • 从获取类对象中获取方法 getMethod
  • 执行得到获取的方法的方法invoke
  • 实例化对象newInstance

ps:当然反射不可能仅仅只是这些方法,下面中笔者有提及其他的方法,当然不可能是全部都一一道来,正所谓授之与鱼,不如授之于渔。更多方法建议大家去看JDK文档,在线的文档百度一搜就有。


类源码

   首先笔者构造了两个类studentsclassdemo1


实体类students源码:

public class Students {
    private Integer age = 18;
    private String name = "samny";
    private Integer CardId = 332323223;
    private Integer id = 10012;
    private String hello = "hello world";

    public Students(Integer age, String name, Integer cardId, Integer id, String hello) {
        this.age = age;
        this.name = name;
        this.CardId = cardId;
        this.id = id;
        this.hello = hello;

    }

    @Override
    public String toString() {
        return "Students{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", CardId=" + CardId +
                ", id=" + id +
                ", ags='" + hello + '\'' +
                '}';
    }

    public Students() {

    }

    public Integer getAge() {
        return age;
    }
	// 以下省略set,get以及toString方法。
    
}

实体类classdemo1的源码:

public class classdemo1 {
    private  String  name;
    public void print(){
        System.out.println("parameterlessMethod:hello");

    }
    public void print2(String name){
        System.out.println( "parameterMethod: hello" + name);
    }
}

反射方法获取Students类。

实例化所需要的类集合 Class[] classes = new Class[]{Integer.class,String.class,Integer.class,Integer.class,String.class};
通过构造器构造类Constructor constructor = cls.getDeclaredConstructor(classes);
通过调用有参构造器实例化类Object str = constructor.newInstance(18, “samny”, 32326663, 10021, “hello!!”);

public static void reflectmethod1(){
        try {

            // 获取对象

            Class cls = Class.forName("samny.reflection.Students");

//            // 获取构造器方法
            Class[] classes = new Class[]{Integer.class,String.class,
                    Integer.class,Integer.class,String.class};
            Constructor constructor = cls.getDeclaredConstructor(classes);

            Object str = constructor.newInstance(18, "samny", 32326663, 10021, "hello!!");
            System.out.println(str);
            // 或者下面这样子输出
//            System.out.println(constructor.newInstance(18, "samny", 32326663, 10021, "hello!!"));

        } catch (ClassNotFoundException | NoSuchMethodException |
                IllegalAccessException | InstantiationException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }

常规开发人员实例化类构造类demo

public static void Sts(){
        Students students = new Students();
        students.setAge(18);
        students.setName("samny");
        students.setCardId(32336666);
        students.setId(1001);
        students.setAgs("helloooo!!");
        System.out.println(students.toString());
    }

对比一下效果是没有任何的区别,但反射操作只需要知道类名就可以完全操作类甚至是类中的私有方法之后文章会详细说明,本文不做说明。
在这里插入图片描述


反射调用类中的无参和有参方法。

之前说过的知识就不在说明
开头就说了,invoke是执行获取类得到方法的方法
但调用有参方法和无参方法有点细微的差别
getMethod方法的第一个参数是类方法名称,第二个是类对象。这里先留个疑问,如果是多个类对象呢?
invoke函数的第一个参数是实例化的类对象,第二个是参数值
常规方法的调用,直接Class.method()即可

public static void reflectmethod2(){
        try {
            Class  cls = Class.forName("samny.reflection.classdemo1");
            // 无参方法调用
            Object ob = cls.newInstance();
//            Method mt = cls.getMethod("print"); 有没有null均可
            Method mt = cls.getMethod("print",null);
            mt.invoke(ob,null);
            // 有参方法调用
            Method mt2 = cls.getMethod("print2", String.class);
            mt2.invoke(ob,"world");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述



参考

P神-Java安全漫谈-反射篇