跨站请求伪造攻击 CSRF
摘录:
1.跨站点请求伪造
首先,什么是跨站点请求伪造?
跨站点请求伪造-CSRF(Cross Site Request Forgery):是一种网络攻击方式。
说的白话一点就是,别的站点伪造你的请求,最可怕的是你还没有察觉并且接收了。听起来确实比较危险,下面有个经典的实例,了解一下跨站点请求伪造到底是怎么是实现的,知己知彼。
受害者:Bob 黑客:Mal 银行:bank bob在银行有一笔存款,可以通过请求
http://bank.example/withdraw?account=bob&amount=1000000&for=bob2
把钱转到bob2下。通常情况下,该请求到达网站后,服务器会验证请求是否来自一个合法的session,并且该session的用户Bob已登录。Mal在该银行也有账户,于是他伪造了一个地址http://bank.example/withdraw?account=bob&amount=1000000&for=mal
,但是如果直接访问,服务器肯定会识别出当前登录用户是mal而不是Bob,不能接受请求。于是通过CSRF攻击方式,将此链接伪造在广告下,诱使Bob自己点这个链接,那么请求就会携带Bob浏览起的cookie一起发送到银行,而Bob同时又登录了银行或者刚刚登录不久session还没有过期,那服务器发现cookie中有Bob的登录信息,就接收了响应,攻击就成功了
2.现在主要的几种防御CSRF的策略:
1. 验证Referer:
referer携带请求来源,从示例可以看出,受害者发送非法请求肯定不是在银行的界面,所以在服务器通过验证Referer是不是bank.example
开始就可以了,这个方法简单粗暴。
最简单的实现就是加个Filter:
- /**
- * 根据请求地址获取token-key
- */
- public static String getTokenKey(HttpServletRequest request){
- String key = null;
- try {
- MessageDigest mDigest = MessageDigest.getInstance("MD5");//摘要算法可以自己选择
- byte[] result = mDigest.digest(request.getRequestURL().toString().getBytes());
- key = StringUtil.bytes2hex(result);
- } catch (NoSuchAlgorithmException e) {
- LOGGER.error("get token key failed",e);
- }
- return key
- }
- /**
- * 获取token-value并存储在session中
- */
- public static String getTokenValue(HttpServletRequest request){
- String key = getTokenKey(request);
- Map<String,String> tokenMap = null;
- Object obj = request.getSession().getAttribute("tokenMap");
- if(obj == null){
- tokenMap = new HashMap<String,String>();
- request.getSession().setAttribute("tokenMap", tokenMap);
- } else {
- tokenMap = (Map<String,String>)obj;
- }
- if(tokenMap.containsKey(key)){
- return tokenMap.get(key);
- }
- String value = GUID.generate();//GUID实现可自行百度,其实弄个伪随机数也是可以的...
- tokenMap.put(key,value);
- return value;
- }
- /**
- * 验证token
- */
- public static boolean verify(String key ,String value ,HttpServletRequest request){
- boolean result = false;
- if (StringUtil.isEmpty(key) || StringUtil.isEmpty(value)) {//key或value只要有一个不存在就验证不通过
- return result;
- }
- if (request.getSession() != null) {
- Map<String,String> tokenMap = getTokenMap(request);
- if(value.equals(tokenMap.get(key))){
- result = true;
- tokenMap.remove(key);//成功一次就失效
- }
- }
- return result;
- }
完成上边的工具方法后,需要在form中添加token,如下:
- <form name="frm" action="/test/tokentest.htm" method="POST">
- <input type="hidden" name="token_key" value="<%=Token.getTokenKey(request) %>"/>
- <input type="hidden" name="token_value" value="<%=Token.getTokenValue(request) %>"/>
- ...
- </form>
验证可以放在Filter里也可以放在Service里,只要保证请求/test/tokentest.htm
会先验证就行了。直接调用工具方法Token.verify()
以下就不赘述了。
3. 在HTTP头中自定义属性并验证:
这个方法和上面那个类似,也是设置token,只是把token设置为HTTP头中的自定义属性。
通过XMLHttpRequest可以一次性给所有该类请求的HTTP头加上token 属性,但是XMLHttpRequest请求通常用于Ajax方法对局部页面的异步刷新,比较有局限性;而且通过XMLHttpRequest请求的地址不会被记录到浏览器的地址栏,一方面不会通过Referer泄露token,另一方面会导致前进,后退,刷新,收藏等操作失效,所以还是慎用。
虽然上面介绍了几种方法,但现在还没有一种完美的解决方案,但是通过Referer和Token方案结合起来使用,也能很得有效CSRF攻击。
跨站请求伪造攻击 CSRF的更多相关文章
- 安全性测试入门 (三):CSRF 跨站请求伪造攻击和防御
本篇继续对于安全性测试话题,结合DVWA进行研习. CSRF(Cross-site request forgery):跨站请求伪造 1. 跨站请求伪造攻击 CSRF则通过伪装成受信任用户的请求来利用受 ...
- XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结(转载)
转载自 https://blog.csdn.net/baidu_24024601/article/details/51957270 之前就了解过这方面的知识,但是没有系统地总结.今天在这总结一下,也让 ...
- CSRF(跨站请求伪造)攻击方式
一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...
- ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的方法
在HTTP POST请求中,我们多次在View和Controller中看下如下代码: View中调用了Html.AntiForgeryToken(). Controller中的方法添加了[Valida ...
- CSRF(跨站请求伪造攻击)漏洞详解
Cross-Site Request Forgery(CSRF),中文一般译作跨站点 请求伪造.经常入选owasp漏洞列表Top10,在当前web漏洞排行中,与XSS和SQL注入并列前三.与前两者相比 ...
- 浅谈CSRF(跨站请求伪造)攻击方式
一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...
- SpringSecurity原理解析以及CSRF跨站请求伪造攻击
SpringSecurity SpringSecurity是一个基于Spring开发的非常强大的权限验证框架,其核心功能包括: 认证 (用户登录) 授权 (此用户能够做哪些事情) 攻击防护 (防止伪造 ...
- 教你轻松解决CSRF跨站请求伪造攻击
摘要:CSRF(Cross-site request forgery)跨站请求伪造,通过伪装来自受信任用户的请求来利用受信任的网站.与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也 ...
- Web安全测试之跨站请求伪造(CSRF)篇
跨站请求伪造(即CSRF)被Web安全界称为诸多漏洞中“沉睡的巨人”,其威胁程度由此“美誉”便可见一斑.本文将简单介绍该漏洞,并详细说明造成这种漏洞的原因所在,以及针对该漏洞的黑盒测试与灰盒子测试具体 ...
随机推荐
- 【转】新手该如何学python怎么学好python?
1)学好python的第一步,就是马上到www.python.org网站上下载一个python版本.我建议初学者,不要下载具有IDE功能的集成开发环境,比如Eclipse插件等. 2) 下载完毕后,就 ...
- Git Batch命令(转)
echo 和 @ 回显命令 @ #关闭单行回显 echo off #从下一行开始关闭回显 @echo off #从本行开始关闭回显.一般批处理第一行都是这个 echo on #从下一行开始打开回显 e ...
- ABP官方文档翻译 2.2 ABP会话
ABP会话 介绍 关于IAbpSession 注入会话 会话属性 覆盖当前会话值 警告! 用户标示 介绍 如果应用需要登录的话,同样也需要知道当前用户可以执行哪些操作.ABP在展现层提供了会话对象,同 ...
- rtmp推流时间戳兼容问题
一直用简单的librtmp或者其他开源推流实现方式.没有太关注细节问题.直到最近一次测试长时间推流.遇到了3字节时间戳溢出问题,即时间戳超过0xffffff,服务器断开. 复现方式:用yasea推流到 ...
- web前端性能优化问题
常用的几大优化解决: 页面内容的优化 减少http请求 途径: 1>启用http/2--越来越多的浏览器都开始支持 HTTP/2.HTTP/2 为同一服务器的并发连接问题带来了很多好处.换句话说 ...
- canvas绘制时钟及注释及save和restore的用法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- (python功能定制)复杂的xml文件对比,产生HTML展示区别
功能的设计初衷: 处理复杂的xml对比,屏蔽同节点先后顺序的影响 主要涉及知识点: 1.xml解析 ------- ElementTree库 2.文件比对差别 ------- difflib库 3.获 ...
- python dns查询与DNS传输漏洞查询
前言: 昨天晚上在看DNS协议,然后想到了 DNS传输漏洞.便想写一个DNS查询与DNS传输漏洞查询 DNS传输漏洞介绍: DNS传输漏洞:若DNS服务器配置不当,可能导致匿名用户获取某个域的所有记录 ...
- Hive metastore源码阅读(三)
上次写了hive metastore的partition的生命周期,但是简略概括了下alter_partition的操作,这里补一下alter_partition,因为随着项目的深入,发现它涉及的地方 ...
- 模板方法模式和JDBCTemplate(一)
本篇博客的目录: 一:模板方法模式介绍 二:模板方法模式的简单实现 三:总结 一:模板方法模式的介绍 1.1:模板方法模式的定义 定义:一个操作中的算法的骨架,而将一些步骤延迟到子类中.Templat ...