精华内容
下载资源
问答
  • 跨站点请求伪造
    2021-12-22 10:36:03

     系统安全测试,发现个别接口的安全风险

    风险: 可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查 看或变更用户记录以及执行事务    原因: 应用程序使用的认证方法不充分

    跨站点请求伪造(csrf):

    跨站点伪造请求(CSRF)”攻击可让黑客以受害者的名义在易受攻击的站点上运行操作。当易受攻击的站点未适当验证请求来源时,便可能出现这个攻击。这个漏洞的严重性取决于受影响的应用程序的功能,例如,对搜索页面的 CSRF 攻击,严重性低于对转帐页面或概要更新页面的 CSRF 攻击。这项攻击的执行方式,是强迫受害者的浏览器向易受攻击的站点发出 HTTP 请求。如果用户目前已登录受害者站点,请求会自动使用用户的凭证(如会话 Cookie、用户的 IP 地址,以及其他浏览器认证方法)。攻击者利用这个方法来伪造受害者的身份,再代替他来提交操作。换句话来说,易受攻击的站点未采取适当措施来验证用户实际是否想执行特定操作。
    强迫受害者发送非预期的请求,方法有许多种:
    - 通过电子邮件向受害者发送易受攻击应用程序的恶意链接。 - 在黑客的 Web 页面上,放置一个易受攻击的 Web 站点的热链接(如图像或帧)。 - 在公共论坛中,张贴易受攻击站点的链接。
    - 利用站点(或另一个站点)的“跨站点脚本编制”或“链接注入”漏洞,将浏览器自动重定向到易受攻击的站点。
    如果攻击者利用易受攻击的站点本身的“链接注入”漏洞,可以增加用户通过站点认证的可能性,进而增加攻击成功的可能性。

    利用下列方式来验证您的应用程序是否易受到 CSRF 攻击:
    [1] 检查易受攻击的链接/请求是否未包括攻击者难以猜中的参数
    [2] 检查易受攻击的链接/请求是否会执行只应自愿执行的操作
    含有用户在不知不觉中提交的请求所能直接访问的敏感操作的应用程序,被视为很容易遭受 CSRF 攻击。CSRF 也可能出现在登录页面和注销页面上。由于攻击者可以伪造来自受害者的连续注销请求,因此 CSRF 可能导致服务拒绝。在登录页面上,CSRF 可以允许攻击者使用包含攻击者用户名和密码的伪造请求来将客户机登录到攻击者的账户中。登录 CSRF 攻击会带有严重的后果,这取决于其他站点行为。例如,如果站点保留了用户操作的历史记录(例如搜索历史记录),那么攻击者将能够在易受攻击的站点上查看受害者之前执行的操作。

    更多相关内容
  • 主要介绍了Django中如何防范CSRF跨站点请求伪造攻击的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 1.非法请求示例 由于没有对请求参数做安全校验,通过修改报文的消息头参数,一些非法请求上传服务器成功。 2.参数校验 前端程序中,通过对<meta>标签的属性设置来隐藏Referer参数。 在后台服务器程序...

    在文件IO的网络传输中,一些攻击者通过修改请求报文中消息头的Referer参数或Origin参数,将非法文件上传至服务器。在这里把一些常规的防御措施分享出来。项目视图展示层使用的是React框架,后台采用的是Springboot框架。


    1.非法请求示例

    由于没有对请求参数做安全校验,通过修改报文的消息头参数,一些非法请求上传服务器成功。

    2.参数校验

    前端程序中,通过对<meta>标签的属性设置来隐藏Referer参数。

    在后台服务器程序中增加消息头Origin参数校验,如果是非法请求则不上传至服务器。使用注解将request请求与配置文件中的IP端口信息引入。

    将request请求中的Origin参数与服务器的地址参数进行比较,判断是否请求的合法性。

    3.防御成功

    展开全文
  • 近期通过APPScan扫描程序,发现了不少安全问题,通过大量查阅和尝试最终还是解决掉了,于是整理了一下方便查阅。 前一篇博客介绍了启用了不... 1.跨站点请求伪造 首先,什么是跨站点请求伪造跨站点请求伪造-CSRF...

    近期通过APPScan扫描程序,发现了不少安全问题,通过大量查阅和尝试最终还是解决掉了,于是整理了一下方便查阅。

    前一篇博客介绍了启用了不安全的HTTP方法的解决方案,有兴趣请移步启用了不安全的HTTP方法解决方案

    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:

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException
    {
    	String referer=request.getHeader("Referer"); 
    	 if((referer!=null) &&(referer.trim().startsWith("bank.example"))){ 
    	    chain.doFilter(request, response); 
    	 }else{ 
    	    request.getRequestDispatcher("error.jsp").forward(request,response); 
    	 }
     }
    

    2. 在请求参数中添加token验证:

    要抵御跨站点请求伪造就要设置一个黑客伪造不了的东西。我们可以在请求参数中加一个随机token,在服务器验证这个token,通过即销毁重设。下面说一下我的实现:

    首先定义token为key-value结构,因为很多情况会从不同的地方访问同一个请求,如果是单一的数据结构,第一个请求生成token后还没来得及发送请求,第二个又请求生成token就会把第一个冲掉,从而导致连续的验证失败。所以,我们要通过请求源将token隔离起来。这里我将请求地址摘要后作为token的key,用GUID作为token的value,代码如下:

    /**
     * 根据请求地址获取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攻击。

    转载于:https://my.oschina.net/xlyslr/blog/719437

    展开全文
  • CSRF是Cross Site Request Forgery的缩写,中文翻译过来是请求伪造。它欺骗用户在当前已通过身份验证的Web应用程序上执行不需要的操作。在社交软件的帮助下(例如通过电子邮件或聊天发送链接),攻击者可能会...

    概述

    CSRFCross Site Request Forgery的缩写,中文翻译过来是跨站请求伪造。它欺骗用户在当前已通过身份验证的Web应用程序上执行不需要的操作。在社交软件的帮助下(例如通过电子邮件或聊天发送链接),攻击者可能会欺骗Web应用程序的用户执行攻击者选择的操作。如果受害者是普通用户,则成功的CSRF攻击会迫使用户执行状态更改请求,例如转账,更改其电子邮件地址等。如果受害者是管理帐户,则CSRF可能会破坏整个Web应用程序。

    例子

    模拟银行转账的CSRF攻击。

    大致步骤如下:

    • 张三登录银行页面
    • 张三转账给李四1000元
    • 微信接到一个中奖通知连接(假的
    • 点击连接并在其网站点击“领奖”按钮
    • 发现钱被转走了100000元。。。

    前提:张三在银行网站一直处于登录状态

    这里我搞了个小demo给大家演示下,全部代码在gitee上传送门

    1. 张三登录银行页面

    2. 张三转账给李四1000元

    3. 微信接到一个中奖通知连接(假的)

    在这里插入图片描述

    4. 点击连接并在其网站点击“领奖”按钮

    5. 看似点击个“领奖”按钮,实际上操作却是自己银行的钱转给【laker】100000元,裂开了

    原理

    我们先来看看正常的【张三】转账给【李四】

    页面核心源码

    <input type="text" name="amount"/>
    <input type="text" name="acct"/>
    $.get("http://localhost:8080/transfer", {acct: acct, amount: amount},
    

    请求详情如下:

    Request URL: http://localhost:8080/transfer?acct=%E6%9D%8E%E5%9B%9B&amount=1000
    Request Method: GET
    Status Code: 200 
    Remote Address: [::1]:8080
    Referrer Policy: strict-origin-when-cross-origin
    Connection: keep-alive
    Cookie: JSESSIONID=2F0E89DE8B34BBAE3D4D388889681648
    Host: localhost:8080
    Referer: http://localhost:8080/
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
    

    我们再来看看CSRF的【张三】转账给【laker】

    页面核心源码

    <a href="http://localhost:8080/transfer?acct=laker&amount=100000">恭喜中奖了,点我领奖!</a>
    

    请求详情如下:

    Request URL: http://localhost:8080/transfer?acct=laker&amount=100000
    Request Method: GET
    Status Code: 200 
    Remote Address: [::1]:8080
    Referrer Policy: strict-origin-when-cross-origin
    Connection: keep-alive
    Cookie: JSESSIONID=2F0E89DE8B34BBAE3D4D388889681648
    Host: localhost:8080
    Referer: http://localhost:63342/
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
    

    重点剖析

    在这个http://localhost:63342伪造的网站上,当你点击了“领奖”按钮,实际上是发起了http://localhost:8080/transfer?acct=laker&amount=100000请求,并且会自动携带上http://localhost:8080的cookie(如上面的:Cookie: JSESSIONID=2F0E89DE8B34BBAE3D4D388889681648),为什么为自动携带呢?这是浏览器的标准,标准就是这样规定的,常用的单点登录、第三方登录都会用到这个特性。

    这就是CSRF攻击的原理,利用cookie的自动携带特性,在其他的网站向你的网站发送请求,如果你的网站中的用户没有退出登录,而发送的请求又是一些敏感的操作请求,比如:转账,那么将会给你的网站的用户带来巨大的损失。

    防御

    使用token验证

    既然CSRF的原理是使用cookie造成的,那不使用cookie就完事了,使用token放在Http hearder中去判断登录状态。

    目前架构大部分都是前后端分离的,其使用的就是token验证了。

    判断Referer/Origin

    可以看到异常的网站其Referer是不同的

    SameSite Cookie属性

    谷歌提出了same-site cookies概念,same-site cookies 是基于 Chrome 和 Mozilla 开发者花了三年多时间制定的 IETF 标准。它是在原有的Cookie中,新添加了一个SameSite属性,它标识着在非同源的请求中,是否可以带上Cookie,它可以设置为3个值,分别为:

    • Strict
    • Lax
    • None

    Cookie中的内容为:

    POST /transfer HTTP/1.1
    Host: www.a-bank.com
    Cookie: JSESSIONID=randomid;SameSite=Strict;
    

    Strict是最严格的,它完全禁止在跨站情况下,发送Cookie。只有在自己的网站内部发送请求,才会带上Cookie。不过这个规则过于严格,会影响用户的体验。比如在一个网站中有一个链接,这个链接连接到了GitHub上,由于SameSite设置为Strict,跳转到GitHub后,GitHub总是未登录状态。

    Lax的规则稍稍放宽了些,大部分跨站的请求也不会带上Cookie,但是一些导航的Get请求会带上Cookie,如下:

    请求类型示例Lax情况
    链接<a href="..."></a>发送 Cookie
    预加载<link rel="prerender" href="..."/>发送 Cookie
    GET 表单<form method="GET" action="...">发送 Cookie
    POST 表单<form method="POST" action="...">不发送
    iframe<iframe src="..."></iframe>不发送
    AJAX$.get("...")不发送
    Image<img src="...">不发送

    上面的表格就是SameSite设置为Lax的时候,Cookie的发送情况。

    None就是关闭SameSite属性,所有的情况下都发送Cookie。不过SameSite设置None,还要同时设置Cookie的Secure属性,否则是不生效的

    以上就是在前端通过Cookie的SameSite属性防御CSRF攻击,不过大家在使用SameSite属性时,要注意浏览器是否支持SameSite属性。

    参考:

    • https://owasp.org/www-community/attacks/csrf
    • https://www.jianshu.com/p/01bec7059ed4

    加群一起抱团取暖,共同进步

    🍎QQ群【837324215】
    🍎关注我的公众号【Java大厂面试官】,一起学习呗🍎🍎🍎

    img

    展开全文
  • 请求伪造—CSRF

    2021-03-04 06:40:05
    CSRF 介绍CSRF,是请求伪造(Cross Site Request Forgery)的缩写,是一种劫持受信任用户向服务器发送非预期请求的攻击方式。通常情况下,CSRF 攻击是攻击者借助受害者的 Cookie 骗取服务器的信任,在受害者毫不...
  • 跨站点请求伪造(CSRF)是一种常见且严重的攻击,利用这种欺骗用户可以诱使用户执行他未明确打算执行的操作。 例如,当用户登录到他最喜欢的网站之一并继续单击看似无害的链接时,可能会发生这种情况。 在后台,他的...
  • 请求伪造

    2020-08-04 22:31:37
    请求伪造(Cross site Request,CSRF) 基本概念; 关键点: 目标: 构建CSRF场景: 攻击原理及过程: CSRF和XSS区别与联系: 口令安全 –口令破解 口令(密码)安全威胁 口令的破解方式 ☺ 字典破解 ...
  • 代码示例: 在服务器端的拦截器必不可少,它将负责检查到来的请求是否符合要求,然后视结果而决定是否继续请求或者丢弃。在 Java 中,拦截器是由 Filter 来实现的。我们可以编写一个 Filter,并在 web.xml 中对其...
  • 原来是要关闭jenkins的请求伪造保护, 低版本可以直接在 ‘全局安全配置’ 里点击关闭,高版本没有这一勾选项 解决办法: 既然我的jenkins是在docker里安装的,所以要先进入docker容器中 1.打开终端,输入...
  • CSRF(Cross-site request forgery)请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。攻击通过在授权用户访问的页面中包含链接或者脚本的方式工作...
  • 跨站点请求伪造(CSRF)是一种恶意站点向用户当前登录的易受攻击的站点发送请求的攻击方式。 以下是CSRF攻击的示例(必须具备的条件): 用户使用表单验证登录 www.example.com。 服务器验证用户,响应...
  • 文章目录一、CSRF概述二、CSRF攻击条件1、相关操作2、基于Cookie的会话处理3、没有不可预测的请求参数三、CSRF的防御1、验证请求的Referer值2、CSRF Token3、验证码等验证业务过程的方式四、基于Token的CSRF1、CSRF...
  • 对于Ajax请求来说,将CSRF令牌作为POST数据传递到每个POST请求中稍显不便。因此,Django允许利用CSRF令牌值在Ajax请求中设置自定义X-CSRFToken头。这可设置jQuery或者其他JavaScript库,并自动在每个请求中设定X-...
  • CSRF跨站点请求伪造(Cross—Site Request Forgery)。 ***者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了***者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取...
  • CSRF(Cross-site request forgery请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。
  • 请求伪造漏洞

    2019-04-17 10:54:39
    请求伪造是指攻击者可以在第三方站点制造HTTP请求并以用户在目标站点的登录态发送到目标站点,而目标站点未校验请求来源使第三方成功伪造请求。 为什么会有CSRF? JS控制浏览器发送请求的时候,浏览器是根据...
  • CSRF---请求伪造

    2022-03-09 16:54:49
    攻击者利用用户在浏览器中保存的认证信息,向对应的站点发送伪造请求。用户的认证是通过保存在cookie中的数据实现,在发送请求是,只要浏览器中保存了对应的cookie,服务器端就会认为用户已经处于登录状态。 攻击...
  • Django 配置CSRF(跨站点请求伪造)保护 配置 在项目的setings.py文件中 添加如下。 MIDDLEWARE = [ 'django.middleware.csrf.CsrfViewMiddleware', ] 跨域请求伪造保护实现主要分为两步 第一步: Django 的 ...
  • CSRF跨站点请求伪造(Cross—Site Request Forgery)。 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,...
  • CSRF 跨站点请求伪造

    千次阅读 2015-06-26 10:46:32
    转自:... 一.CSRF是什么? ... CSRF(Cross-site request forgery),中文名称:请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。 二.CSRF可以做什么?
  • CSRF攻击中有3个玩家受害者的网站(在您的示例中为您的投票网站)[知道他已登录的用户cookie]客户的浏览器(登录时)[知道他的cookie]攻击者的网站[不知道登录用户的cookie]CSRF攻击取决于2个事实浏览器会根据每个请求...
  • CSRF请求伪造漏洞修复方案

    千次阅读 2019-04-16 10:07:46
    CSRF(全称Cross-site request forgery)即请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或包含攻击代码的页面,在受害者不知情的情况下以受害者的身份(身份认证所...
  • Cookie 往往用来存储用户的身份信息,恶意网站可以设法伪造带有正确 Cookie 的 HTTP 请求,这就是 CSRF 攻击。 举例来说,用户登陆了银行网站your-bank.com,银行服务器发来了一个 Cookie。 Set-Cook...
  • csrf请求伪造Hackers are most likely to succeed in compromising user accounts through exploiting the design of internet protocols. In this article, I would like to focus on a feature of ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,961
精华内容 1,584
关键字:

跨站点请求伪造 示例

友情链接: NEW 2.zip