freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

JAVA安全 | 初探反射反序列化
prophet 2024-12-26 19:41:34 96802
所属地 山西省

引言

致力于用最简单的话语,去方法师傅们的学习,开设 java安全的学习板块 。

本篇文章分为三个板块,反射与反序列化的学习,以及urldns链条的跟踪原理。

反射 

当我们创建一个新对象时,用idea快捷键Ctrl+p就可以直接看到我们构造对象所需要的形参,这时候我们就不禁思考,为什么能够直接看到的?

其实这里的就是调用了反射,获取方法的参数并且将其反馈到我们的屏幕上。

1735191239_676ceac7143d91c7ea7a6.png!small?1735191238728

反射首先需要获取class文件,以下为最常见的三种获取class文件的方法。


  • Class.forName(全类名)    //源代码阶段   
  • 类名.class                        //加载阶段 
  • 对象.getClass()                //运行阶段

通过获取其字节码文件便可调用其中的方法。

getConstructor()                       获取某种构造方法

getConstructors()                      获取所有公共构造方法

getDclaredConstructors()         获取所有构造方法包括私有

getParameter()                          获取某个参数变量

getParameters()                        获取所有参数变量

getFiled()                                  获取某个成员属性

getFileds()                                获取所有成员属性

getDclaredFileds()                    获取所有包括私有成员属性

getMethod()                             获取所有公共方法包括父类

getDclaredMethod()                 获取所有方法包括私有除父类

invoke(对象 ,参数)                 执行方法

这里还有反射的newInsatnce方法,这个作用就跟new的作用一样,正如他的意思新的实例,两个本质上的区别就是newInsatnce调用需要先加载这个类的字节码文件,而new不需要。

案例

此处举一个代码示例方便理解

import java.lang.reflect.Field;

public class SerializeTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {

Class<?> aClass = Class.forName("com.zyf.User");

Field name = aClass.getDeclaredField("name");
name.setAccessible(true);
//这里的setAccessible相当于给了临时访问私有成员的权限

User u = new User("张三", 18);
Object o = name.get(u);
//获取u对象中的name成员值
System.out.println(o);

name.set(u,"李四");
//将u的name成员值重新设置为李四
System.out.println(u.getName());


Method s = aClass.getDeclaredMethod("sing", String.class);
s.setAccessible(true);
//同理,具有访问私有方法的临时权限

User user = new User();
s.invoke(user,"奇迹再现");
//触发sing方法
}
}

1735197815_676d0477b96ede0484f9d.png!small?1735197815480

1735198805_676d08559b2488d2ef562.png!small?1735198807575

可以看到成功执行

可试读前30%内容
¥ 19.9 全文查看
9.9元开通FVIP会员
畅读付费文章
最低0.3元/天
# web安全 # 漏洞分析
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 prophet 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
prophet LV.1
安全路上的爱好者
  • 4 文章数
  • 8 关注者
JAVA安全-cc2分析(进阶篇)
2024-12-31
JAVA安全--cc1学习(新手可阅)
2024-12-28
一文带你迅速了解代码审计——bluecms
2024-12-16
文章目录