CSRF介绍:
尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
攻击者欺骗管理员点击http://ip:8080/GIplatform/AllServlet?id=2&methodName=2
达到将id=2的用户删除的目的,从而造成csrf攻击!
漏洞重现:
使用burpsuit构建poc:
欺骗管理员点击该按钮 Id为2用户删除成功,即csrf攻击成功!!防御方案:
1.校验refer:
java实现代码,校验不通过返回登录页面2.提交表单时添加token:
创建TokenUtil.java,生成token和校验token,将生成的token值放到url链接中,避免csrf攻击:
添加token成功!3.对于用户修改删除等操作最好都使用POST操作
4.避免全站通用的cookie,严格设置cookie的域
最后,分享一下TokenUtil.java源码:
public class TokenUtil {
// 设置30分钟过期
private static final long EXPIRE_DATE = 30 * 60 * 1000;
// token秘钥
private static final String TOKEN_SECRET = "EQIUBFKSJBFJH2367816BQWE";
public static String GenerateToken(String username, String password) {
String token = "";
try {
// 过期时间
Date date = new Date(System.currentTimeMillis() + EXPIRE_DATE);
// 秘钥及加密算法
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
// 设置头部信息
Map<String, Object> header = new HashMap<String, Object>();
header.put("typ", "JWT");
header.put("alg", "HS256");
// 携带username,password信息,生成签名
token = JWT.create().withHeader(header)
.withClaim("username", username)
.withClaim("password", password).withExpiresAt(date)
.sign(algorithm);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return token;
}
public static boolean verify(String token) {
try {
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
JWTVerifier verifier = JWT.require(algorithm).build();
System.out.println("验证token:" + token);
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
网友评论