特性动态语言是什么意思/特性动态语言是指-小白网安指南
在java高版本,如何使用动态语言特性。什么是动态语言特性
动态语言特性,可以在代码执行的过程中根据输入来改变代码的执行逻辑,甚至是调用的方法。
例如在php中,有如下代码
<?php
class Pig {
public function call() {
echo "hengheng";
}
}
class Dog {
public function call() {
echo "wangwang";
}
}
// 检查 GET 请求中是否有 'animal' 参数
if (isset($_GET['animal'])) {
$className = ucfirst(strtolower($_GET['animal'])); // 将首字母大写,其余小写
// 使用类名字符串来创建对象
if (class_exists($className)) {
$animal = new $className();
$animal->call();
} else {
echo "Unknown animal type";
}
} else {
echo "No animal type specified";
}
?>
我们可以看到,在这段代码中,我们直接利用GET获得到的字符串来改变了方法的调用。但在java中,我们无法如此自由的去动态执行。
为解决动态执行的问题,我们可以使用反射的方式。
java中的反射
java中的反射从底层原理来说还比较复杂。甚至要了解到klass与jvm堆栈问题。暂且不表。在低版本jdk中,我们可以通过反射获取任意类、接口、方法、属性等。无论他是否是私有的。同上,利用反射我们也可以动态执行一些代码。
测试类如下
package com.bilisheep;
public class Test {
private static String string = "Class Name is test";
public static void getString() {
System.out.println(string);
}
@Override
public String toString() {
return "Test{" +
"string='" + string + ''' +
'}';
}
}
class Test1{
private static String string = "Class Name is test1";
public static void getString() {
System.out.println(string);
}
@Override
public String toString() {
return "Test1{" +
"string='" + string + ''' +
'}';
}
}
利用反射动态执行
package com.bilisheep;
import org.springframework.cglib.core.ReflectUtils;
import java.lang.reflect.Method;
import java.util.Base64;
public class Main{
public static void main(String[] args) throws Exception {
String aClass = "com.bilisheep.Test";
Class<?> aClass1 = Class.forName(aClass);
Method getString = aClass1.getMethod("getString", null);
getString.invoke(null,null);
}
}
在很多常用的链子和漏洞利用中,我们都需要用到反射来进行更改。有些私有变量也需要利用反射来设置值。
但在高版本的jdk中,出现了以下策略,对反射进行了限制
高版本jdk限制封闭性检查:增加了对定义类的封闭性()的检查。这意味着当一个类(或接口)被定义时,必须确保它的封闭类(如果有的话)也是由同一个类加载器加载的。这是为了确保类加载器的封闭性不被破坏,从而增强安全性。访问控制:加强了对类定义时访问控制的检查。例如,如果一个类试图访问某些受保护的成员或其他受限资源,这些访问请求必须通过 Java 的访问控制检查。模块化:随着 Java 模块系统的引入,对模块边界的保护也更加严格。 必须确保类的定义不会违反模块规则,比如一个非公开的类不能被不同模块的代码访问。
这使得我们无法通过反射来修改一个不在同一模块中的私有属性
为解决这些问题,我们可以使用.
.
和传统的反射 API (如 java.lang.)都提供了在 Java 中执行动态代码调用的能力,但它们在设计理念、性能、使用方式以及适用场景方面有着显著的不同。下面是一些关键的区别:
设计和性能类型检查和安全性语法和易用性访问权限和安全模型应用场景
我们最常使用的是,.#,他可以根据我们的限制条件执行对应的私有方法。
public class ExampleClass {
private int privateInt = 1;
public int getPrivateInt() {
return privateInt;
}
}
public class Main {
public static void main(String[] args) throws Throwable {
ExampleClass example = new ExampleClass();
// 打印修改前的值
System.out.println("Before: " + example.getPrivateInt());
// 获取 Lookup 对象
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(ExampleClass.class, MethodHandles.lookup());
// 获取 VarHandle
VarHandle varHandle = lookup.findVarHandle(ExampleClass.class, "privateInt", int.class);
// 修改私有变量的值
varHandle.set(example, 123);
// 打印修改后的值
System.out.println("After: " + example.getPrivateInt());
}
}
public class ExampleClass {
private void privateMethod() {
System.out.println("Private method is called!");
}
}
public class Main {
public static void main(String[] args) throws Throwable {
ExampleClass example = new ExampleClass();
// 获取 Lookup 对象
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(ExampleClass.class, MethodHandles.lookup());
// 获取 MethodHandle
MethodHandle methodHandle = lookup.findSpecial(ExampleClass.class, "privateMethod", MethodType.methodType(void.class), ExampleClass.class);
// 调用私有方法
methodHandle.invoke(example);
}
}
网络安全学习路线图(思维导图)
网络安全学习路线图可以是一个有助于你规划学习进程的工具。你可以在思维导图上列出不同的主题和技能,然后按照逻辑顺序逐步学习和掌握它们。这可以帮助你更清晰地了解自己的学习进展和下一步计划。
1. 网络安全视频资料
2. 网络安全笔记/面试题
3. 网安电子书PDF资料
~