XSS 攻击详解,为什么建议 Cookie 加上 HttpOnly 属性?
文章地址:juejin.im/post/6857698580817182728
松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
松哥最近在研究 Spring Security 源码,有的时候也会在网上看一些别人写的文章,有的写的确实不赖!本来我想自己整一篇 XSS 攻击的文章,但是看到这篇文章后就不想动手了,我想说的都被作者说了。今天就和小伙伴们分享一篇 XSS 攻击相关的文章。
什么是 XSS?
Xss 全称 Cross Site Scripting(跨站脚本),为了与 “CSS” 区别,就使用 XSS 作为简称。XSS 攻击是指 hacker 往 HTML 文件中注入恶意脚本,从而在用户浏览页面时运行恶意脚本对用户实施攻击的一种手段。
当页面被注入了恶意 JavaScript 脚本时,浏览器是无法区分这些脚本是否是被恶意注入的还是正常的页面脚本,所以恶意注入 JavaScript 脚本也拥有所有的脚本权限。
如果页面被注入了恶意 JavaScript 脚本,恶意脚本都能做哪些事情?
- 窃取 Cookie 信息:通过恶意 js 脚本获取 Cookie 信息,然后通过 ajax 加上 CORS 功能将数据发送给恶意服务器,恶意服务器拿到用户的 Cookie 信息之后,就可以模拟用户的登录,然后进行账户操作。
- 监听用户行为:通过恶意 js 脚本,可以做到监听用户各种事件,比如获取登陆的键入字符串完成 hack 用户信息。
- 更改 DOM 结构:比较常见的就是通过运营商或者路由器添加浮窗广告,增收自身收入。
如何进行 XSS 攻击?
XSS 主要分为三种类型:存储型 XSS 攻击;反射型 XSS 攻击和基于 DOM 的 XSS 攻击。
1.存储型 XSS 攻击
通过上图,我们可以看出存储型 XSS 攻击大致需要经过如下步骤:
- 首先 hacker 利用站点漏洞将一段恶意 JavaScript 代码提交到网站的数据库中;
- 然后用户向网站请求包含了恶意 JavaScript 脚本的页面;
- 当用户浏览该页面的时候,恶意脚本就会将用户的 Cookie 信息等数据上传到服务器。
一个例子:
以 2015 年喜马拉雅就被曝出的存储型 XSS 漏洞为例,看看整个 XSS 攻击流程。
在用户设置专辑名称时,服务器对关键字过滤不严格,使得在编辑专辑名称的时候可以设置为一段 JavaScript,如下图所示:
当 hacker 将专辑名称设置为一段 JavaScript 代码并提交时,喜马拉雅的服务器会保存该段 JavaScript 代码到数据库中。然后当用户打开 hacker 设置的专辑时,这段代码就会在用户的页面里执行(如下图)
恶意脚本可以通过 XMLHttpRequest 或者 Fetch 将用户的 Cookie 数据上传到黑客的服务器。
再通过手动设置 Cookie 就可以绕过,直接登陆喜马拉雅。
以上就是存储型 XSS 攻击的一个典型案例。这是乌云网在 2015 年曝出来的,虽然乌云网由于某些原因被关停了。默哀。
2.反射型 XSS 攻击
在一个反射型 XSS 攻击过程中,hacker 需要找到一个接口漏洞,用户给服务器发送的一些参数后,服务器没有经过处理,直接原封返回了部分参数,就给了黑客可乘之机,把恶意 JavaScript 脚本当参数发给服务器,服务器直接返回了这个脚本字符串,在浏览器 DOM 解析器中就顺利引入恶意脚本达成 hack。
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', {
title: 'Express',
xss:req.query.xss
});
});
module.exports = router;
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
<div>
<%- xss %>
</div>
</body>
</html>
访问:http://localhost:3000/?xss=123
hacker 找到了这个漏洞,拼凑了一个这样的 url:http://localhost:3000/?xss=< script src="xxx">< /script>,然后诱骗你点击后,在页面上就会运行恶意脚本。
值得注意的是,储存型 XSS 和反射性 XSS 有一个特别明显的区别就是反射型 XSS 是不会在服务器中存储脚本的,所有诱骗用户的方式也不同,hack 储存型 XSS的工作量主要在如果上传恶意脚本,剩下的就要等用户点击正常网页,反射型则需要诱骗用户主动点击包含漏洞 url。
3.基于 DOM 的 XSS 攻击
一般来说,hacker 是劫持不了正常的传输网络,但如果有内鬼能通过中间人代理劫持 html 传输,就可以修改 html 文件在其中任意穿插恶意脚本,再发送给用户。一般来说,这种情况出现于运营商中间,所以基于 DOM 的 XSS 我觉得应该称为基于内鬼的 XSS 攻击(狗头)。
如何阻止 XSS 攻击
- 存储型和反射型 XSS 都是服务器没有严格检测用户输入数据,即不能相信用户的任何输入。通过给用户输入做过滤,例如将用户输入:转码,成<scriptscr='xxx'></script>,这样浏览器的 DOM 解析器就不能运行恶意脚本。
- 对于基于 DOM 的 XSS 攻击,使用 HTTPS 进行传输 html,可以避免中间人能更改 html 文件。
- 充分利用 CSP,严格实施 CSP 操作,可以有效防范 XSS 攻击。3.1 限制加载其他域下的资源文件,这样即使黑客插入了一个 JavaScript 文件,这个 JavaScript 文件也是无法被加载的;3.2 禁止向第三方域提交数据,这样用户数据也不会外泄;3.3 禁止执行内联脚本和未授权的脚本;还提供了上报机制,这样可以帮助我们尽快发现有哪些 XSS 攻击,以便尽快修复问题。
- 使用 HttpOnly 属性。避免 js 脚本操作 Cookie,即使页面被注入了恶意 JavaScript 脚本,也是无法获取到设置了 HttpOnly 的数据。因此一些比较重要的数据我们建议设置 HttpOnly 标志。
总结
XSS 攻击就是黑客往页面中注入恶意脚本,然后将页面的一些重要数据上传到恶意服务器。
常见的三种 XSS 攻击模式是存储型 XSS 攻击、反射型 XSS 攻击和基于 DOM 的 XSS 攻击。
这三种攻击方式的共同点是都需要往用户的页面中注入恶意脚本,然后再通过恶意脚本将用户数据上传到黑客的恶意服务器上。而三者的不同点在于注入的方式不一样,有通过服务器漏洞来进行注入的,还有在客户端直接注入的。
针对这些 XSS 攻击,主要有三种防范策略,第一种是通过服务器对输入的内容进行过滤或者转码,第二种是充分利用好 CSP,第三种是使用 HttpOnly 来保护重要的 Cookie 信息。
当然除了以上策略之外,我们还可以通过添加验证码防止脚本冒充用户提交危险操作。而对于一些不受信任的输入,还可以限制其输入长度,这样可以增大 XSS 攻击的难度。
今日干货
刚刚发表
查看:13500回复:135
公众号后台回复 SpringBoot,免费获取 274 页SpringBoot修炼手册。
- 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 数组属性和方法
- 认识XML
- 基于oracle的sql(结构化查询语言)指令
- oracle约束条件
- oracle常用函数介绍
- 搞它!!!Linux系统中查看进程和计划任务管理
- 搞它!!!深入了解linux文件系统底层原理及日志文件介绍
- 搞它!!!Linux系统MBR分区和GPT分区的区别
- oracle补充
- 搞它!!!Linux系统LVM原理及磁盘配额(PV、VG、LV、PE的关系,手把手教你,嘴对嘴的传达)
- 搞它!!!linux网络服务基本设置命令合集
- 搞它!!!Linux系统上DHCP服务器的配置(理论加实验,分分钟搞定!!!)
- 搞它!!!Linux——引导、排障及修复
- 排障集锦:九九八十一难之第一难!linux发现交换文件无法打开文件!
- 排障集锦:九九八十一难之第三难!搭建DNS错误:Host xxxx not found: 2(SERVFAIL)
- 搞它!!!linux远程控制 openssh