CSRF与SSRF
一、CSRF介绍
Cross-site request forgery,跨站请求伪造。发生在Web应用当中。有用户登录了Web应用,强制其执行非本意的操作。跨站:发生在用户终端(客户端)。主要目的是伪造更改状态(如,修改密码,转账等)的请求,而非盗取数据。它是一种欺骗受害者提交恶意请求的攻击,它继承了受害者的身份与特权,代表受害者执行非本意操作。对于大多数网站,浏览器请求自动发送与站点关联的所有凭据,例如用户的会话cookie,IP地址,Windows域凭据等。因此,如果用户当前已对该站点进行了身份验证,则该站点将无法区分受害者发送的伪造请求和受害者发送的合法请求。
有时可以把CSRF攻击存储在易受攻击的站点上,被称为“存储的CSRF漏洞”,攻击的严重更大。
角色:攻击者(如:hacker)、服务器(server,如网银页面)、钓鱼网站(hacker搭建)、受害者(如admin)
情景:hacker与admin都在网银页面上有账号,假设hacker当前存款0,admin存款,20000。admin在网银页面没有退出登录的情况下,访问了钓鱼网站,点击了其中的链接,即发生了转账,金额从admin的账户转移到了hacker的账户。因为网银页面与钓鱼网站是两个IP不同的网站,所以叫跨站。
分析原因:
CSRF的触发:
1.a标签
<a href="转账链接">click me.</a>
或者2.<img src="转账链接">(get请求)
admin在触发了以上恶意代码后,请求先由钓鱼网站发送到admin客户端,再由admin客户端发送到网银页面(伪造的请求)。网银页面接收到admin的请求后,将金额由admin账户转移到其下的hacker账户,从而完成了转账。整个过程hacker只搭建了钓鱼网站,不参与到攻击过程中。此攻击具有普遍性,对所有访问者有效。
除了用get方式发送伪造请求外,还可以用post伪造表单的方式发送。
二、CSRF防御
(1)无效的防御
1.使用秘密cookie
所有的cookie,即便是加密的,也会随着每一个请求一起提交。无论最终用户是否被欺骗提交请求,都将提交所有身份验证令牌,身份凭据。
2.仅接受POST请求
3.多步交易
4.URL重写
5.https
(2)有效的防御
1.验证referer字段
只接受来自例如网银页面的请求,而referer如果是其他网站的,则拒绝。
注意:因为referer支持客户端自定义,所以也可能无效。
2.添加token(随机字符串)验证
CSRF之所以能成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于cookie中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的cookie来通过安全验证。由此可知,抵御CSRF的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信息不存在于Cookie之中。鉴于此,系统开发者可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,可以认为是CSRF而拒绝请求。
3.二次验证
在转账等关键操作之前提供当前用户密码或验证码。
4.用户养成良好的习惯。
三、SSRF介绍
Server-Side request forgery,服务器端请求伪造。本质:强制服务器发送一个攻击者的请求。
如果Web应用开放了类似于“百度识图”类的功能,并且对用户提供的URL和远端服务器返回的信息没有进行合适的验证或过滤就可能存在“请求伪造”的缺陷。
SSRF的危害:端口扫描(扫描内网机器的端口)、内网Web应用指纹识别、攻击内网Web应用、读取本地文件(如用file协议)。
可通过PHP语言实现,但需要开启curl扩展。
四、SSRF的防御
1.限制协议
仅允许http和https请求。
2.限制IP
避免应用被用来获取内网数据,攻击内网。不能是内网IP。
3.限制端口
限制http常用端口,如80/443/8080/8090。
4.过滤返回信息
验证远程服务器对请求的响应是比较简单的方法。
5.统一错误信息
比如都用404。避免用户可以根据错误信息来判断远端服务器的端口状态。
原文地址:https://www.cnblogs.com/fengyufei/p/15314233.html
- silverlight:对象拖动的优雅解决方案
- Silverlgiht:快速去除/恢复对象的颜色
- deepin系统下如何设置wifi热点(亲测有效)
- Silverlight单元测试
- Silverlight:页面/控件继承的二种写法
- java学习:Hibernate入门
- Silverlight Telerik控件学习:GridView双向绑定
- XmlWriter/XmlReader示例代码
- Silverlight Telerik控件学习:RadComboBox之自动完成(AutoComplete)
- Silverlight Telerik控件学习:数据录入、数据验证
- AI与自动驾驶
- python多线程学习笔记(超详细)
- Silverlight Telerik控件学习:RadTransitionControl
- Silverlight Telerik控件学习:弹出窗口RadWindow
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 现在学 PHP 没有发展?来看看这个后台框架你还会这么想吗
- leetcode-easy-array-最大子序和
- Leecode No.3 无重复字符的最长子串
- Solidity 0.6.11 更新
- 潘石屹用Python解决100个问题 | 最小公倍数
- 通过CREATE2获得合约地址:解决交易所充值账号问题
- 小知识:如何判定crontab任务的执行频度
- 以太坊合约静态分析工具Slither简介与使用
- Cesium第一次搭建环境出不来地球的问题
- 小知识:解决EXP-00003的报错
- Mysql5中Packet for query is too large (3396053 > 1048576),数据量太大解决方案
- 关于 servlet 的这个问题,你能答对吗?
- MYSQL数据优化常用配置参数
- Hadoop分块存储解析及还原分块存储的文件
- ValueError: too many values to unpack (expected 2)