CSRF跨站请求伪造基础

也被称为One Click Attack或Session Riding。又常缩写为XSRF。

是一种对网站的恶意利用,与XSS的不同是,XSS攻击利用的是站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。

CSRF的原理

攻击者利用目标用户的身份,以目标用户的名义执行某些非法操作,包括:盗取目标用户的账户,以目标用户的名义发送邮件信息,转移虚拟货币等。泄露目标用户多的个人隐私并威胁其财产安全。

例如:

你登录了网站 A(比如银行后台),浏览器保存了你登录后的 Cookie。

攻击者诱导你访问恶意网站 B。网站 B 在后台悄悄发起一个针对网站 A 的请求 (例如转账、改密码)。

浏览器会自动带上你在 A 站点的 Cookie ,网站 A 误以为是你本人发起请求,执行操作。

核心:利用浏览器自动携带 Cookie 的特性,冒用受害者身份发起请求;攻击者拿不到 Cookie,只是借用身份。

CSRF漏洞攻击过程的关键点:

目标用户已经登录了网站,能够执行网站的功能。

目标用户访问了攻击者构造的URL。

例如:

你想给某位用户转账 100 元,那么单击 "转账" 按钮后,发出的 HTTP 请求会与 pay.php?user=xx&money=100 类似。而攻击者构造链接 pay.php?user=hack&money=100,当目标用户访问了该 URL 后,就会自动向攻击者的账号转账 100 元,而且这只涉及目标用户的操作,攻击者并没有获取目标用户的 Cookie 或其他信息。

CSRF练习

使用用户密码登录该账户后会进入一个添加用户的管理界面

1.抓包捕获正常添加用户请求

在页面填写用户名、密码并点击提交,使用 Burp Suite 拦截表单提交数据包。

正常业务请求:POST /adduser.php,携带参数 username=teest2&password=12345,浏览器自动附带当前登录状态的PHPSESSID会话 Cookie。

2.利用 Burp 自动生成 CSRF POC HTML

1.在捕获到的请求上右键选择:相关工具(Engagement tools) → 生成CSRF POC

2.Burp 自动生成一段 HTML 代码:内含自动提交的 Form 表单,目标地址、表单参数和正常抓包请求完全一致,并附带 JS 实现页面加载后自动提交表单。

CSRF POC = 用于复现 CSRF 漏洞的概念验证代码,证明目标站点存在 CSRF 漏洞

原理:该 HTML 页面会在打开时,静默向目标网站发起添加用户的 POST 请求。

关键点:HTML 页面本身不携带 Cookie,Cookie 由访问页面的浏览器自动附加。

3.部署 POC 页面,同一浏览器访问

将生成的 CSRF 攻击 HTML 文件放到另一台虚拟主机(恶意站点),攻击者通过聊天、邮件等方式诱导已经登录后台管理系统 的管理员,在同一个浏览器中访问该 html 地址。页面加载后自动提交伪造表单发起新增用户请求,浏览器会自动携带目标网站的登录会话 Cookie,服务端仅凭 Session 判断身份,误认为是管理员主动发起操作,最终执行添加用户的恶意行为。

前提条件:浏览器此时仍然保持登录目标后台(192.168.143.150)。

当浏览器打开恶意页面:

页面自动执行 JS 提交表单,跨站向adduser.php发起新增用户请求;浏览器自动带上目标站点的登录 Cookie,模拟合法用户操作。

4.验证漏洞效果

请求发送完成后,目标网站提示 test6添加成功。

服务器识别请求携带合法会话 Cookie,认定是已登录管理员发起操作,成功创建攻击者指定的用户账户。

总结:

登录处理逻辑

isset($_POST'loginsubmit')判断页面是否收到登录表单提交(用户点击登录按钮)。

数据库查询到匹配用户,登录成功,给会话变量赋值:$_SESSION'isadmin' = 'admin';该数据会保存在服务器端 Session 文件,浏览器只持有对应的PHPSESSID Cookie。

页面权限鉴权逻辑

每次访问该页面时,读取当前会话中的 isadmin:如果值等于 admin:鉴权通过,展示添加用户功能入口,如果不是 admin:提示 "请先登录",禁止访问管理功能。

漏洞成因:目标网站没有部署 CSRF 防护机制 (无 CSRF Token、未校验 Origin/Referer 头),服务器仅依靠 Cookie 鉴别用户身份。

CSRF 攻击核心逻辑:

攻击者无法获取用户 Cookie,但是诱导用户在已登录状态访问恶意页面驱使浏览器自动跨站发起请求,借用用户身份执行业务操作。

修复建议: 后端增加 CSRF 随机 Token 校验、校验请求 Origin/Referer、配置 Cookie SameSite 属性,敏感操作增加二次密码 / 验证码验证。

CSRF--增加referer的检查

Referer:来源页面地址
记录:用户是从哪个页面点击、跳转,访问当前接口的。

同样的操作,但是不能执行

1、这次 CSRF 请求里:$_SERVER'HTTP_REFERER' = "http://192.168.143.1/stu/src.html"

$_SERVER'HTTP_HOST' = "192.168.143.150:8003"

2、自动拼接出来的正则/^http:\/\/192.168.143.150:8003/i

3、匹配对比:待匹配字符串:http://192.168.143.1/stu/src.html

开头是:http://192.168.143.1

正则要求开头:http://192.168.143.150:8003

字符串开头不一致,匹配失败
preg_match() 返回 0

!0 条件成立 → 执行 exit("Referer error");

相关推荐
岁岁种桃花儿2 小时前
Vue核心语法第十一篇:绑定样式
前端·javascript·vue.js
程序员黑豆9 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
To_OC10 小时前
踩了个 TS 的坑之后,我终于把 type 和 interface 掰明白了
前端·react.js·typescript
GreenTea10 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
浮生望10 小时前
前端API工程化:用 Mock 数据与 Axios 配置实现独立于后端的并行开发
前端
万少11 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
波波00711 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
Brown.alexis12 小时前
es6知识点1-自备使用
前端·ecmascript·es6