web安全之跨站请求伪造
来源:互联网 发布:查尔斯软件使用教程 编辑:程序博客网 时间:2024/06/04 18:17
CSRF(Cross-site request forgery),中文名称:跨站请求伪造.
因为这个不是用户真正想发出的请求,这就是所谓的请求伪造;因为这些请求也是可以从第三方网站提交的,所以前缀跨站二字。
假设我们有另外一个网站B,它有一个网页文件如下
如果在用户登录访问网站A的同时访问了网站B,访问者在网站A的数据就会被假冒更新。
可以在后台看到有如下的输出:add a comment: fromcsrf
结果是同样会发生。可以通过构造javascript构造form提交,如下面的代码
1,利用referer判断,
但是用户有可能设置浏览器使其在发送请求时不提供 Referer,这样的用户也将不能访问网站。
2,在请求中添加 token 并验证
关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中,
可以在服务器端生成一个随机码,然后放在form的hidden元素中,form提交的时候在服务器端检查。
因为这个不是用户真正想发出的请求,这就是所谓的请求伪造;因为这些请求也是可以从第三方网站提交的,所以前缀跨站二字。
CSRF发生的场景如下图所示:
用户登录访问了一个受信任的站点,
在用户还没有退出登录的时候,打开另外一个tab页,访问了网站B。
在B网站中,有CSRF攻击代码访问网站A。
发生的原因是,网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个
标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问这个网站会带上这个cookie。
1.登录受信任网站A,并在本地生成Cookie。
2.在不登出A的情况下,访问危险网站B。
你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。
是的,确实如此,但你不能保证以下情况不会发生:
1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。
2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。
(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于
退出登录/结束会话了)如记住密码功能等。
3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。
下面来看一个代码实例,在网站A发布了下面的代码
用户login,然后可以在input.jsp提交数据,提交的数据被dataupdate.jsp更新到后台。
dataupdate.jsp会检查用户是否登录,如果没有登录会跳到login.jsp要求用户登录。
login.jsp<body><form action="input.jsp" method="post">name<input type="text" name="name" size="50"><br>pwd<input type="password" name="password" size="50"><br><input type="submit" value="submit"></form><br></body></html>input.jsp<body><%//Session session = request.getSession();String username = (String)session.getValue("username");System.out.println("username " + username);if(null==username){String uname = request.getParameter("name");session.putValue("username", uname);}%><form action="dataupdate.jsp" method="post"><input type="text" name="comment" size="50"><br><input type="submit" value="submit"></form><br></body>dataupdate.jsp<body><%String username = (String)session.getValue("username");System.out.println("username " + username);if(null==username){System.out.println("has not logged in");response.sendRedirect("login.jsp");}else{String comment = request.getParameter("comment");System.out.println("add a comment: " + comment);out.write("comment is : " + comment);}%></body></html>表面上看起来好像没有问题。
假设我们有另外一个网站B,它有一个网页文件如下
如果在用户登录访问网站A的同时访问了网站B,访问者在网站A的数据就会被假冒更新。
可以在后台看到有如下的输出:add a comment: fromcsrf
<body>use a img element to send a get request <br><img src="http://www.a.com/prjWebSec/csrf/dataupdate.jsp?comment=fromcsrf"></body></html>这里网站A违反了HTTP规范,使用GET请求更新资源。那是不是用post请求就不会发生CSRF呢?
结果是同样会发生。可以通过构造javascript构造form提交,如下面的代码
<body ></body><script type="text/javascript">var frm= document.getElementById("viframe");function sendcsrf() { var form1 = document.createElement("form"); form1.id = "form1"; form1.name = "form1"; document.body.appendChild(form1); var input = document.createElement("input"); input.type = "text"; input.name = "comment"; input.value = "from csrf post"; form1.appendChild(input); form1.method = "POST"; form1.action = "http://www.a.com/prjWebSec/csrf/dataupdate.jsp"; form1.submit(); document.body.removeChild(form1); } sendcsrf(); </script></html>防止方法:
1,利用referer判断,
但是用户有可能设置浏览器使其在发送请求时不提供 Referer,这样的用户也将不能访问网站。
2,在请求中添加 token 并验证
关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中,
可以在服务器端生成一个随机码,然后放在form的hidden元素中,form提交的时候在服务器端检查。
3 0
- web安全之跨站请求伪造
- web安全之跨站请求伪造
- Web安全测试之跨站请求伪造(CSRF)篇
- Web安全测试之跨站请求伪造(CSRF)
- Web安全之CSRF跨站请求伪造攻击
- Web安全测试之跨站请求伪造(CSRF)
- Web安全测试---跨站请求伪造CSRF
- Web安全测试之跨站请求伪造(CSRF)篇
- web安全之跨站请求伪造攻击(CSRF)与防范方法
- 安全测试之跨站请求伪造(CSRF)攻击
- web安全(2)-- CSRF(跨站点请求伪造)
- web安全三——跨站请求伪造攻击(Cross Site Request Forgery (CSRF))
- Web安全相关(二):跨站请求伪造(CSRF/XSRF)
- [web安全] 服务器端请求伪造(SSRF)
- web安全,服务器端请求伪造(SSRF)
- PHP安全编程之跨站请求伪造CSRF的防御
- 注意安全(2)!XSRF跨站伪造请求
- PHP安全编程:跨站请求伪造CSRF的防御
- 输入某年某月某日,判断这一天是这一年的第几天?
- C# WinForm 关于窗体最大化时的是否全屏效果与是否遮盖任务栏
- eclipse使用Working Set管理project
- scipy模块介绍
- 菜鸟Andriod学习18——拖动条的使用
- web安全之跨站请求伪造
- Could not resolve archetype org.apache.maven.archetypes:maven-archetype-webap
- cocos2dx编译问题
- 基本概念零碎汇总
- 第十七周上机时间项目——数组的排序
- Chapter 5 Basic Drawing
- 我的Apache安全模块mod_evasive配置
- ios尺寸大集合
- 【工具】TFS登录没有权限或没有反映