CSRF
1. 定义
- 全称跨站请求伪造,可以强制终端用户在当前对其进行身份验证后的Web应用程序****执行非本意的操作
2. 原理
- CSRF是一种****欺骗受害者提交恶意请求的攻击,他继承了受害者的身份和权限,代表受害者执行非本意、恶意的操作
3. 满足条件
- 登陆****受信任网站A,并在本地生成Cookie
- 在****不登出A的情况下,访问危险网站B
4. 防御
- 验证Referer字段
- 如果Referer是****其他网站,则有可能是CSRF攻击,考虑拒绝该请求
- 添加Token验证
- 在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立拦截器来验证token,如果请求中****没有token或token不正确,则可能是CSRF攻击
- 二次验证
- 在转账等****关键操作之前提供当前的用户密码或验证码
- 用户养成良好习惯
5. 实例
(1). GET
-
登录用户账号
-
构造含有恶意代码的url
-
欺骗用户点击
-
成功修改
(2). POST
-
登录用户账号
-
构造含有恶意代码的链接
-
欺骗用户点击链接
-
成功更改
6. 与XSS区别
(1). 原理上
- XSS是将****恶意代码插入到html页面中,当用户浏览页面时,插入的恶意代码被执行,从而达到目的
- CSRF是一种****欺骗受害者提交恶意请求的攻击,代表受害者执行非本意、恶意的操作
(2). 其他角度
- XSS针对****客户端,CSRF针对服务端
- XSS是****利用合法用户获取信息,CSRF是伪造成合法用户发起请求
- CSRF****危害性高于XSS,且相比难以防御
- XSS有局限性,CSRF没有局限性
- XSS可以达到CSRF的效果,反之不行
7. 同源策略
(1). 定义
- 同源,即指相同****域名、端口、协议
(2). 受约束对象
- 浏览器上的****DOM、Cookie、第三方插件、XMLHttpRequest
(3). 不受约束对象
- 重定向、页面中的链接、表单提交
8. 跨域问题
(1). 定义
- 不同源的脚本****不能操作其他源下面的对象,因此不同域之间请求数据的操作,称为跨域
(2). 解决方法
a. document.domain跨域
①概述
- 两个页面一级域名相同,**只是二级域名不同,可以通过设置document.domain**来共享Cookie
②缺点
- 只能在父域名与子域名之间使用
- 存在安全问题,当一个站点被攻击后,另一个站点会引起安全漏洞
- 只使用于****Cookie和iframe窗口
网页A:http://a.baidu.com/index.html
网页B:http://b.baidu.com/index.html
将document.doamin属性设置为相同,例如document.domain=‘baidu.com’,就能实现两个页面之间的任意通信
b. JSONP跨域
①说明
- 利用
<script>
的src不受同源策略约束来实现跨域获取数据,主要是根据**回调函数callbakc()**的使用 - **jsonp(JSON with Padding)**是json的一种“使用模式”,可以让网页从别的域名那获取资料,即跨域读取数据。
②存在问题
- 存在安全问题,需要网站双方商议基础token的身份验证
- 只能是GET
- 可能被注入恶意代码,篡改页面内容,可以采用字符串过滤来规避此问题
③实例
- 服务端创建Express服务器,并开启监听
- 客户端构造html页面,嵌入恶意代码,模拟真实场景
- 客户端访问该html页面,发现能成功从另一服务器获得数据,实现了跨域资源获取
c. CORS跨域
①说明
- CORS(Cross-Origin Resource Sharing,跨域资源共享)是一个W3C标准,允许浏览器向跨源服务器发送****XMLHttpRequest请求
- 利用****JavaScript无法控制HTTP头的特点,通过目标返回的HTTP头授权是否允许跨域访问
- 不同于只能使用get的JSONP,可****以使用post
②. 漏洞检测
- curl
curl https://www.baidu.com -H "Origin:https://qq.com" -I
- burp抓包,查看返回包
tips:Access-Control-Allow-Origin的值, 值为Null,意味着信任任何区域
③实例
- 使用button
- 在客户端构造代码布局
- 访问该页面
- 点击按钮,成功显示
- 在客户端构造代码布局
- 输出到文件
- 构建攻击者服务器代码(虚拟机)
- 构建客户端代码(物理机)
- 直接访问该前端页面
- 攻击者服务端有responseText对象内容产生
- 构建攻击者服务器代码(虚拟机)