浅淡系列之似是而非的CSRF和SSRF

前言

       罗翔老师用张三代替所有犯罪分子,以后的文章里,我就用王麻子来特指心怀不轨的网络安全犯罪分子。

本文涉及简称:

Cookie:储存在用户本地终端上的数据帮助,用户实现记录用户个人信息;

URL:统一资源定位符,程序上用于指定信息位置的表示方法,可以理解为大家口中常说的网址。

前情回顾

       在上两篇浅谈系列有谈到CSRF和SSRF两类漏洞(点击可达原文查看详情),今天这俩货看着和听着都是那么的相似,但又那么的不一样,今天我们就仔细来盘盘它俩的同与不同。先各自一句话总结回顾一下:

CSRF:英文全称Cross-Site Request Forgery,跨站请求伪造。王麻子盗用你的身份,欺骗你的浏览器用你的名义发送恶意的请求。

SSRF:英文全称Server-Side Request Forgery,服务器端请求伪造。王麻子构造特殊链接传给服务器端执行,欺骗这个服务器实现各种操作。

一、相似之处

1、字辈相同

       显然,CSRF和SSRF它俩是一个字辈的,都是请求伪造辈,通过伪造合法的内容,实现自己的小九九。

2、利用模式相同

       它俩都是利用某个媒介作为跳板,将自己伪造的合法内容,传递给默默工作的服务后端。

二、不同之地

1、利用的信任原理不同

       CSRF是利用网站对用户浏览器的信任,而SSRF是用服务器对用户提供的可控URL地址的信任

2、案发点不同(跳板媒介不同

       上文有提到它俩都是利用某个媒介作为跳板,但是,CSRF是把用户的浏览器当作媒介跳板,而SSRF是把服务后端的服务器当作媒介跳板。

3、受害对象不同

       这俩都能造成很大的损失,CSRF的受害对象一般是用户本人,SSRF的受害对象首先是访问的网站本身,其次还可能是网站所在公司的其他网站

三、写在最后

       段永平曾说过,重要的事情要尽早开始做,不要让它变成紧急的事情。那么问题来了,你会选择一开始就着手准备以除后患,还是等到东窗事发再来亡羊补牢呢?

下期预告:浅谈系列之CSRF攻守之道,敬请期待~

### 1. CSRF漏洞原理 CSRF(跨站请求伪造)是一种欺骗性的攻击方式,其核心在于让受害者在不知情的情况下执行某些操作。这种攻击通常发生在用户已经登录某个网站并保持会话状态时。攻击者通过诱导用户访问恶意页面,在该页面上嵌入指向目标网站的操作链接或表单提交脚本。由于浏览器会在发送请求时自动附带当前用户的认证信息(如Cookie),从而使得这些请求被当作合法请求处理。 例如,假设某银行网站允许用户转账的接口如下: ```http POST /transfer HTTP/1.1 Host: bank.example.com Content-Type: application/x-www-form-urlencoded to=attacker_account&amount=1000 ``` 如果用户已登录此银行网站且未退出,则攻击者可以通过构造类似的HTML代码诱使用户触发转账行为: ```html <img src="https://bank.example.com/transfer?to=attacker_account&amount=1000"> ``` 当受害者的浏览器加载上述`<img>`标签时,实际上向银行发起了一个GET请求,并携带了用户的Session Cookie[^1]。 --- ### 2. SSRF漏洞原理 SSRF(服务器端请求伪造)是指攻击者能够操控服务器去发起对外部或者内部网络资源的HTTP请求。这类漏洞通常是因程序设计缺陷引起——即开发者未能充分验证来自客户端输入的数据便将其用于构建远程调用逻辑。比如文件上传功能可能接受外部URL作为参数下载图片到本地存储;又或者是缓存预热机制定期抓取指定网页内容等等场景都可能存在风险点。 具体来说,假如存在这样一个API用来获取第三方数据: ```python @app.route('/fetch') def fetch(): url = request.args.get('url') # 用户可控制变量 response = requests.get(url) # 使用未经校验的 URL 发起 GET 请求 return response.content # 返回响应体给前端展示 ``` 此时,若无任何防护措施的话,那么攻击者就可以轻易地传入任意地址,包括但不限于私有子网范围内的IP地址或者其他敏感服务的位置,进而实现对内网资产扫描探测甚至进一步渗透的目的[^4]。 --- ### 3. 区别与联系 #### **主要区别** - **发起方不同**: - CSRF 是由 客户端 (User Agent, 如 Web 浏览器卡) 所发出的请求; - 而 SSRF 则完全是在 后台 Server 层面产生的动作。 - **影响对象差异**: - 对于前者而言主要是针对那些依赖 Cookies 或其他形式的身份标识来进行身份确认的服务造成威胁; - 至于后者更多时候涉及到的是对企业内部架构安全性的挑战,因为它可以让黑客突破防火墙限制接触到原本隔离起来的重要设施服务实例[^3]. - **技术层面特点对比**: - 在 CSRF 中,整个过程都需要借助真实用户的交互才能顺利完成(点击链接、浏览特定网页等),而且最终所形成的危害程度取决于目标站点赋予该名下的实际权限大小; - 反观 SSRF ,一旦成功利用之后即可直接绕过常规意义上的边界保护策略,无论是否有正常用户的参与均能达成预期效果. #### **共同之处** 尽管两者之间存在着诸多显著的不同特征,但也共享了一些相似属性: - 都属于典型的Web应用层面上存在的安全隐患类别之一; - 成功实施的前提条件都是要找到合适的入口点以及具备一定的可控因素可供操纵调整 ; - 解决方案方面也都强调采用多层次综合手段相结合的方式来提升整体系统的安全性水平 , 比如说引入验证码机制对抗自动化工具生成虚假流量现象; 加强输入过滤规则防止非法字符混入业务流程当中等等举措都可以有效降低遭受此类攻击的概率 。 --- ### 示例代码片段 以下是两种常见防御方法的一个简单例子: 对于CSRF,可以在每次表单提交前加入动态Token验证: ```javascript // 前端部分 function csrfSafeMethod(method) { var token = $("meta[name='_csrf']").attr("content"); return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method) || !!token && arguments.length === 2 ? { _csrf_token : token } : {}; } $.ajax({ type: 'POST', data: $.extend(csrfSafeMethod(), { key: value }), ... }); ``` 而后端需同步检查这个额外传递过来的信息是否匹配预先设定好的值[^2]: ```php <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $expectedToken = $_SESSION['_csrf_token']; if (!hash_equals($expectedToken, $_POST['_csrf_token'])) { die('Invalid CSRF Token!'); } } ?> ``` 至于SSRF,最基础的做法就是限定允许访问的目标域名列表: ```python import urllib.parse ALLOWED_HOSTS = ['example.com', 'api.example.org'] @app.route('/proxy') def proxy(): target_url = request.args.get('url') parsed_url = urllib.parse.urlparse(target_url) if parsed_url.netloc not in ALLOWED_HOSTS: abort(403) # Forbidden access resp = requests.get(target_url) return Response(resp.content, content_type=resp.headers['content-type']) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hobby云说

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值