CSRF

1. 定义

  • 全称跨站请求伪造,可以强制终端用户在当前对其进行身份验证后的Web应用程序****执行非本意的操作

2. 原理

  • CSRF是一种****欺骗受害者提交恶意请求的攻击,他继承了受害者的身份和权限,代表受害者执行非本意、恶意的操作

csrf原理图

3. 满足条件

  1. 登陆****受信任网站A,并在本地生成Cookie
  2. 在****不登出A的情况下,访问危险网站B

4. 防御

  1. 验证Referer字段
    • 如果Referer是****其他网站,则有可能是CSRF攻击,考虑拒绝该请求
  2. 添加Token验证
    • 在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立拦截器来验证token,如果请求中****没有token或token不正确,则可能是CSRF攻击
  3. 二次验证
    • 在转账等****关键操作之前提供当前的用户密码验证码
  4. 用户养成良好习惯

5. 实例

(1). GET

  1. 登录用户账号
    image-20241005234621153

  2. 构造含有恶意代码的url

    image-20241005234757786

  3. 欺骗用户点击

  4. 成功修改
    image-20241005235206203


(2). POST

  1. 登录用户账号
    image-20241005235339730

  2. 构造含有恶意代码的链接

    image-20241005235420470

  3. 欺骗用户点击链接
    image-20241005235452336

  4. 成功更改
    image-20241005235511544


6. 与XSS区别

(1). 原理上

  • XSS是将****恶意代码插入到html页面中,当用户浏览页面时,插入的恶意代码被执行,从而达到目的
  • CSRF是一种****欺骗受害者提交恶意请求的攻击,代表受害者执行非本意、恶意的操作

(2). 其他角度

  1. XSS针对****客户端,CSRF针对服务端
  2. XSS是****利用合法用户获取信息,CSRF是伪造成合法用户发起请求
  3. CSRF****危害性高于XSS,且相比难以防御
  4. XSS有局限性,CSRF没有局限性
  5. XSS可以达到CSRF的效果,反之不行

7. 同源策略

(1). 定义

  • 同源,即指相同****域名、端口、协议

(2). 受约束对象

  • 浏览器上的****DOMCookie、第三方插件、XMLHttpRequest

(3). 不受约束对象

  • 重定向、页面中的链接、表单提交

8. 跨域问题

(1). 定义

  • 不同源的脚本****不能操作其他源下面的对象,因此不同域之间请求数据的操作,称为跨域

(2). 解决方法

a. document.domain跨域
①概述
  • 两个页面一级域名相同,**只是二级域名不同,可以通过设置document.domain**来共享Cookie
②缺点
  1. 只能在父域名与子域名之间使用
  2. 存在安全问题,当一个站点被攻击后,另一个站点会引起安全漏洞
  3. 只使用于****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的一种“使用模式”,可以让网页从别的域名那获取资料,即跨域读取数据。
②存在问题
  1. 存在安全问题,需要网站双方商议基础token的身份验证
  2. 只能是GET
  3. 可能被注入恶意代码,篡改页面内容,可以采用字符串过滤来规避此问题
③实例
  1. 服务端创建Express服务器,并开启监听
    data.js文件内容
    Express服务器开启监听
  2. 客户端构造html页面,嵌入恶意代码,模拟真实场景
    客户端页面
  3. 客户端访问该html页面,发现能成功从另一服务器获得数据,实现了跨域资源获取
    客户端访问页面
    JSONP成功跨域获取资源

c. CORS跨域
①说明
  1. CORS(Cross-Origin Resource Sharing,跨域资源共享)是一个W3C标准,允许浏览器向跨源服务器发送****XMLHttpRequest请求
  2. 利用****JavaScript无法控制HTTP头的特点,通过目标返回的HTTP头授权是否允许跨域访问
  3. 不同于只能使用get的JSONP,可****以使用post
②. 漏洞检测
  1. curl
    curl https://www.baidu.com -H "Origin:https://qq.com" -I
    
  2. burp抓包,查看返回包
    tips:Access-Control-Allow-Origin的值,
    值为Null,意味着信任任何区域
    
③实例
  1. 使用button
    1. 在客户端构造代码布局
      button方式客户端布局
    2. 访问该页面
      CORS-Button-访问该页面
    3. 点击按钮,成功显示
      CORS-Button-成功显示
  2. 输出到文件
    1. 构建攻击者服务器代码(虚拟机)
      CORS-file-攻击者服务器代码
    2. 构建客户端代码(物理机)
      CORS-file-客户端布局
    3. 直接访问该前端页面
    4. 攻击者服务端有responseText对象内容产生
      CORS-file-生成内容