Skip to content

Commit 32fb2e3

Browse files
committed
add jsonp cors
1 parent 3ccdc1e commit 32fb2e3

File tree

6 files changed

+156
-0
lines changed

6 files changed

+156
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.idea/
22
.DS_Store
33
target/
4+
other-vuls/
45
*.iml

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
- [URL白名单Bypass](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/URLWhiteList.java)
2222
- [Java RMI](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/RMI/Server.java)
2323
- [Fastjson](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Fastjson.java)
24+
- [CORS](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/CORS.java)
25+
- [JSONP](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/JSONP.java)
2426

2527

2628
## 漏洞说明
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package org.joychou.controller;
2+
3+
import org.springframework.stereotype.Controller;
4+
import org.springframework.web.bind.annotation.*;
5+
import javax.servlet.http.HttpServletRequest;
6+
import javax.servlet.http.HttpServletResponse;
7+
import org.joychou.utils.Security;
8+
9+
/**
10+
* @author: JoyChou
11+
* @date: 2018年10月24日
12+
* @desc: 只要Access-Control-Allow-Origin为*,或者可被绕过,就存在CORS跨域
13+
*/
14+
15+
@Controller
16+
@RequestMapping("/cors")
17+
public class CORS {
18+
19+
protected static String info = "{\"name\": \"JoyChou\", \"phone\": \"18200001111\"}";
20+
protected static String[] urlwhitelist = {"joychou.com", "joychou.me"};
21+
22+
/**
23+
*
24+
* @param request
25+
* @param response
26+
* @desc: 当origin为空,即直接访问的情况下,response的header中不会出现Access-Control-Allow-Origin
27+
*/
28+
@RequestMapping("/vuls1")
29+
@ResponseBody
30+
private static String vuls1(HttpServletRequest request, HttpServletResponse response) {
31+
// 获取Header中的Origin
32+
String origin = request.getHeader("origin");
33+
34+
response.setHeader("Access-Control-Allow-Origin", origin); // 设置Origin值为Header中获取到的
35+
// response.setHeader("Access-Control-Allow-Methods", "POST, GET");
36+
// response.setHeader("Access-Control-Allow-Credentials", "true"); // cookie
37+
return info;
38+
}
39+
40+
@RequestMapping("/vuls2")
41+
@ResponseBody
42+
private static String vuls2(HttpServletResponse response) {
43+
response.setHeader("Access-Control-Allow-Origin", "*");
44+
// response.setHeader("Access-Control-Allow-Methods", "POST, GET");
45+
// response.setHeader("Access-Control-Allow-Credentials", "true");
46+
return info;
47+
}
48+
49+
@RequestMapping("/sec")
50+
@ResponseBody
51+
private static String seccode(HttpServletRequest request, HttpServletResponse response) {
52+
String origin = request.getHeader("Origin");
53+
Security sec = new Security();
54+
if (!sec.checkSafeUrl(origin, urlwhitelist)) {
55+
return "Origin is not safe.";
56+
}
57+
response.setHeader("Access-Control-Allow-Origin", "*");
58+
// response.setHeader("Access-Control-Allow-Methods", "POST, GET");
59+
// response.setHeader("Access-Control-Allow-Credentials", "true");
60+
return info;
61+
}
62+
63+
64+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ public class Fastjson {
1717
@RequestMapping(value = "deserialize", method = {RequestMethod.POST })
1818
@ResponseBody
1919
public static String Deserialize(@RequestBody String params) {
20+
// 如果Content-Type不设置application/json格式,post数据会被url编码
2021
System.out.println(params);
2122
try {
23+
// 将post提交的string转换为json
2224
JSONObject ob = JSON.parseObject(params);
2325
return ob.get("name").toString();
2426
}catch (Exception e){
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.joychou.controller;
2+
3+
import org.joychou.utils.Security;
4+
import org.springframework.stereotype.Controller;
5+
import org.springframework.web.bind.annotation.*;
6+
import javax.servlet.http.HttpServletRequest;
7+
import javax.servlet.http.HttpServletResponse;
8+
9+
10+
/**
11+
* @author JoyChou
12+
* @date 2018年10月24日
13+
*/
14+
15+
@Controller
16+
@RequestMapping("/jsonp")
17+
public class JSONP {
18+
19+
protected static String info = "{\"name\": \"JoyChou\", \"phone\": \"18200001111\"}";
20+
protected static String[] urlwhitelist = {"joychou.com", "joychou.me"};
21+
22+
23+
// http://localhost:8080/jsonp/referer?callback=test
24+
@RequestMapping("/referer")
25+
@ResponseBody
26+
private static String referer(HttpServletRequest request, HttpServletResponse response) {
27+
// JSONP的跨域设置
28+
response.setHeader("Access-Control-Allow-Origin", "*");
29+
String callback = request.getParameter("callback");
30+
return callback + "(" + info + ")";
31+
}
32+
33+
34+
// http://localhost:8080/jsonp/sec?callback=test
35+
@RequestMapping("/sec")
36+
@ResponseBody
37+
private static String sec(HttpServletRequest request, HttpServletResponse response) {
38+
// JSONP的跨域设置
39+
response.setHeader("Access-Control-Allow-Origin", "*");
40+
String referer = request.getHeader("referer");
41+
Security sec = new Security();
42+
if (!sec.checkSafeUrl(referer, urlwhitelist)) {
43+
return "Referer is not safe.";
44+
}
45+
String callback = request.getParameter("callback");
46+
return callback + "(" + info + ")";
47+
}
48+
49+
50+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.joychou.utils;
2+
3+
import com.google.common.net.InternetDomainName;
4+
import java.net.URL;
5+
6+
public class Security {
7+
/**
8+
* @param url
9+
* @return 安全url返回true,危险url返回false
10+
*/
11+
public static Boolean checkSafeUrl(String url, String[] urlwhitelist){
12+
try{
13+
URL u = new URL(url);
14+
// 判断是否是http(s)协议
15+
if (!u.getProtocol().startsWith("http") && !u.getProtocol().startsWith("https")) {
16+
System.out.println("The protocol of url is not http or https.");
17+
return false;
18+
}
19+
String host = u.getHost().toLowerCase();
20+
// 如果非顶级域名后缀会报错
21+
String rootDomain = InternetDomainName.from(host).topPrivateDomain().toString();
22+
23+
for (String whiteurl: urlwhitelist){
24+
if (rootDomain.equals(whiteurl)) {
25+
return true;
26+
}
27+
}
28+
29+
System.out.println("Url is not safe.");
30+
return false;
31+
}catch (Exception e) {
32+
System.out.println(e.toString());
33+
e.printStackTrace();
34+
return false;
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)