XSS和CSRF两种攻击方式

2023-12-20 13:10
文章标签 两种 xss csrf 攻击方式

本文主要是介绍XSS和CSRF两种攻击方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是xss攻击

Cross-Site Scripting(跨站脚本攻击),简称XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如Cookie、SessionID等,进而危害数据安全。

xss攻击的本质是将数据注入到静态代码中(如html和js等),当浏览器渲染html时就会触发注入的脚本引发xss攻击。

xss攻击产生的原因是对用户的输入过滤不严格,在能够同用户实现交互的地方更容易发现xss漏洞。

如何注入xss攻击

  • 在HTML内嵌的文本中,恶意内容以script标签形成注入
  • 在内联的JavaScript中,拼接的数据突破了原本的限制(字符串,变量,方法名)等
  • 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签
  • 在标签的 href、src 等属性中,包含 javascript: (伪协议)等可执行代码
  • 在 onload、onerror、onclick 等事件中,注入不受控制代码
    总之,任何可以输入的地方都可能引起xss攻击

xss攻击的分类

根据攻击来源xss攻击可以分为三类

反射性xss
什么是反射性xss

反射型XXS是一种非持久性的攻击,它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的目的。这里插入的恶意代码并没有保存在目标网站,需要引诱用户点击一个链接到目标网站的恶意链接来实施攻击。

反射性xss攻击的步骤
  • 攻击者构造特殊的URL(包含了恶意代码)
  • 用户打开带有恶意代码的URL之后,服务端将恶意代码取出来,拼接在html中返回给浏览器
  • 用户浏览器收到响应后解析执行,恶意代码也被执行
  • 恶意代码窃取用户的信息发到攻击者网站或者冒充用户做攻击者的目标行为
存储性xss
什么是存储性xss攻击

存储型xss是一种持久性攻击,存储型xss就是攻击者的恶意代码会保存到服务器中,比如留言板评论区这种公共区域,当其他用户访问存储有恶意代码的页面时就会触发恶意代码。存储型和反射性xss的区别在于,反射性xss需要用户点击恶意链接才能执行代码,而存储型xss是不需要访问合法网站以外的任何链接的。

存储性xss攻击的步骤
  • 攻击者将恶意代码提交到目标网站的数据库
  • 用户打开目标网站,服务端将恶意代码从数据库中取出拼接在html中返回给浏览器
  • 用户浏览器收到响应后解析执行,恶意代码也被执行
  • 恶意代码窃取用户的信息发到攻击者网站或者冒充用户做攻击者的目标行为
DOM型xss
什么是DOM型攻击

务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型

DOM型攻击的步骤
  • 攻击者构造出特殊的 URL,其中包含恶意代码。
  • 用户打开含有恶意代码的目标网站
  • 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行
  • 恶意代码窃取用户的信息发到攻击者网站或者冒充用户做攻击者的目标行为

DOM型xss攻击和反射性xss攻击、存储性攻击的区别是:DOM型xss攻击属于前端自身的安全漏洞,其他两种属于是服务端安全漏洞。

三种xss攻击的简单对比
类型存储区插入点安全漏洞类型
反射型URLHTML后端漏洞
存储性后端数据库HTML后端漏洞
DOM型后端数据库;前端存储;URLJavaScript前端漏洞

如何防御xss攻击

  • httpOnly:在cookie中设置HttpOnly属性后,js脚本将无法读取到cookie信息
  • 使用 XSS Filter:针对用户提交的数据进行有效的验证,只接受我们规定的长度或内容的提交,过滤掉其他的输入内容
  • 转义HTML:如果拼接 HTML 是必要的,就需要对于引号,尖括号,斜杠进行转义,并且对 HTML 模板各处插入点进行充分的转义,就需要采用合适的转义库

什么是CSRF攻击

Cross-site request forgery(跨站请求伪造),是一种挟持用户在当前已登陆的Web应用程序上执行非本意的操作的攻击方法。如:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

CSRF攻击的原理

  • 用户打开浏览器,访问安全网站A,输入用户名和密码请求登录网站A
  • 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录A成功,可以正常发送请求到网站A。
  • 用户没有退出A之前,在同一个浏览器中,打开一个Tab页面来访问网站B
  • 网站B接收到用户的请求后,返回一些攻击代码,并且发出一个请求要求访问第三方站点A
  • 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发出的,所以会根据用户C的cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

具体流程看下图:
在这里插入图片描述

CSRF的特点

  • 由第三方网站发起攻击
  • 利用被攻击这的登录凭证,冒充被攻击者,不会直接盗取数据
  • 攻击者仅仅是冒用被攻击者的登录凭证
  • 跨站请求可以通过form表单,cors,URL等,也可以直接嵌入第三方论坛,很难追踪

如何防御CSRF攻击

  • 验证 HTTP Referer 字段:根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站。这种方法简单易实行,但是也有漏洞,因为referer会记录用户的访问来源,很多用户认为会泄露隐私,很多企业也怕内网信息泄露到外网。
  • 在请求地址中添加 token 并验证:CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
  • 在 HTTP 头中自定义属性并验证:这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

xss和CSRF的区别

  • CSRF由xss实现的
  • CSRF是http问题,xss是代码注入问题

这篇关于XSS和CSRF两种攻击方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/516168

相关文章

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

CentOS7增加Swap空间的两种方法

《CentOS7增加Swap空间的两种方法》当服务器物理内存不足时,增加Swap空间可以作为虚拟内存使用,帮助系统处理内存压力,本文给大家介绍了CentOS7增加Swap空间的两种方法:创建新的Swa... 目录在Centos 7上增加Swap空间的方法方法一:创建新的Swap文件(推荐)方法二:调整Sww

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下: