Skip to content

Commit 8a9977d

Browse files
committed
add auth
1 parent 4763a3a commit 8a9977d

19 files changed

+397
-64
lines changed

README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,27 @@ This project can also be called Java vulnerability code.
1111

1212
Each vulnerability type code has a security vulnerability by default unless there is no vulnerability. The relevant fix code is in the comments or code. Specifically, you can view each vulnerability code and comments.
1313

14+
## Authenticate
15+
16+
### Login
17+
18+
[http://localhost:8080/login](http://localhost:8080/login)
19+
20+
If you are not logged in, accessing any page will redirect you to the login page. The username & password are as follows.
21+
22+
```
23+
admin/admin123
24+
joychou/joychou123
25+
```
26+
27+
### Logout
28+
29+
[http://localhost:8080/logout](http://localhost:8080/logout)
30+
31+
### RememberMe
32+
33+
Tomcat's default JSESSION session is valid for 30 minutes, so a 30-minute non-operational session will expire. In order to solve this problem, the rememberMe function is introduced, and the default expiration time is 2 weeks.
34+
1435
## Vulnerability Code
1536

1637
Sort by letter.

README_zh.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,26 @@
1010

1111
每个漏洞类型代码默认存在安全漏洞(除非本身不存在漏洞),相关修复代码在注释里。具体可查看每个漏洞代码和注释。
1212

13+
## 认证
14+
15+
### 登录
16+
17+
[http://localhost:8080/login](http://localhost:8080/login)
18+
19+
如果未登录,访问任何页面都会重定向到login页面。用户名和密码如下。
20+
21+
```
22+
admin/admin123
23+
joychou/joychou123
24+
```
25+
### 登出
26+
27+
[http://localhost:8080/logout](http://localhost:8080/logout)
28+
29+
### 记住我
30+
31+
Tomcat默认JSESSION会话有效时间为30分钟,所以30分钟不操作会话将过期。为了解决这一问题,引入rememberMe功能,默认过期时间为2周。
32+
1333
## 漏洞代码
1434

1535
- [Actuators to RCE](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/resources/logback-online.xml)

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

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package org.joychou.controller;
22

33
import org.joychou.security.SecurityUtil;
4-
import org.springframework.stereotype.Controller;
54
import org.springframework.web.bind.annotation.CrossOrigin;
65
import org.springframework.web.bind.annotation.RequestMapping;
7-
import org.springframework.web.bind.annotation.ResponseBody;
6+
import org.joychou.controller.jsonp.JSONP;
7+
import org.springframework.web.bind.annotation.RestController;
88

99
import javax.servlet.http.HttpServletRequest;
1010
import javax.servlet.http.HttpServletResponse;
@@ -15,15 +15,14 @@
1515
* @desc https://github.com/JoyChou93/java-sec-code/wiki/CORS
1616
*/
1717

18-
@Controller
18+
@RestController
1919
@RequestMapping("/cors")
2020
public class CORS {
2121

2222
protected static String info = "{\"name\": \"JoyChou\", \"phone\": \"18200001111\"}";
2323
protected static String[] urlwhitelist = {"joychou.com", "joychou.me"};
2424

2525
@RequestMapping("/vuls1")
26-
@ResponseBody
2726
private static String vuls1(HttpServletRequest request, HttpServletResponse response) {
2827
// 获取Header中的Origin
2928
String origin = request.getHeader("origin");
@@ -33,7 +32,6 @@ private static String vuls1(HttpServletRequest request, HttpServletResponse resp
3332
}
3433

3534
@RequestMapping("/vuls2")
36-
@ResponseBody
3735
private static String vuls2(HttpServletResponse response) {
3836
// 不建议设置为*
3937
// 后端设置Access-Control-Allow-Origin为*的情况下,跨域的时候前端如果设置withCredentials为true会异常
@@ -43,15 +41,13 @@ private static String vuls2(HttpServletResponse response) {
4341

4442
@CrossOrigin("*")
4543
@RequestMapping("/vuls3")
46-
@ResponseBody
4744
private static String vuls3(HttpServletResponse response) {
4845
return info;
4946
}
5047

5148

5249
@RequestMapping("/sec")
53-
@ResponseBody
54-
private static String seccode(HttpServletRequest request, HttpServletResponse response) {
50+
public String seccode(HttpServletRequest request, HttpServletResponse response) {
5551
String origin = request.getHeader("Origin");
5652

5753
// 如果origin不为空并且origin不在白名单内,认定为不安全。
@@ -61,7 +57,7 @@ private static String seccode(HttpServletRequest request, HttpServletResponse re
6157
}
6258
response.setHeader("Access-Control-Allow-Origin", origin);
6359
response.setHeader("Access-Control-Allow-Credentials", "true");
64-
return info;
60+
return JSONP.getUserInfo(request);
6561
}
6662

6763

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,18 @@
77
import org.springframework.web.bind.annotation.ResponseBody;
88

99
/**
10-
* @author JoyChou ([email protected])
11-
* @date 2019.05.31
12-
* @desc check csrf using spring-security
13-
* @usage Access http://localhost:8080/csrf/ -> click submit
10+
* check csrf using spring-security
11+
* Access http://localhost:8080/csrf/ -> click submit
12+
*
13+
* @author JoyChou ([email protected]) @2019-05-31
1414
*/
15-
16-
1715
@Controller
1816
@RequestMapping("/csrf")
1917
public class CSRF {
2018

2119
@GetMapping("/")
2220
public String index() {
23-
return "csrfTest";
21+
return "form";
2422
}
2523

2624
@PostMapping("/post")

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.springframework.web.bind.annotation.RequestMapping;
77
import org.springframework.web.bind.annotation.ResponseBody;
88

9+
import javax.servlet.http.HttpServletRequest;
910
import java.util.HashMap;
1011
import java.util.Map;
1112

@@ -18,11 +19,14 @@
1819

1920
@Controller
2021
public class Index {
21-
@RequestMapping("/")
22+
@RequestMapping("/index")
2223
@ResponseBody
23-
public static String index() {
24+
public static String index(HttpServletRequest request) {
25+
String username = request.getUserPrincipal().getName();
2426
Map m = new HashMap();
25-
m.put("app_name", "java_vul_code");
27+
m.put("username", username);
28+
m.put("login", "success");
29+
m.put("app_name", "java security code");
2630
m.put("java_version", System.getProperty("java.version"));
2731
m.put("fastjson_version", JSON.VERSION);
2832

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.joychou.controller;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.security.core.Authentication;
6+
import org.springframework.security.core.context.SecurityContextHolder;
7+
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
8+
import org.springframework.stereotype.Controller;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.RequestMapping;
11+
12+
import javax.servlet.http.Cookie;
13+
import javax.servlet.http.HttpServletRequest;
14+
import javax.servlet.http.HttpServletResponse;
15+
16+
17+
@Controller
18+
public class Login {
19+
20+
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
21+
22+
@RequestMapping("/login")
23+
public String login() {
24+
return "login";
25+
}
26+
27+
@GetMapping("/logout")
28+
public String logoutPage (HttpServletRequest request, HttpServletResponse response) {
29+
30+
String username = request.getUserPrincipal().getName();
31+
32+
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
33+
if (auth != null) {
34+
new SecurityContextLogoutHandler().logout(request, response, auth);
35+
}
36+
37+
String[] deleteCookieKey = {"JSESSIONID", "remember-me"}; // delete cookie
38+
for (String key : deleteCookieKey) {
39+
Cookie cookie = new Cookie(key, null);
40+
cookie.setMaxAge(0);
41+
cookie.setPath("/");
42+
response.addCookie(cookie);
43+
}
44+
45+
if (null == request.getUserPrincipal()) {
46+
logger.info("User " + username + " logout successfully.");
47+
} else {
48+
logger.info("User " + username + " logout failed. Please try again.");
49+
}
50+
51+
return "redirect:/login?logout";
52+
}
53+
54+
@RequestMapping("/")
55+
public String redirect() {
56+
return "redirect:/index";
57+
}
58+
}

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

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import org.springframework.web.bind.annotation.*;
88
import javax.servlet.http.HttpServletRequest;
99
import javax.servlet.http.HttpServletResponse;
10-
10+
import java.security.Principal;
11+
import java.util.HashMap;
12+
import java.util.Map;
1113

1214

1315
/**
@@ -19,20 +21,30 @@
1921
@RequestMapping("/jsonp")
2022
public class JSONP {
2123

22-
private static String info = "{\"name\": \"JoyChou\", \"phone\": \"18200001111\"}";
2324
private static String[] urlwhitelist = {"joychou.com", "joychou.org"};
2425

2526

27+
// get current login username
28+
public static String getUserInfo(HttpServletRequest request) {
29+
Principal principal = request.getUserPrincipal();
30+
31+
String username = principal.getName();
32+
33+
Map m = new HashMap();
34+
m.put("Username", username);
35+
36+
return JSON.toJSONString(m);
37+
}
2638
/**
2739
* Set the response content-type to application/javascript.
2840
*
2941
* http://localhost:8080/jsonp/referer?callback=test
3042
*
3143
*/
3244
@RequestMapping(value = "/referer", produces = "application/javascript")
33-
private static String referer(HttpServletRequest request, HttpServletResponse response) {
45+
private String referer(HttpServletRequest request, HttpServletResponse response) {
3446
String callback = request.getParameter("callback");
35-
return callback + "(" + info + ")";
47+
return callback + "(" + getUserInfo(request) + ")";
3648
}
3749

3850
/**
@@ -43,15 +55,15 @@ private static String referer(HttpServletRequest request, HttpServletResponse re
4355
*
4456
*/
4557
@RequestMapping(value = "/emptyReferer", produces = "application/javascript")
46-
private static String emptyReferer(HttpServletRequest request, HttpServletResponse response) {
58+
private String emptyReferer(HttpServletRequest request, HttpServletResponse response) {
4759
String referer = request.getHeader("referer");
4860

4961
if (null != referer && !SecurityUtil.checkURLbyEndsWith(referer, urlwhitelist)) {
5062
return "error";
5163
}
5264

5365
String callback = request.getParameter("callback");
54-
return callback + "(" + info + ")";
66+
return callback + "(" + getUserInfo(request) + ")";
5567
}
5668

5769
/**
@@ -63,8 +75,8 @@ private static String emptyReferer(HttpServletRequest request, HttpServletRespon
6375
* Such as JSONOjbect or JavaBean. String type cannot be used.
6476
*/
6577
@RequestMapping(value = "/advice", produces = MediaType.APPLICATION_JSON_VALUE)
66-
public JSONObject advice() {
67-
return JSON.parseObject(info);
78+
public JSONObject advice(HttpServletRequest request) {
79+
return JSON.parseObject(getUserInfo(request));
6880

6981
}
7082

@@ -73,15 +85,15 @@ public JSONObject advice() {
7385
* http://localhost:8080/jsonp/sec?callback=test
7486
*/
7587
@RequestMapping(value = "/sec", produces = "application/javascript")
76-
private static String safecode(HttpServletRequest request, HttpServletResponse response) {
88+
private String safecode(HttpServletRequest request, HttpServletResponse response) {
7789
String referer = request.getHeader("referer");
7890

7991
if (!SecurityUtil.checkURLbyEndsWith(referer, urlwhitelist)) {
8092
return "error";
8193
}
8294

8395
String callback = request.getParameter("callback");
84-
return callback + "(" + info + ")";
96+
return callback + "(" + getUserInfo(request) + ")";
8597
}
8698

8799

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*/
1414
public class AntObjectInputStream extends ObjectInputStream {
1515

16-
private final Logger logger= LoggerFactory.getLogger(AntObjectInputStream.class);
16+
protected final Logger logger= LoggerFactory.getLogger(AntObjectInputStream.class);
1717

1818
public AntObjectInputStream(InputStream inputStream) throws IOException {
1919
super(inputStream);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
*/
2020
public class CsrfAccessDeniedHandler implements AccessDeniedHandler {
2121

22-
private final Logger logger= LoggerFactory.getLogger(CsrfAccessDeniedHandler.class);
22+
protected final Logger logger= LoggerFactory.getLogger(this.getClass());
2323

2424
@Override
2525
public void handle(HttpServletRequest request, HttpServletResponse response,
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.joychou.security;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.http.MediaType;
6+
import org.springframework.security.core.AuthenticationException;
7+
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
8+
import javax.servlet.ServletException;
9+
import javax.servlet.http.HttpServletRequest;
10+
import javax.servlet.http.HttpServletResponse;
11+
import java.io.IOException;
12+
13+
14+
15+
public class LoginFailureHandler implements AuthenticationFailureHandler {
16+
17+
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
18+
19+
@Override
20+
public void onAuthenticationFailure(HttpServletRequest request,
21+
HttpServletResponse response, AuthenticationException exception)
22+
throws ServletException, IOException {
23+
24+
logger.info("Login failed. " + request.getRequestURL() +
25+
" username: " + request.getParameter("username") +
26+
" password: " + request.getParameter("password") );
27+
28+
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
29+
response.getWriter().write("{\"code\":0, \"message\":\"Login failed.\"}");
30+
}
31+
32+
}

0 commit comments

Comments
 (0)