Skip to content

Commit 467b74f

Browse files
committed
add docker env & add xtream rce vuln
1 parent a0e66f2 commit 467b74f

File tree

16 files changed

+217
-70
lines changed

16 files changed

+217
-70
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@
22
.DS_Store
33
target/
44
other-vuls/
5+
docker/
6+
poc/
7+
src/main/java/org/joychou/test/
58
*.iml

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,33 @@ Sort by letter.
5656

5757
## How to run
5858

59-
The application will use mybatis auto-injection. Please run mysql server ahead of time and configure the mysql server database's name and username/password.
59+
The application will use mybatis auto-injection. Please run mysql server ahead of time and configure the mysql server database's name and username/password except docker environment.
6060

6161
```
6262
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/java_sec_code
6363
spring.datasource.username=root
6464
spring.datasource.password=woshishujukumima
6565
```
6666

67+
- Docker
6768
- IDEA
6869
- Tomcat
6970
- JAR
7071

72+
### Docker
73+
74+
75+
76+
```
77+
docker-compose up
78+
```
79+
80+
Docker's environment:
81+
82+
- Java 1.8.0_102
83+
- Mysql 8.0.17
84+
- Tomcat 8.5.11
85+
7186

7287
### IDEA
7388

README_zh.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,30 @@
5454

5555
## 如何运行
5656

57-
应用会用到mybatis自动注入,请提前运行mysql服务,并且配置mysql服务的数据库名称和用户名密码。
57+
应用会用到mybatis自动注入,请提前运行mysql服务,并且配置mysql服务的数据库名称和用户名密码(除非是Docker环境)
5858

5959
```
6060
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/java_sec_code
6161
spring.datasource.username=root
6262
spring.datasource.password=woshishujukumima
6363
```
6464

65+
- Docker
6566
- IDEA
6667
- Tomcat
6768
- JAR
6869

70+
### Docker
6971

72+
```
73+
docker-compose up
74+
```
75+
76+
Docker环境:
77+
78+
- Java 1.8.0_102
79+
- Mysql 8.0.17
80+
- Tomcat 8.5.11
7081

7182
### IDEA
7283

docker-compose.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
version : '2'
2+
services:
3+
jsc:
4+
image: joychou/jsc:1.0
5+
ports:
6+
- "8080:8080"
7+
links:
8+
- j_mysql
9+
10+
j_mysql:
11+
image: joychou/jsc_mysql:1.0
12+
ports:
13+
- "3306:3306"

java-sec-code.iml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,6 @@
155155
<orderEntry type="library" scope="RUNTIME" name="Maven: com.netflix.netflix-commons:netflix-statistics:0.1.1" level="project" />
156156
<orderEntry type="library" name="Maven: io.reactivex:rxjava:1.1.10" level="project" />
157157
<orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon-eureka:2.2.0" level="project" />
158-
<orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.4.9" level="project" />
159-
<orderEntry type="library" name="Maven: xmlpull:xmlpull:1.1.3.1" level="project" />
160-
<orderEntry type="library" name="Maven: xpp3:xpp3_min:1.1.4c" level="project" />
161158
<orderEntry type="library" name="Maven: com.fasterxml.uuid:java-uuid-generator:3.1.4" level="project" />
162159
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-web:4.2.12.RELEASE" level="project" />
163160
<orderEntry type="library" name="Maven: aopalliance:aopalliance:1.0" level="project" />
@@ -181,5 +178,8 @@
181178
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
182179
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
183180
<orderEntry type="library" name="Maven: org.apache.velocity:velocity:1.7" level="project" />
181+
<orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.4.10" level="project" />
182+
<orderEntry type="library" name="Maven: xmlpull:xmlpull:1.1.3.1" level="project" />
183+
<orderEntry type="library" name="Maven: xpp3:xpp3_min:1.1.4c" level="project" />
184184
</component>
185185
</module>

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,13 @@
189189
<version>1.7</version>
190190
</dependency>
191191

192+
<!-- rce -->
193+
<dependency>
194+
<groupId>com.thoughtworks.xstream</groupId>
195+
<artifactId>xstream</artifactId>
196+
<version>1.4.10</version>
197+
</dependency>
198+
192199
</dependencies>
193200

194201
<dependencyManagement>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.joychou.controller;
2+
3+
import com.thoughtworks.xstream.XStream;
4+
import com.thoughtworks.xstream.io.xml.DomDriver;
5+
import org.joychou.dao.User;
6+
import org.joychou.utils.Tools;
7+
import org.springframework.web.bind.annotation.PostMapping;
8+
import org.springframework.web.bind.annotation.RestController;
9+
10+
import javax.servlet.http.HttpServletRequest;
11+
12+
13+
@RestController
14+
public class XStreamRce {
15+
16+
/**
17+
* Fix method: update xstream to 1.4.11
18+
* Xstream affected version: 1.4.10 or <= 1.4.6
19+
* Set Content-Type: application/xml
20+
*
21+
* @author JoyChou @2019-07-26
22+
*/
23+
@PostMapping("/xstream")
24+
public String parseXml(HttpServletRequest request) throws Exception{
25+
String xml = Tools.getBody(request);
26+
XStream xstream = new XStream(new DomDriver());
27+
xstream.fromXML(xml);
28+
return "xstream";
29+
}
30+
31+
public static void main(String[] args) throws Exception {
32+
User user = new User();
33+
user.setId(0);
34+
user.setUsername("admin");
35+
36+
XStream xstream = new XStream(new DomDriver());
37+
String xml = xstream.toXML(user); // Serialize
38+
System.out.println(xml);
39+
40+
user = (User)xstream.fromXML(xml); // Deserialize
41+
System.out.println(user.getId() + ": " + user.getUsername() );
42+
}
43+
}

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

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@
1212
import org.xml.sax.XMLReader;
1313
import java.io.*;
1414
import org.xml.sax.InputSource;
15+
1516
import javax.xml.parsers.DocumentBuilder;
1617
import javax.xml.parsers.DocumentBuilderFactory;
1718
import javax.xml.parsers.SAXParserFactory;
1819
import javax.xml.parsers.SAXParser;
1920
import org.xml.sax.helpers.DefaultHandler;
2021
import org.apache.commons.digester3.Digester;
2122
import org.jdom2.input.SAXBuilder;
22-
23+
import org.joychou.utils.Tools;
2324

2425
/**
2526
* Java xxe vul and safe code.
@@ -33,9 +34,9 @@ public class XXE {
3334

3435
@RequestMapping(value = "/xmlReader", method = RequestMethod.POST)
3536
@ResponseBody
36-
public String xxe_xmlReader(HttpServletRequest request) {
37+
public String xxe_xmlReader(HttpServletRequest request) {
3738
try {
38-
String xml_con = getBody(request);
39+
String xml_con = Tools.getBody(request);
3940
System.out.println(xml_con);
4041
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
4142
xmlReader.parse( new InputSource(new StringReader(xml_con)) ); // parse xml
@@ -51,7 +52,7 @@ public String xxe_xmlReader(HttpServletRequest request) {
5152
@ResponseBody
5253
public String xxe_xmlReader_fix(HttpServletRequest request) {
5354
try {
54-
String xml_con = getBody(request);
55+
String xml_con = Tools.getBody(request);
5556
System.out.println(xml_con);
5657

5758
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
@@ -74,7 +75,7 @@ public String xxe_xmlReader_fix(HttpServletRequest request) {
7475
@ResponseBody
7576
public String xxe_SAXBuilder(HttpServletRequest request) {
7677
try {
77-
String xml_con = getBody(request);
78+
String xml_con = Tools.getBody(request);
7879
System.out.println(xml_con);
7980

8081
SAXBuilder builder = new SAXBuilder();
@@ -90,7 +91,7 @@ public String xxe_SAXBuilder(HttpServletRequest request) {
9091
@ResponseBody
9192
public String xxe_SAXBuilder_fix(HttpServletRequest request) {
9293
try {
93-
String xml_con = getBody(request);
94+
String xml_con = Tools.getBody(request);
9495
System.out.println(xml_con);
9596

9697
SAXBuilder builder = new SAXBuilder();
@@ -109,7 +110,7 @@ public String xxe_SAXBuilder_fix(HttpServletRequest request) {
109110
@ResponseBody
110111
public String xxe_SAXReader(HttpServletRequest request) {
111112
try {
112-
String xml_con = getBody(request);
113+
String xml_con = Tools.getBody(request);
113114
System.out.println(xml_con);
114115

115116
SAXReader reader = new SAXReader();
@@ -126,7 +127,7 @@ public String xxe_SAXReader(HttpServletRequest request) {
126127
@ResponseBody
127128
public String xxe_SAXReader_fix(HttpServletRequest request) {
128129
try {
129-
String xml_con = getBody(request);
130+
String xml_con = Tools.getBody(request);
130131
System.out.println(xml_con);
131132

132133
SAXReader reader = new SAXReader();
@@ -146,7 +147,7 @@ public String xxe_SAXReader_fix(HttpServletRequest request) {
146147
@ResponseBody
147148
public String xxe_SAXParser(HttpServletRequest request) {
148149
try {
149-
String xml_con = getBody(request);
150+
String xml_con = Tools.getBody(request);
150151
System.out.println(xml_con);
151152

152153
SAXParserFactory spf = SAXParserFactory.newInstance();
@@ -165,7 +166,7 @@ public String xxe_SAXParser(HttpServletRequest request) {
165166
@ResponseBody
166167
public String xxe_SAXParser_fix(HttpServletRequest request) {
167168
try {
168-
String xml_con = getBody(request);
169+
String xml_con = Tools.getBody(request);
169170
System.out.println(xml_con);
170171

171172
SAXParserFactory spf = SAXParserFactory.newInstance();
@@ -186,7 +187,7 @@ public String xxe_SAXParser_fix(HttpServletRequest request) {
186187
@ResponseBody
187188
public String xxe_Digester(HttpServletRequest request) {
188189
try {
189-
String xml_con = getBody(request);
190+
String xml_con = Tools.getBody(request);
190191
System.out.println(xml_con);
191192

192193
Digester digester = new Digester();
@@ -203,7 +204,7 @@ public String xxe_Digester(HttpServletRequest request) {
203204
@ResponseBody
204205
public String xxe_Digester_fix(HttpServletRequest request) {
205206
try {
206-
String xml_con = getBody(request);
207+
String xml_con = Tools.getBody(request);
207208
System.out.println(xml_con);
208209

209210
Digester digester = new Digester();
@@ -225,7 +226,7 @@ public String xxe_Digester_fix(HttpServletRequest request) {
225226
@ResponseBody
226227
public String xxeDocumentBuilderReturn(HttpServletRequest request) {
227228
try {
228-
String xml_con = getBody(request);
229+
String xml_con = Tools.getBody(request);
229230
System.out.println(xml_con);
230231

231232
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
@@ -259,7 +260,7 @@ public String xxeDocumentBuilderReturn(HttpServletRequest request) {
259260
@ResponseBody
260261
public String DocumentBuilder(HttpServletRequest request) {
261262
try {
262-
String xml_con = getBody(request);
263+
String xml_con = Tools.getBody(request);
263264
System.out.println(xml_con);
264265

265266
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
@@ -296,7 +297,7 @@ public String DocumentBuilder(HttpServletRequest request) {
296297
@ResponseBody
297298
public String xxe_DocumentBuilder_fix(HttpServletRequest request) {
298299
try {
299-
String xml_con = getBody(request);
300+
String xml_con = Tools.getBody(request);
300301
System.out.println(xml_con);
301302

302303
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
@@ -321,7 +322,7 @@ public String xxe_DocumentBuilder_fix(HttpServletRequest request) {
321322
@ResponseBody
322323
public String xxe_xinclude_DocumentBuilder(HttpServletRequest request) {
323324
try {
324-
String xml_con = getBody(request);
325+
String xml_con = Tools.getBody(request);
325326
System.out.println(xml_con);
326327

327328
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
@@ -358,7 +359,7 @@ public String xxe_xinclude_DocumentBuilder(HttpServletRequest request) {
358359
@ResponseBody
359360
public String xxe_xinclude_DocumentBuilder_fix(HttpServletRequest request) {
360361
try {
361-
String xml_con = getBody(request);
362+
String xml_con = Tools.getBody(request);
362363
System.out.println(xml_con);
363364
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
364365

@@ -393,22 +394,5 @@ public String xxe_xinclude_DocumentBuilder_fix(HttpServletRequest request) {
393394
}
394395
}
395396

396-
// 获取body数据
397-
private String getBody(HttpServletRequest request) throws IOException {
398-
InputStream in = request.getInputStream();
399-
BufferedReader br = new BufferedReader(new InputStreamReader(in));
400-
StringBuffer sb = new StringBuffer("");
401-
String temp;
402-
while ((temp = br.readLine()) != null) {
403-
sb.append(temp);
404-
}
405-
if (in != null) {
406-
in.close();
407-
}
408-
if (br != null) {
409-
br.close();
410-
}
411-
return sb.toString();
412-
}
413397

414398
}

src/main/java/org/joychou/controller/jsonp/JSONP.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.alibaba.fastjson.JSONObject;
55
import org.joychou.security.SecurityUtil;
66
import org.springframework.http.MediaType;
7+
import org.springframework.security.web.csrf.CsrfToken;
78
import org.springframework.web.bind.annotation.*;
89
import javax.servlet.http.HttpServletRequest;
910
import java.security.Principal;
@@ -96,5 +97,15 @@ private String safecode(HttpServletRequest request) {
9697
}
9798

9899

100+
/**
101+
* http://localhost:8080/jsonp/getToken
102+
* @return token {"token":"115329a7-3a85-4c31-9c02-02fa1bd1fdf8","parameterName":"_csrf","headerName":"X-XSRF-TOKEN"}
103+
*
104+
*/
105+
@RequestMapping("/getToken")
106+
public CsrfToken csrf(CsrfToken token) {
107+
return token;
108+
}
109+
99110

100111
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ public class CsrfAccessDeniedHandler implements AccessDeniedHandler {
2525
public void handle(HttpServletRequest request, HttpServletResponse response,
2626
AccessDeniedException accessDeniedException) throws IOException, ServletException {
2727

28-
logger.info("[-] URL: " + request.getRequestURL() + "?" + request.getQueryString() + "\t" + "Referer: " + request.getHeader("referer"));
28+
logger.info("[-] URL: " + request.getRequestURL() + "?" + request.getQueryString() + "\t" +
29+
"Referer: " + request.getHeader("referer"));
30+
2931
response.setContentType(MediaType.TEXT_HTML_VALUE); // content-type: text/html
3032
response.setStatus(HttpServletResponse.SC_FORBIDDEN); // 403 forbidden
3133
response.getWriter().write("CSRF check failed by JoyChou."); // response contents

0 commit comments

Comments
 (0)