浏览器原理 32 # 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?

简介: 浏览器原理 32 # 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?

说明

浏览器工作原理与实践专栏学习笔记



前言

支持页面中的第三方资源引用和 CORS 也带来了很多安全问题,其中最典型的就是 XSS 攻击。



什么是 XSS 攻击


   XSS 全称是 Cross Site Scripting,为了与“CSS”区分开来,故简称 XSS,翻译过来就是“跨站脚本”。XSS 攻击是指黑客往 HTML 文件中或者 DOM 中注入恶意脚本,从而在用户浏览页面时利用注入的恶意脚本对用户实施攻击的一种手段。


恶意脚本能做的事情:

  • 窃取 Cookie 信息
  • 监听用户行为
  • 修改 DOM
  • 在页面内生成浮窗广告


注入恶意脚本的三种方式

通常情况下,主要有存储型 XSS 攻击反射型 XSS 攻击基于 DOM 的 XSS 攻击三种方式来注入恶意脚本。


1. 存储型 XSS 攻击

存储型 XSS 攻击是怎么向 HTML 文件中注入恶意脚本的:


20210611110202359.png


  1. 黑客利用站点漏洞将一段恶意 JavaScript 代码提交到网站的数据库中
  2. 用户向网站请求包含了恶意 JavaScript 脚本的页面
  3. 当用户浏览该页面的时候,恶意脚本就会将用户的 Cookie 信息等数据上传到服务器


典型例子:喜马拉雅存储型 XSS 漏洞


乌云网(由于某些原因被关停了)在 2015 年曝出来的,参见:


https://bugs.shuimugan.com/bug/view?bug_no=138479

  起因是在用户设置专辑名称时,服务器对关键字过滤不严格,导致黑客将恶意代码存储到漏洞服务器上。


20210611113011674.png


2.然后用户打开了含有恶意脚本的页面,这段代码就会在用户的页面里执行,这样就可以窃取 Cookie 等数据信息。


20210611113208284.png


3.恶意脚本可以通过 XMLHttpRequest 或者 Fetch 将用户的 Cookie 数据上传到黑客的服务器


20210611113912265.png



4.黑客利用 Cookie 信息登录用户账户

2021061111401221.png



2. 反射型 XSS 攻击

   在一个反射型 XSS 攻击过程中,恶意 JavaScript 脚本属于用户发送给网站请求中的一部分,随后网站又把恶意 JavaScript 脚本返回给用户。当恶意 JavaScript 脚本在用户页面中被执行时,黑客就可以利用该脚本做一些恶意操作。


接下来我们搭建一个简单的 Node 服务程序来看看什么是反射型 XSS

  1. 在一个新的文件夹里打开控制台输入下面两个命令进行初始化操作,以及依赖安装
npm init
npm i express ejs


2021061118142537.png



  1. 测试代码编写

路由代码:index.js

var express = require('express');
var app = express();
var ejs = require('ejs');
// 设置html引擎
app.engine('html', ejs.renderFile);
app.set('views', __dirname + '/');
// 设置视图引擎
app.set('view engine', 'html');
app.get('/', function(req, res, next) {
  console.log('进入首页:哈哈哈哈');
  res.render('index', {
    title: '凯小默的 xss 测试页面',
    xss: req.query.xss
  });
});
app.listen(3000, () => {
  console.log('服务启动成功!!!');
  console.log("server listen on localhost:3000");
});


视图代码:index.html

<!DOCTYPE html>
<html>
<head>
  <title><%= title %></title>
</head>
<body>
  <h1><%= title %></h1>
  <p>Welcome to <%= title %></p>
  <div>
    <!-- 将 URL 中 xss 参数的内容显示在页面 -->
    <%- xss %>
  </div>
</body>
</html>


  1. 启动服务,然后我们访问:http://localhost:3000/?xss=kaimo666
node index.js


20210611200506435.png


4.页面效果:xss参数被渲染到了页面


20210611200802526.png



5.改变参数的值换成 http://localhost:3000/?xss=<script>alert('你被xss攻击了')</script>


2021061120130290.png



6.看一下dom,发现恶意脚本插入到页面中了。

20210611201333837.png



总结:从上面的例子我们可以看出,用户将一段含有恶意代码的请求提交给 Web 服务器,Web 服务器接收到请求时,又将恶意代码反射给了浏览器端,这就是反射型 XSS 攻击。

注意:Web 服务器不会存储反射型 XSS 攻击的恶意脚本,这是和存储型 XSS 攻击不同的地方。



3. 基于 DOM 的 XSS 攻击

基于 DOM 的 XSS 攻击是不牵涉到页面 Web 服务器的。主要是在 Web 资源传输过程或者在用户使用页面的过程中修改 Web 页面的数据。


比如:

  • 通过 WiFi 路由器劫持的
  • 通过本地恶意软件来劫持的



如何阻止 XSS 攻击

  • 存储型 XSS 攻击和反射型 XSS 攻击都是需要经过 Web 服务器来处理,属于服务端的安全漏洞
  • 基于 DOM 的 XSS 攻击是在浏览器端完成的,属于前端的安全漏洞


不同 XSS 攻击的共同点:首先往浏览器中注入恶意脚本,然后再通过恶意脚本将用户信息发送至黑客部署的恶意服务器上。


阻止 XSS 攻击的本质:通过阻止恶意 JavaScript 脚本的注入和恶意消息的发送来实现。



1. 服务器对输入脚本进行过滤或转码

比如:

code:<script>alert('你被xss攻击了')</script>


过滤

code:


转码

code:&lt;script&gt;alert(&#39;你被xss攻击了&#39;)&lt;/script&gt;



2. 充分利用 CSP

CSP 功能:


限制加载其他域下的资源文件,这样即使黑客插入了一个 JavaScript 文件,这个 JavaScript 文件也是无法被加载的;

禁止向第三方域提交数据,这样用户数据也不会外泄;

禁止执行内联脚本和未授权的脚本;

还提供了上报机制,这样可以帮助我们尽快发现有哪些 XSS 攻击,以便尽快修复问题。



3. 使用 HttpOnly 属性

由于很多 XSS 攻击都是来盗用 Cookie 的,因此还可以通过使用 HttpOnly 属性来保护我们 Cookie 的安全。


通常服务器可以将某些 Cookie 设置为 HttpOnly 标志,HttpOnly 是服务器通过 HTTP 响应头来设置的。

比如:下面是打开 Google 时,HTTP 响应头中的一段:set-cookie 属性值最后使用了 HttpOnly 来标记该 Cookie。

set-cookie: NID=189=M8q2FtWbsR8RlcldPVt7qkrqR38LmFY9jUxkKo3-4Bi6Qu_ocNOat7nkYZUTzolHjFnwBw0izgsATSI7TZyiiiaV94qGh-BzEYsNVa7TZmjAYTxYTOM9L_-0CN9ipL6cXi8l6-z41asXtm2uEwcOC5oh9djkffOMhWqQrlnCtOI; expires=Sat, 18-Apr-2020 06:52:22 GMT; path=/; domain=.google.com; HttpOnly


使用 HttpOnly 标记的 Cookie 只能使用在 HTTP 请求过程中,所以无法通过 JavaScript 来读取这段 Cookie。


通过 Chrome 开发者工具来查看哪些 Cookie 被标记了 HttpOnly:比如下图里的 UserInfo 这个 Cookie 的 HttpOlny 属性是被勾选上的,所以 UserInfo 的内容是无法通过 document.cookie 是来读取的。

20210611203846337.png


可以自己在控制台测试一下,输入 document.cookie ,然后 ctrl + f 去搜索 UserInfo 是找不到的。


20210611204233126.png



因此一些比较重要的数据建议设置 HttpOnly 标志。







目录
相关文章
|
6天前
|
存储 JavaScript 前端开发
前端xss攻击——规避innerHtml过滤标签节点及属性
前端xss攻击——规避innerHtml过滤标签节点及属性
29 4
|
2月前
|
JavaScript 安全 前端开发
js开发:请解释什么是XSS攻击和CSRF攻击,并说明如何防范这些攻击。
XSS和CSRF是两种常见的Web安全威胁。XSS攻击通过注入恶意脚本盗取用户信息或控制账户,防范措施包括输入验证、内容编码、HTTPOnly Cookie和CSP。CSRF攻击则诱使用户执行未经授权操作,防范手段有CSRF Tokens、双重验证、Referer检查和SameSite Cookie属性。开发者应采取这些防御措施并定期进行安全审计以增强应用安全性。
24 0
|
9天前
|
缓存 安全 JavaScript
前端安全:Vue应用中防范XSS和CSRF攻击
【4月更文挑战第23天】本文探讨了在Vue应用中防范XSS和CSRF攻击的重要性。XSS攻击通过注入恶意脚本威胁用户数据,而CSRF则利用用户身份发起非授权请求。防范措施包括:对输入内容转义、使用CSP、选择安全的库;采用Anti-CSRF令牌、同源策略和POST请求对抗CSRF;并实施代码审查、更新依赖及教育团队成员。通过这些实践,可提升Vue应用的安全性,抵御潜在攻击。
|
2天前
|
存储 安全 JavaScript
【PHP开发专栏】PHP跨站脚本攻击(XSS)防范
【4月更文挑战第30天】本文探讨了Web开发中的XSS攻击,解释了其原理和分类,包括存储型、反射型和DOM型XSS。XSS攻击可能导致数据泄露、会话劫持、网站破坏、钓鱼攻击和DDoS攻击。防范措施包括输入验证、输出编码、使用HTTP头部、定期更新及使用安全框架。PHP开发者应重视XSS防护,确保应用安全。
|
17天前
|
安全 JavaScript Go
跨站脚本攻击(XSS)防护在Django中的应用
【4月更文挑战第15天】本文介绍了Django如何防范XSS攻击。Django模板引擎自动转义HTML以防止恶意脚本,提供`mark_safe`函数和CSRF防护。此外,建议开发者验证清理用户输入、使用内容安全策略、更新库以及遵循安全编码实践来增强防护。通过这些措施,开发者能构建更安全的Web应用。
|
2月前
|
安全 JavaScript 前端开发
Low 级别反射型 XSS 演示(附链接)
Low 级别反射型 XSS 演示(附链接)
|
7月前
|
Web App开发 前端开发 JavaScript
|
5天前
解决win10无法打开自带的IE浏览器的问题
解决win10无法打开自带的IE浏览器的问题
19 0
|
2月前
|
存储 机器人
在阿里云RPA中,你可以通过以下步骤来更改默认唤醒IE浏览器的地址
【2月更文挑战第28天】在阿里云RPA中,你可以通过以下步骤来更改默认唤醒IE浏览器的地址
21 1
|
8月前
|
Web App开发 XML 编解码
IE浏览器下载文件中文文件名乱码问题解决
IE浏览器下载文件中文文件名乱码问题解决
87 0