原文由发表于TesterHome社区,点击原文链接可与作者直接交流。

▌CSRF 攻击

CSRF 跨站点请求伪造 (Cross—Site Request Forgery):大概可以理解为攻击者盗用了你的身份,以你的名义在恶意网站发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,甚至于购买商品、转账等。

例如:Web A 为存在 CSRF 漏洞的网站,Web B 为攻击者构建的恶意网站,User C 为 Web A 网站的合法用户。

CSRF 攻击攻击原理及过程如下:
1.用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A;
2.在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器,此时用户登录网站 A 成功,可以正常发送请求到网站 A;
3.用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B;
4.网站 B 接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点 A;
5.浏览器在接收到这些攻击性代码后,根据网站 B 的请求,在用户不知情的情况下携带 Cookie 信息,向网站 A 发出请求。网站 A 并不知道该请求其实是由 B 发起的,所以会根据用户 C 的 Cookie 信息以 C 的权限处理该请求,导致来自网站 B 的恶意代码被执行。

▌CSRF 漏洞检测

a.检测 CSRF 漏洞最简单的方法就是抓取一个正常请求的数据包,去掉 Referer 字段后再重新提交,如果该提交还有效,那么基本上可以确定存在 CSRF 漏洞。
b.随着对 CSRF 漏洞研究的不断深入,不断涌现出一些专门针对 CSRF 漏洞进行检测的工具,如 CSRFTester,CSRF Request Builder 等。
CSRF 漏洞检测工具的测试原理如下:使用 CSRFTester 进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在 CSRFTester 中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在 CSRF 漏洞,当然这些工具也可以被用来进行 CSRF 攻击。

▌防御 CSRF 攻击

(1) 验证 HTTP Referer 字段
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer(浏览器会自动加上这个字段),它记录了该 HTTP 请求的来源地址。通常情况下,访问一个安全受限页面的请求来自于同一个网站,例如从 login 页面点击 “点我” 跳转,就会带着 Referer:http://127.0.0.1:5000/login:

跳转后:

在以上 CSRF 攻击的第四步,该请求的 Referer 是指向黑客自己的网站 B 而不是网站 A。因此,要防御 CSRF 攻击,网站 A 只需要对于每一个请求验证其 Referer 值,如果是 A 网站的域名,则说明该请求是来自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

Referer 的优势与劣势:
a.简单易行,开发人员不需要操心 CSRF 的漏洞,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查 Referer 的值就可以,非常便捷。

#每个请求执行之前先执行before验证请求头中的referer
@app.before_request
def csrf_check_referer():# 获取请求头中的referer,login页面不需要检查因为没有,只需要检查后续的跳转页面请求是否带referer字段if request.path != "/login":referer=request.referrerprint(referer)if referer[:22] != "http://127.0.0.1:5000/":return "page not found",404

如果域名不是"http://127.0.0.1:5000/404",跳转后的页面:

b.Referer 的值是由浏览器提供的,并不能保证浏览器自身没有安全漏洞。对于某些浏览器,目前已经有一些方法可以篡改 Referer 值,黑客完全可以修改 Referer 值,这样就可以通过验证,从而进行 CSRF 攻击。
c.即便黑客无法篡改 Referer 值,因为 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,因此用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问网站时,网站会因为请求没有 Referer 值而拒绝合法用户的访问。

(2) 在请求中添加 token 并验证
demo 代码如下:
app.py 需要设置秘钥,使用 form 表单验证模块 flask-wtf 对前端数据进行验证,包括前端传回的 csrf-token 的验证;

import os
from flask import Flask, request, render_template#初始化application
from wtforms import ValidationError
from registerform import MyFormapp = Flask(__name__)
#设置秘钥
app.config["SECRET_KEY"] = os.urandom(10)#每个请求执行之前先执行before验证请求头中的referer
@app.before_request
def csrf_check_referer():# 获取请求头中的referer,login页面不需要检查因为没有,只需要检查后续的跳转页面请求是否带referer字段if request.path != "/login":referer=request.referrerprint(referer)if referer[:22] != "http://127.0.0.1:5000/":return "page not found",404@app.route("/")
def index():return {"user":"lei"}@app.route('/login',methods=['GET','POST'])
def login():
#使用flask-wtf表单验证,会自动加上CSRF攻击的验证form = MyForm()if request.method == "GET":return render_template('index.html', form=form)if form.validate_on_submit():return 'OK'else:raise ValidationError(message=form.errors)if __name__ == '__main__':app.run(debug=True)form 表单验证模块:
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired,Lengthclass MyForm(FlaskForm):
验证前端传入的name不能为空,长度2-10;name = StringField('name', validators=[DataRequired("姓名不能为空"),Length(2,10,"名字长度错误")])html 文件:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>flask</title>
</head>
<body>
<div style="color:red">欢迎~~~</div>
<form method="POST" action="/login">
#请求页面时会加上csrf_token,提交表单时会带上这个隐藏的token以和参数一起提交给服务器;
{{ form.csrf_token }}
<lable>姓名:</lable><input type="text" name="name" value="">
<input type="submit" value="submit">
</form>
<a href="http://127.0.0.1:5000">点我</a>
</body>
</html>

1.在客户端向后端请求界面数据的时候,需要在 Form 表单中添加一个隐藏的的字段,值是 csrf_token。

2.在用户点击提交的时候,会带上这个值向后台发起请求;

3.后端接受到请求,会比较值是否正确,如果没取到或者不正确,代表不是正常的请求,不执行下一步操作。

如下用 postman 直接发起请求,则会报 csrf_token 错误;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EUZ6tPTt-1648437418764)(/img/bVcYM0t)]

原文由发表于TesterHome社区,点击原文链接可与作者直接交流。


今日份的知识已摄入~
想了解更多前沿测试开发技术:欢迎关注「第十届MTSC大会·上海」>>>
1个主会场+12大专场,大咖云集精英齐聚

安全测试之 CSRF 跨站点请求伪造相关推荐

  1. Django中如何防范CSRF跨站点请求伪造攻击

    CSRF概念 CSRF跨站点请求伪造(Cross-Site Request Forgery). 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望 ...

  2. 详解CSRF跨站点请求伪造

    CSRF攻击: CSRF跨站点请求伪造(Cross-Site Request Forgery):大概可以理解为攻击者盗用了你的身份,以你的名义在恶意网站发送恶意请求,对服务器来说这个请求是完全合法的, ...

  3. 常见的Web攻击方式:SQL注入、XSS跨站脚本攻击、CSRF跨站点请求伪造

    常见的Web攻击有SQL注入.XSS跨站脚本攻击.跨站点请求伪造共三类,下面分别简单介绍. 1 SQL注入 1.1 原理 SQL注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字 ...

  4. 密码学系列之:csrf跨站点请求伪造

    文章目录 简介 CSRF的特点 CSRF的历史 CSRF攻击的限制 CSRF攻击的防范 STP技术 Cookie-to-header token Double Submit Cookie SameSi ...

  5. Web渗透-CSRF跨站点请求伪造(Cross—Site Request Forgery)

    CSRF/XSRF 跨站点请求伪造 `也被称为"One Click Attack"或者Session Riding` 一种对网站的恶意利用漏洞 但你不能保证以下情况不会发生: CS ...

  6. security框架工作笔记002---CSRF跨站点请求伪造(Cross—Site Request Forgery)_理解和防御

    JAVA技术交流QQ群:170933152  CSRF概念:CSRF跨站点请求伪造(Cross-Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:   ...

  7. jango的CSRF跨站请求伪造即解决方法

    1.前戏 CSRF概念:CSRF跨站点请求伪造(Cross-Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:        攻击者盗用了你的身份,以你 ...

  8. 跨站点请求伪造_十大常见web漏洞——跨站点请求伪造(CSRF)

    CSRF介绍 什么是CSRF呢?我们直接看例子. https://mp.toutiao.com/profile_v3/graphic/preview?do=delete&pgc_id=6829 ...

  9. 我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

    我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击 概述      众所周知,ASP.Net MVC程序在浏览器运行时产生了标准的Html标签,包括 ...

最新文章

  1. 关于jq+easy-ui 中上传文件所遇到的问题
  2. Debug Multithread DLL 与 Debug Multithread
  3. c语言建立一个链表,每个结点包括姓名和成绩,求C语言几道题的答案~~拜托了~~...
  4. 技术干货| 阿里云基于Hudi构建Lakehouse实践探索「内附干货PPT下载渠道」
  5. 易语言数据类型与c 对照,易语言利用自定义数据类型和数组. 制作键对值操作类/内存配置...
  6. 你不知道的JS之作用域和闭包(二)词法作用域
  7. GOOD AI Example GREAT AI Company
  8. JAVA一般项目开发流程
  9. 2022年武汉市小微企业服务补贴券签约服务机构申报条件、材料及时间
  10. src 漏洞平台 应急响应中心 提交漏洞 简介
  11. incrby redis 最大值_redis incr incrby decr decrby命令
  12. 计算机二级word邀请函制作步骤,利用邮件合并制作邀请函(2)
  13. 测试公开课资料系列02--Postman之chai.js断言应用
  14. 关于dash的基础学习
  15. 个人简介网页设计作业 静态HTML个人介绍网页作业 DW个人网站模板下载 WEB静态大学生简单网页 个人网页作品代码 个人网页制作 学生个人网页
  16. 关于博客中的126相册图片不显示的问题
  17. 计算机设置用户权限的风险,电脑安全设置_当前安全设置会使计算机有风险怎么关掉...
  18. 无机质谱仪对洁净实验室都有哪些要求?
  19. 打印机 KX-MB788CN 佳能
  20. 冲量在线携手中国电信研究院、北京电信和海光信息打造的数信链网的入选2022“星河”隐私计算标杆案例

热门文章

  1. 网页程序 vs 桌面程序
  2. c++11的函数返回值要不要std::move()
  3. scrapy新浪微博爬虫
  4. 360加固保Java2c加固分析
  5. MySQL-MHA数据库高可用
  6. appium+python闲鱼采购自动化实战(二)
  7. SymmetricDS 数据库双向同步开源软件入门
  8. 注会 第六章 投资性房地产
  9. c语言中abcd的大小,技巧总结:驾照中ABCD什么意思区别 应该学C1还是C2
  10. python反编译luac_Lua程序逆向之为Luac编写IDA Pro文件加载器