CSRF重现与防御

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 header = new HashMap();

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;

}

}

你可能感兴趣的:(CSRF重现与防御)