安全漏洞问题4:跨站请求伪造

安全漏洞问题4:跨站请求伪造
1.1. 漏洞描述
跨站请求伪造(CSRF)是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。攻击者只要借助少许的社会工程诡计,例如通过电子邮件或者是聊天软件发送的链接,攻击者就能迫使一个Web应用程序的用户去执行攻击者选择的操作。
在跨站请求伪造攻击中,攻击者构造恶意URL请求,然后诱骗合法用户访问此URL链接,以达到在Web应用中以此用户权限执行特定操作的目的。和反射型XSS的主要区别是:反射型XSS的目的是在客户端执行脚本;CSRF的目的是在Web应用中执行操作。
1.2. 漏洞危害
当CSRF针对普通用户发动攻击时,将对终端用户的数据和操作指令构成严重的威胁,当受攻击的终端用户具有管理员帐户的时候,CSRF攻击将危及整个Web应用程序。
例如,如果用户登录网络银行去查看其存款余额,他没有退出网络银行系统就去了自己喜欢的论坛去灌水,如果攻击者在论坛中精心构造了一个恶意的链接并诱使该用户点击了该链接,那么该用户在网络银行帐户中的资金就有可能被转移到攻击者指定的帐户中。
1.3. 解决方案
可以采用如下手段防范跨站脚本攻击:
 限制身份认证cookie的到期时间
身份认证cookie的合法时间越短,攻击者利用Web应用程序的机会就越小。不过,这个时间越短,用户就越不方便。因此,需要在安全性和方便性之间进行平衡。
如下代码中,具体功能代码前加入一段检查用户登录超时时间的代码,通过检查用户最后一次操作时间与当前时间的差值是否小于系统设置值(本例中为600秒)来判断:
//获取当前系统时间
long currentTime =new Date().getTime()/1000;
Long lastTime =
((Date)request.getSession().getAttribute("LAST_TIME")).getTime()/1000;
If(currentTime - lastTime > 600)
{
session.invalidate();// 销毁会话
response.getWriter().println(
"

  • "\");window.close();"
    ) ;
    }
    Else
    {
    ……
    //实际功能处理代码
    ……
    //更新session中记录的当前用户最后操作时间
    }

 要求用户提交额外的信息
执行重要业务之前,要求用户提交额外的信息。例如要求用户在进行重要业务前输入口令或图形验证码,这可以防止攻击者发动CSRF攻击(只要浏览器中没有包含口令或验证码信息),因为这种重要信息无法预测或轻易获得。
如下代码中,具体功能代码前加入一段检查用户是否输入了正确的图性验证码的代码,只有图形验证码检查通过才开始执行具体的功能代码:
// 比较验证码
String input_code = request
.getParameter("validate_code");// 用户输入的验证码
String right_code = (String) request.getSession()
.getAttribute("validate_code");// 存在于Session中的正确验证码
if (! input_code.trim().equalsIgnoreCase(right_code)) {
request.setAttribute("MSG", “验证码有误”);
return mapping.findForward("fail");
else
{
……
//实际功能处理代码
……
}
 使用一次性令牌
使用一次性令牌,这是当前 Web 应用程序的设计人员广泛使用的一种方式,方法是对于 Get 请求,在 URL 里面加入一个令牌,对于 Post 请求,在隐藏域中加入一个令牌。这个令牌由 server 端生成,由编程人员控制在客户端发送请求的时候使请求携带本令牌然后在 Server 端进行验证。在令牌的设计上应避免采用如下错误的方案:
 使用和 Session 独立的令牌生成方式。这种令牌的值和 Session 无关,因此不容易被其他用户伪造。这里的其他用户指的是当前 Web 应用程序的其他用户和活跃在网络传输阶段各个设置上的监听者,这种恶意用户可能使用自己的令牌来进行替换以便达到伪造的目的。
 完全使用 Session 认证信息作为令牌的生成方式。这种保护方式可以防范CSRF,但是可能会造成其他危害,具体来说,如果某些 URL 或者网页被拷贝下来与其他人共享,那么这些 URL 或者拷贝下来的网页中可能会含有用户的会话信息,这种信息一旦被恶意用户获得,就能造成极大的危害。
一个正确的令牌设计应该是使用 Session 信息做 Hash,用得出的哈希值来做 CSRF 的令牌。
如下示例代码:
1、生成令牌代码函数
Public String getTokenCode(HttpServletRequest request){
String tokenCode =request.getSession.getId+Math.abs(new SecureRandom().nextLong());
Return tokenCode;
}

2、输出页面链接时,POST域中包含此一次性令牌(a_dynamic_value)

” />

3、后台处理时,检查传入的一次性令牌是否合法,只有包含合法的令牌数据才执行后续的功能代码
//获取令牌数据
String input_token =request.getParameter(“secret”);
String right_token = getTokenCode(request);
//检查令牌是否合法
if (! input_token.equalsIgnoreCase(right_token)) {
{
request.setAttribute("MSG", “令牌有误”);
return mapping.findForward("fail");
}
Else
{
……
//实际功能处理代码
……
}
 检查 HTTP 头部 Referer 信息
检查 HTTP 头部 Referer 信息,这是防止 CSRF 的最简单容易实现的一种手段。根据 RFC 对HTTP 协议里面 Referer 的定义,Referer 信息跟随出现在每个 Http 请求头部。Server 端在收到请求之后,可以去检查这个头信息,只接受来自本域的请求而忽略外部域的请求。该方法仅能作为补充,因为检查方式由于过于简单也有它自身的弱点:
 首先是检查 Referer 信息并不能防范来自本域的攻击。在企业业务网站上,经常会有同域的论坛,邮件等形式的 Web 应用程序存在,来自这些地方的 CSRF 攻击所携带的就是本域的 Referer 域信息,因此不能被这种防御手段所阻止。
 同样,某些直接发送 HTTP 请求的方式(指非浏览器,比如用后台代码等方法)可以伪造一些 Referer 信息,由于目前客户端手段层出不穷,flash、javascript 等大规模使用,从客户端进行 Referer 的伪造,尤其是在客户端浏览器安装了越来越多的插件的情况下已经成为可能。
如下代码中,具体功能代码前加入一段检查当前访问者的HTTP Referer信息代码,只有Referer信息的主机匹配才继续执行功能代码:

//获取当前URL中的主机名
String url_host =request.getParameter(“host”);
//获取当前访问者的HTTP Refer信息
//获取HTTP Refer信息中的主机名
String http_host =request.getRemoteAddr();
If( ! url_host .equals(http_host))
{
request.setAttribute("MSG", “对不起,您的地址不在访问权限内 !”);
return mapping.findForward("fail");
}
Else
{
……
//实际功能处理代码
……
}
Web 开发人员可以根据自己对应用程序的功能的理解来确定安全级别,从而选择使用不同的保护措施,也推荐在同一应用程序内部结合使用多种方法来进行保护。
 避免在URL中明文显示特定操作的参数内容
如果在URL中明文显示特定操作的参数内容,当该Web应用系统存在跨站脚本欺骗漏洞时,能使攻击者很容易地使用该漏洞对Web应用系统进行攻击。例如,银行转账操作的URL http://www.yinhang.com?&account=number&transfer=X时,就会很容易使攻击者利用该漏洞在你不知道的情况下在你的账户中进行转账操作。所以,避免在URL中明文显示特定操作的参数内容,能加大攻击者利用该漏洞的难度。

时间: 2024-07-29 02:00:37

安全漏洞问题4:跨站请求伪造的相关文章

让我们一起来消灭CSRF跨站请求伪造(上)

写在前面的话 现在已经是2017年了,想必大家一定知道什么是CSRF(跨站请求伪造)了,因为之前关于这个话题的讨论已经有很多了.这种漏洞已经存在了很多年,社区中也有非常详细的文档以及对应的解决方案,目前很多热门的网站开发框架基本上或多或少都实现了相应的缓解方案. 那我们在本系列文章中要讨论什么呢?请大家先思考以下几个因素: 遗留应用缺少CSRF保护; 某些框架的内置CSRF防护机制存在缺陷; 应用程序没有使用已证明安全的框架保护机制; 新的应用程序没有使用提供了CSRF保护功能的现代框架; 因此

《第三方JavaScript编程》——7.3 跨站请求伪造

7.3 跨站请求伪造 在第4章中,我们谈到了同源策略.该策略被所有浏览器支持,并防止不同来源的Web页面互相访问对方的方法和属性.你已经学到了一些技巧,使用这些技巧可以向你的服务器跨域发送消息.在本节中,我们将介绍利用该特性是如何转而对你进行攻击的. 跨站请求伪造(CSRF或者XSRF)是针对用户的另一种类型的漏洞.与XSS不同,XSS是将伪造的内容展现给用户,而XSRF利用的是Web应用程序与用户浏览器之间的信任.在本质上,易受XSRF攻击的Web应用都允许攻击者通过自己的网站诱导用户执行某些

CSRF(跨站请求伪造攻击)详解以及防护之道

CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行在权限保护之下的操作,有很大的危害性.然而,该攻击方式并不为大家所熟知,很多网站都有 CSRF 的安全漏洞.本文首先介绍 CSRF 的基本原理与其危害性,然后就目前常用的几种防御方法进行分析,比较其优劣.最后,本文将以实例展示如何在网站中防御 CSRF 的攻击,并分享一些开发过程中的最佳实践. C

[译] 跨站请求伪造已死!

本文讲的是[译] 跨站请求伪造已死!, 原文链接:Cross-Site Request Forgery is dead! 原文作者:Scott 译文出自:掘金翻译计划 译者:XatMassacrE 校对者:newbieYoung,DeadLion 跨站请求伪造已死! 在连续不断的被跨站请求伪造折磨了这么多年后,我们现在终于有了一个合理的解决方案.一个对网站拥有者没有技术负担.实施起来没有难度.部署又非常简单的方案,它就是 Same-Site Cookies. 和互联网历史一样悠久的跨站请求伪造

跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险

跨站请求伪造(Cross-Site Request Forgery)或许是最令人难以理解的一种攻击方式了,但也正因如此,它的危险性也被人们所低估.在"开放式Web应用程序安全项目"(OWASP)的榜单中,CSRF(又称XSRF)就位于前10的位置.简而言之,就是恶意软件强制浏览器在用户已认证的上下文环境中,执行原本并不需要的指令. 浏览器厂家深知这一危害,从而推出了某些类型的CSRF防护技术. 尽管如此,攻击者们的手段也在日益翻新,甚至结合多种类型的Web攻击以放大危害(比如XSS和S

让我们一起来消灭CSRF跨站请求伪造(下)

写在前面的话 在本系列文章的上集中,我们跟大家介绍了关于CSRF的一些基本概念,并对常见的几种CSRF漏洞类型进行了讲解.那么接下来,我们就要跟大家讨论一下如何才能消灭CSRF. 现代保护机制 实际上,通过修改应用程序源代码来实现CSRF保护在很多情况下是不现实的,要么就是源代码无法获取,要么就是修改应用程序的风险太高了.但我们所设计的解决方案可以轻松地部署到RASP.WAF.反向代理或均衡负载器中,并且可以同时保护一个或多个配置相同的应用程序. 首先我们要知道,正确地使用安全或不安全的HTTP

防止伪造跨站请求的小招式

伪造跨站请求介绍 伪造跨站请求比较难以防范,而且危害巨大,攻击者可以通过这种方式恶作剧,发spam信息,删除数据等等.这种攻击常见的表现形式有: 伪造链接,引诱用户点击,或是让用户在不知情的情况下访问 伪造表单,引诱用户提交.表单可以是隐藏的,用图片或链接的形式伪装. 比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查.这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦. yahoo对付伪

php安全开发 添加随机字符串验证,防止伪造跨站请求_php技巧

yahoo对付伪造跨站请求的办法是在表单里加入一个叫.crumb的随机串:而facebook也有类似的解决办法,它的表单里常常会有post_form_id和fb_dtsg. 比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查.这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦.现在防范方法基本上都是基于这种方法的了 随机串代码实现 咱们按照这个思路,山寨一个crumb的实现,代码如下: 复

php漏洞之跨网站请求伪造与防止伪造方法

伪造跨站请求介绍 伪造跨站请求比较难以防范,而且危害巨大,攻击者可以通过这种方式恶作剧,发spam信息,删除数据等等.这种攻击常见的表现形式有: 伪造链接,引诱用户点击,或是让用户在不知情的情况下访问 伪造表单,引诱用户提交.表单可以是隐藏的,用图片或链接的形式伪装. 比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查.这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦. 如果攻击者以隐藏