思维导图
见 22安全开发
知识点:
- 32、JavaEE-反射机制-开发和安全应用场景
- 33、JavaEE-反射机制-类&成员变量&方法&构造方法操作
- 34、JavaEE-反射机制-安全应用&反射执行&反序列化链相关
章节点
- 1、PHP:
功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
安全:原生PHP开发安全,模版引用安全,第三方插件安全,TP框架安全等 - 2、JS:
功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等
技术:原生开发,DOM,常见库使用,框架开发(Vue,NodeJS),打包器(Webpack)等
安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等 - 3、Java:
功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
安全:原生开发安全,第三方框架安全,第三方库安全等,待补充
Java反射
1、什么是Java反射
参考:https://xz.aliyun.com/t/9117
Java提供了一套反射API,该API由Class类与java.lang.reflect类库组成。
该类库包含了Field、Method、Constructor等类。
对成员变量,成员方法和构造方法的信息进行的编程操作可以理解为反射机制。2、为什么要用到反射
参考:https://xz.aliyun.com/t/9117
其实从官方定义中就能找到其存在的价值,在运行时获得程序或程序集中每一个类型的成员和成员的信息,从而动态的创建、修改、调用、获取其属性,而不需要事先知道运行的对象是谁。划重点:在运行时而不是编译时。(不改变原有代码逻辑,自行运行的时候动态创建和编译即可)3、反射机制应用
开发应用场景:
Spring框架的IOC基于反射创建对象和设置依赖属性。
SpringMVC的请求调用对应方法,也是通过反射。
JDBC的Class#forName(String className)方法,也是使用反射。4、安全应用场景:
构造利用链,触发命令执行
反序列化中的利用链构造
动态获取或执行任意类中的属性或方法
动态代理的底层原理是反射技术
rmi反序列化也涉及到反射操作
Java-反射-Class对象类获取
1 | //1、根据类名:类名.class |
Java-反射-Field成员变量类获取
1 | Class aClass = Class.forName("com.example.reflectdemo.User"); |
Java-反射-Method成员方法类获取
1 | Class aClass = Class.forName("com.example.reflectdemo.User"); |
Java-反射-Constructor构造方法类获取
1 | Class aClass = Class.forName("com.example.reflectdemo.User"); |
Java-反射-不安全命令执行&反序列化链构造
1、反射实现-命令执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17-原型:
Runtime.getRuntime().exec("calc");
-反射:
Class aClass = Class.forName("java.lang.Runtime");
Method[] methods = aClass.getMethods();
for (Method me:methods){
System.out.println(me);
}
Method exec = aClass.getMethod("exec", String.class);
Method getRuntimeMethod = aClass.getMethod("getRuntime");
Object runtime = getRuntimeMethod.invoke(aClass);
exec.invoke(runtime, "calc.exe");
Class c1= Class.forName("java.lang.Runtime");
Constructor m = c1.getDeclaredConstructor();
m.setAccessible(true);
c1.getMethod("exec", String.class).invoke(m.newInstance(), "calc");2、不安全的反射对象
指应用程序使用具有反射功能的外部输入来选择要使用的类或代码,
可能被攻击者利用而输入或选择不正确的类。绕过身份验证或访问控制检查
参考分析:https://zhuanlan.zhihu.com/p/165273855
利用结合:https://xz.aliyun.com/t/7031(反序列化利用链)