Skip to content

Commit 31f5170

Browse files
committed
add deserialize
1 parent cc99e47 commit 31f5170

File tree

4 files changed

+91
-22
lines changed

4 files changed

+91
-22
lines changed

java-sec-code.iml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
</configuration>
1313
</facet>
1414
</component>
15-
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6">
15+
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
1616
<output url="file://$MODULE_DIR$/target/classes" />
1717
<output-test url="file://$MODULE_DIR$/target/test-classes" />
1818
<content url="file://$MODULE_DIR$">
Lines changed: 84 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,99 @@
11
package org.joychou.controller;
22

3-
4-
import org.springframework.stereotype.Controller;
3+
import org.apache.commons.lang.StringUtils;
4+
import org.joychou.security.AntObjectInputStream;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
57
import org.springframework.web.bind.annotation.RequestMapping;
6-
import org.springframework.web.bind.annotation.ResponseBody;
8+
import org.springframework.web.bind.annotation.RestController;
79

10+
import javax.servlet.http.Cookie;
811
import javax.servlet.http.HttpServletRequest;
9-
import java.io.InputStream;
12+
import java.io.ByteArrayInputStream;
13+
import java.io.IOException;
1014
import java.io.ObjectInputStream;
15+
import java.util.Base64;
1116

1217
/**
13-
* @author JoyChou ([email protected])
14-
* @Date 2018年06月14日
15-
* @Desc 该应用必须有Commons-Collections包才能利用反序列化命令执行。
18+
* Deserialize RCE using Commons-Collections gadget.
19+
*
20+
* @author JoyChou @2018-06-14
1621
*/
17-
18-
@Controller
22+
@RestController
1923
@RequestMapping("/deserialize")
2024
public class Deserialize {
2125

22-
@RequestMapping("/test")
23-
@ResponseBody
24-
public static String deserialize_test(HttpServletRequest request) throws Exception{
25-
try {
26-
InputStream iii = request.getInputStream();
27-
ObjectInputStream in = new ObjectInputStream(iii);
28-
in.readObject(); // 触发漏洞
29-
in.close();
30-
return "test";
31-
}catch (Exception e){
32-
return "exception";
26+
27+
private static Logger logger= LoggerFactory.getLogger(Deserialize.class);
28+
29+
/**
30+
* java -jar ysoserial.jar CommonsCollections5 "open -a Calculator" | base64
31+
* Add the result to rememberMe cookie.
32+
*
33+
* http://localhost:8080/deserialize/rememberMe/vul
34+
*/
35+
@RequestMapping("/rememberMe/vul")
36+
public static String rememberMeVul(HttpServletRequest request)
37+
throws IOException, ClassNotFoundException {
38+
39+
Cookie[] cookies = request.getCookies();
40+
String rememberMe = "";
41+
42+
if (null == cookies) {
43+
logger.info("No cookies.");
44+
} else {
45+
for (Cookie cookie : cookies) {
46+
if ( cookie.getName().equals("rememberMe") ) {
47+
rememberMe = cookie.getValue();
48+
}
49+
}
50+
}
51+
52+
if (StringUtils.isBlank(rememberMe) ) {
53+
return "No rememberMe cookie. Right?";
3354
}
55+
56+
byte[] decoded = Base64.getDecoder().decode(rememberMe);
57+
ByteArrayInputStream bytes = new ByteArrayInputStream(decoded);
58+
ObjectInputStream in = new ObjectInputStream(bytes);
59+
in.readObject();
60+
in.close();
61+
62+
return "Are u ok?";
63+
}
64+
65+
/**
66+
* Check deserialize class using black list.
67+
*
68+
* http://localhost:8080/deserialize/rememberMe/security
69+
*/
70+
@RequestMapping("/rememberMe/security")
71+
public static String rememberMeBlackClassCheck(HttpServletRequest request)
72+
throws IOException, ClassNotFoundException {
73+
74+
Cookie[] cookies = request.getCookies();
75+
String rememberMe = "";
76+
77+
if (null == cookies) {
78+
logger.info("No cookies in /rememberMe/security");
79+
} else {
80+
for (Cookie cookie : cookies) {
81+
if ( cookie.getName().equals("rememberMe") ) {
82+
rememberMe = cookie.getValue();
83+
}
84+
}
85+
}
86+
87+
if (StringUtils.isBlank(rememberMe) ) {
88+
return "No rememberMe cookie. Right?";
89+
}
90+
91+
byte[] decoded = Base64.getDecoder().decode(rememberMe);
92+
ByteArrayInputStream bytes = new ByteArrayInputStream(decoded);
93+
AntObjectInputStream in = new AntObjectInputStream(bytes);
94+
in.readObject();
95+
in.close();
96+
97+
return "I'm very OK.";
3498
}
3599
}

src/main/java/org/joychou/controller/SSRF.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ public static String ssrf_Request(HttpServletRequest request)
103103
* Download the url file.
104104
* http://localhost:8080/ssrf/openStream?url=file:///etc/passwd
105105
*
106+
* new URL(String url).openConnection()
107+
* new URL(String url).openStream()
108+
* new URL(String url).getContent()
106109
*/
107110
@RequestMapping("/openStream")
108111
@ResponseBody

src/main/java/org/joychou/security/AntObjectInputStream.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ protected Class<?> resolveClass(final ObjectStreamClass desc)
3636
// Deserialize class name: org.joychou.security.AntObjectInputStream$MyObject
3737
logger.info("Deserialize class name: " + className);
3838

39-
String[] denyClasses = {"java.net.InetAddress", "org.apache.commons.collections.Transformer"};
39+
String[] denyClasses = {"java.net.InetAddress",
40+
"org.apache.commons.collections.Transformer",
41+
"org.apache.commons.collections.functors"};
4042

4143
for (String denyClass : denyClasses) {
4244
if (className.startsWith(denyClass)) {

0 commit comments

Comments
 (0)