CSRF代码审计

news2024/11/17 15:34:46

1 CSRF漏洞

1.1 漏洞原理

跨站请求伪造(Cross-site request forgery)CSRF,是一种使已登录用户在不知情的情况下执行某种动作的攻击。因为攻击者看不到伪造请求的响应结果,所以CSRF攻击主要用来执行动作,而非窃取用户数据。 当受害者是一个普通用户时,CSRF可以实现在其不知情的情况下转移用户资金、发送邮件等操作;但是如果受害者是一个具有管理员权限的用户时CSRF则可能威胁到整个Web系统的安全。

CSRF攻击攻击原理及过程如下:

  1. 用户user打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

  2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

  3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

  4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点 A;

  5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带 Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的 Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

1.2 常见存在场景及漏洞审计点

CSRF 可能出现的场景: 更改个人信息 添加/修改资料 关注/取关用户 发布主题或信息 与交易相关的操作

常见漏洞点:

代码审计中的思路是检查是否校验Referer、是否给cookie设置SameSite属性敏感操作是否会生成

CSRF token,如果都不存在再查看请求参数中是否存在不可被攻击者猜测的字段,比如验证码等参数。

例如: 后台修改密码的代码即存在 CSRF 攻击风险:

@RequestMapping("/doUpdate")
public String doUpdate(HttpServletRequest request, Users user, Model model) {
HttpSession session = request.getSession();
user.setUsername((String)session.getAttribute("user"));
System.out.println(session.getAttribute("user"));
usersService.update(user); // 更新用户信息
model.addAttribute("success", "修改成功");
return "sqli/update";
}

攻击者可在其服务器上创建钓鱼页面,其中包含构造的发送修改用户密码请求的代码, 当用户在已登录网站的情况下点击攻击者发送的钓鱼链接时,密码将被修改。

例如: 如下是一段更新个人信息的代码,存在CSRF漏洞。

String email=request.getParameter("email");
String tel=request.getParameter("password");
String realname=request.getParameter("realname");
Object[] params = new Object[4];
params[0] = email;
params[1] = password;
params[2] = realname;params[3] = userid;
final String sql = "update user set email=?,password=?,realname=? where userid=?";
conn.execUpdate(sql,params);

在代码中,攻击者可在恶意站点中构造如下表单,诱使登陆者点击。

<script>
document.form1.submit();
</script>
<div style="display:'none'">
<form name="form1" action="http://A.com/modify.jsp" method="POST">
<input name="email" value="test@test.com">
<input name="password" value="test">
<input name="realname" value="test">
<input type="submit">
</form>
</div>

例如:Referer校验不严:

// 定义一个名为RefererInterceptor的类,该类继承自HandlerInterceptorAdapter接口  
public class RefererInterceptor extends HandlerInterceptorAdapter {  
  
    // 定义一个私有布尔变量check,默认值为true  
    // 如果check为true,则执行preHandle方法中的逻辑  
    private Boolean check = true;  
  
    // 重写HandlerInterceptorAdapter中的preHandle方法  
    // 此方法会在请求处理之前被调用  
    @Override  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
        // 如果check为false,则直接返回true,继续执行后续流程  
        if (!check) {  
            return true;  
        }  
  
        // 获取请求头中的Referer信息  
        String referer = request.getHeader("Referer");  
  
        // 如果Referer不为空,并且以"www.testdomain.com"开头  
        if ((referer != null) && (referer.trim().startsWith("www.testdomain.com"))) {  
            // 继续执行后续的请求处理流程(包括其他Interceptor和Controller)  
            chain.doFilter(request, response);  
        } else {  
            // 如果Referer不符合条件,则重定向到"index.jsp"页面  
            request.getRequestDispatcher("index.jsp").forward(request, response);  
        }  
  
        // 通常在这里返回false,表示当前Interceptor已经处理完请求,并且不继续执行后续的Interceptor或Controller  
        // 注意:如果上面的chain.doFilter(request, response)被调用,那么返回false可能会导致请求被截断  
        // 根据实际情况,可能需要在这里返回true或false  
        return false;  
    }  
}

1.3 修复方案

Referer校验,对HTTP请求的Referer校验,如果请求Referer的地址不在允许的列表中,则拦截请求。Token校验,服务端生成随机token,并保存在本次会话cookie中,用户发起请求时 附带token参数,服务端对该随机数进行校验。如果不正确则认为该请求为伪造请求 拒绝该请求。

对于高安全性操作则可使用验证码、短信、密码等二次校验措施 如下给出在 SpringBoot 项目中,使用 Spring-Security 组件来进行 Token 校验的示例

代码:

  1. 首先注册过滤器如下,本示例代码中使用的过滤器为Spring-Security提供的HttpSessionCsrfTokenRepository 过滤器

 @Configuration
public class CSRFFilterConfig {
public FilterRegistrationBean csrfFilterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
// 使用 HttpSessionCsrfTokenRepository 过滤器进行 token 校验时, token值存储在session中
filterRegistrationBean.setFilter(new CsrfFilter(new HttpSessionCsrfTokenRepository()));
​
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
  1. 使用${csrf.parameterName}和${csrf.token}表达式分别获取Token参数名和 Token 参数值,并记录到 hidden 字段中

<div class="layui-form-item">
 <label class="layui-form-label">新密码:</label>
<div class="layui-input-block">
<input type="text" name="password" class="layui-input"/>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="demo1">修改 </button>
1</div>
</div>
<!-- 存放 token-->
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1857367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go 在结构体中定义下划线(_)字段原来还有这个特殊用途?

作者&#xff1a;陈明勇 个人网站&#xff1a;https://chenmingyong.cn 文章持续更新&#xff0c;如果本文能让您有所收获&#xff0c;欢迎点赞收藏加关注本号。 微信阅读可搜《程序员陈明勇》。 这篇文章已被收录于 GitHub https://github.com/chenmingyong0423/blog&#xff…

BADI - 采购申请增强ME_PROCESS_REQ_CUST行项目增强PROCESS_ITEM

需求&#xff1a;如果行项目有文本&#xff0c;则修改行项目 实现步骤 使用事务代码 SE19或SE18 为 BADI&#xff08;ME_PROCESS_REQ_CUST &#xff09;创建实现。单击方法PROCESS_ITEM使用方法 IF_LONGTEXTS_MM~GET_TEXTOBJECT 获取订单项文本对象 ID。使用方法 IF_LONGTEXTS…

粉末冶金5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

粉末冶金5G智能工厂工业物联数字孪生平台&#xff0c;推进制造业数字化转型。在数字化浪潮席卷全球的今天&#xff0c;制造业的数字化转型已然成为不可逆转的趋势。粉末冶金行业&#xff0c;作为制造业的重要一环&#xff0c;亦需紧跟时代步伐&#xff0c;以5G智能工厂、工业物…

elementUI的衍生组件,avue的crud表格错位问题

问题描述&#xff1a; 每次从别的页面跳转回来就发现表格显示错位了 一通查 结果发现是有两层表格 解决办法&#xff1a; 根据开发者工具中看到的样式选择器&#xff0c;很粗暴的在全局样式文件中加一个&#xff1a; 效果&#xff1a;

全网最详细的SpringBoot管理系统开发教程

此文章适用于 学生管理系统、成绩管理系统、在线考试系统、图书管理系统 等&#xff0c;提供源码下载。 技术架构&#xff1a;Java SpringBoot Vue3 MySQL 一、项目搭建 1.1 开发工具 2024年了&#xff0c;我们就不考虑Eclipse了好吧&#xff0c;直接下载IDEA社区版。下载…

java医院绩效考核系统源码:医院绩效考核的发展趋势、医院绩效考核的具体方法

java医院绩效考核系统源码&#xff1a;医院绩效考核的发展趋势、医院绩效考核的具体方法 医疗机构绩效考核是对医疗机构绩效进行评估和分析的一项重要工作。它对医疗机构的发展起到了重要的指导和推动作用。本文将会分析国际上医院绩效考核的发展趋势以及医院绩效考核的具体方…

全国青少年信息素养大赛图形化编程复赛小高组真题-附答案

2023年全国青少年信息素养大赛图形化编程复赛小高组真题 题目总数&#xff1a;6 总分数&#xff1a;100 编程题 第 1 题 问答题 编程实现&#xff1a; 按下空格&#xff0c;背景会随机变化&#xff0c;如果变成沙漠背景&#xff0c;骆驼就会出现。 具体要求&#x…

【C++】继承(定义、菱形继承、虚拟继承)

&#x1f308;个人主页&#xff1a;秦jh_-CSDN博客&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 ​ 目录 继承的概念 继承定义 定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 基类和…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第46课-使用json文件

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第45课-使用头像 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…

Java版ERP管理系统源码解析:利用Spring Cloud Alibaba和Spring Boot实现微服务架构

在当今数字化浪潮的推动下&#xff0c;企业对于高效、稳定且易于扩展的管理系统需求日益增长。为了满足这一需求&#xff0c;我们精心打造了一款基于Java技术的鸿鹄ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统。该系统充分利用了Spring Cloud Alibaba、S…

C# Web控件与数据感应之数据返写

目录 关于数据返写 准备视图 范例运行环境 ControlInducingFieldName 方法 设计与实现 如何根据 ID 查找控件 FindControlEx 方法 调用示例 小结 关于数据返写 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&#xff0c;数据…

达梦数据守护集群脑裂恢复

集群环境参考上篇 达梦数据守护集群部署 https://blog.csdn.net/qq_25045631/article/details/139900164 集群发散脑裂时&#xff0c;监视器显示如下&#xff0c;实例GRP1_RT_01发生脑裂 1. 关闭DW环境 因为Global守护类型的守护进程&#xff0c;会自动将数据库实例切换到O…

MySQL集群高可用架构之MySQL InnoDB Cluste

今天我将详细的为大家介绍Centos 7.5 基于 MySQL 5.7的 InnoDB Cluster 多节点高可用集群环境部署的相关知识&#xff0c;希望大家能够从中收获多多&#xff01;如有帮助&#xff0c;请点在看、转发支持一波&#xff01;&#xff01;&#xff01; 一、MySQL InnoDB Cluster 介…

【 华为OD机试】信号发射和接收(C++ Java JavaScript Python)

题目 题目描述 有一个二维的天线矩阵,每根天线可以向其他天线发射信号,也能接收其他天线的信号,为了简化起见,我们约定每根天线只能向东和向南发射信号,换言之,每根天线只能接收东向或南向的信号。 每根天线有自己的高度anth,每根天线的高度存储在一个二维数组中,各个天…

Web框架简介

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 如果你要从零开始建立了一些网站&#xff0c;可能会注意到你不得不反复解决一些类似的问题。这样做是令人厌烦的&#xff0c;并且违反了良好编程的核…

【系统架构设计师】四、嵌入式基础知识(软件|软件设计|硬件|式总线逻辑)

目录 一、嵌入式软件 1.1 嵌入式软件分类 1.2 板级支持包(BSP) 1.3 BootLoader 1.4 设备驱动程序 二、嵌入式软件设计 2.1 编码 2.2 交叉编译 2.3 交叉调试 三、嵌入式系统硬件的分类 3.1 根据用途分类 3.2 存储器分类 四、内&#xff08;外&#xff09;总线逻辑 …

苹果Mac系统安装adobe软件“无法打开install因为无法验证开发者”解决方法

对于大部分小伙伴&#xff0c;特别是从事视频后期、设计等专业的人来说&#xff0c;Adobe全家桶系列软件&#xff0c;相信都或多或少用过&#xff0c;比如Photoshop、Premiere、illustrator、Lightroom等等。这些软件不仅支持Windows系统&#xff0c;也完美适配于苹果Mac系统&a…

AcWing算法基础课笔记——动态规划之背包问题

背包问题 1. 01背包问题 解题思路&#xff1a; 题目 2. 01背包问题 - AcWing题库 代码 优化前&#xff1a; #include<iostream> #include<algorithm>using namespace std;const int N 1010;int n, m; int v[N], w[N]; int f[N][N];int main() {cin >> …

旋转机械振动信号特征提取(Python)

前缀 &#xff1a;将一维机械振动信号构造为训练集和测试集&#xff08;Python&#xff09; https://mp.weixin.qq.com/s/DTKjBo6_WAQ7bUPZEdB1TA import pandas as pd import numpy as np import scipy.io as sio import statistics_hamming from statistics_hamming import…

文华财经幅图指标公式大全源码

文华财经幅图指标公式大全源码下载&#xff1a; DIFF:EMA(CLOSE,55) - EMA(CLOSE,89),NODRAW; DEA: EMA(DIFF,9),NODRAW; MACD:2*(DIFF-DEA),NODRAW; DIFF1: EMA(CLOSE,12) - EMA(CLOSE,26),NODRAW; DEA1: EMA(DIFF1,9),NODRAW; MACD1:2*(DIFF1-DEA1),DOT,COLORYELLOW; DRAW…