Web安全学习笔记 XSS上
Web安全学习笔记 XSS上
繁枝插云欣 ——ICML8
- XSS的分类和基本认识
- XSS的危害
- 同源策略的基本认识
一.XSS的分类和基本认识
1. 简介
XSS全称为Cross Site Scripting
,为了和CSS分开简写为XSS,中文名为跨站脚本
。该漏洞发生在用户端
,是指在渲染过程中发生了不在预期过程中的JavaScript代码执行
。XSS通常被用于获取Cookie
、以受攻击者的身份进行操作
等行为。
2. 分类
1.反射型XSS
反射型XSS是比较常见和广泛的一类,举例来说,当一个网站的代码中包含类似下面的语句:
<?php echo "<p>hello, $_GET['user']</p>";?>
那么在访问时设置
/?user=</p><script>alert("hack")</script><p>
则可执行预设好的JavaScript代码。
反射型XSS通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发,且受到XSS Auditor、NoScript等防御手段的影响较大。
2.储存型XSS
储存型XSS相比反射型来说危害较大,在这种漏洞中,攻击者能够把攻击载荷存入服务器的数据库中,造成持久化的攻击
。
3.DOM XSS
DOM型XSS不同之处在于DOM型XSS一般和服务器的解析响应没有直接关系
,而是在JavaScript脚本动态执行的过程中产生的
。
例如
<html>
<head>
<title>DOM Based XSS Demo</title>
<script>
function xsstest()
{
var str = document.getElementById("input").value;
document.getElementById("output").innerHTML = "<img src='"+str+"'></img>";
}
</script>
</head>
<body>
<div id="output"></div>
<input type="text" id="input" size=50 value="" />
<input type="button" value="submit" onclick="xsstest()" />
</body>
</html>
输入
x' onerror='javascript:alert(/xss/)
即可触发
4.Blind XSS
Blind XSS是储存型XSS的一种,它保存在某些存储中,当一个“受害者”访问这个页面时执行,并且在文档对象模型(DOM)中呈现payload。
它被称为Blind的原因是因为它通常发生在通常不暴露给用户的功能上。
二.XSS的危害
存在XSS漏洞时,可能会导致以下几种情况:
1.用户的Cookie
被获取,其中可能存在Session ID
等敏感信息。
若服务器端没有做相应防护,攻击者可用对应Cookie
登陆服务器。
2.攻击者能够在一定限度内记录用户的键盘输入。
3.攻击者通过CSRF
等方式以用户身份执行危险操作。
4.XSS蠕虫。
5.获取用户浏览器信息。
6.利用XSS漏洞扫描用户内网。
三.同源策略的基本认识
1. 简介
同源策略限制了不同源之间如何进行资源交互,是用于隔离潜在恶意文件的重要安全机制。 是否同源由URL
决定,URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。
1.1. file域的同源策略
在之前的浏览器中,任意两个file域的URI被认为是同源的。本地磁盘上的任何HTML文件都可以读取本地磁盘上的任何其他文件。
从Gecko 1.9开始,文件使用了更细致的同源策略,只有当源文件的父目录是目标文件的祖先目录时,文件才能读取另一个文件。
1.2. cookie的同源策略
cookie使用不同的源定义方式,一个页面可以为本域和任何父域设置cookie,只要是父域不是公共后缀(public suffix
)即可。
不管使用哪个协议(HTTP/HTTPS
)或端口号,浏览器都允许给定的域以及其任何子域名访问cookie。设置 cookie时,可以使用 domain / path / secure 和 http-only 标记来限定其访问性。
所以 https://localhost:8080
/ 和 http://localhost:8081
/ 的Cookie是共享的。
1.3. Flash/SilverLight跨域
浏览器的各种插件也存在跨域需求。
通常是通过在服务器配置crossdomain.xml
设置本服务允许哪些域名的跨域访问
客户端会请求此文件,如果发现自己的域名在访问列表里,就发起真正的请求,否则不发送请求。
2. 源的更改
同源策略认为域和子域属于不同的域,例如 child1.a.com
与a.com
/ child1.a.com
与 child2.a.com
/ xxx.child1.a.com
与 child1.a.com
两两不同源。
对于这种情况,可以在两个方面各自设置 document.domain='a.com'
来改变其源来实现以上任意两个页面之间的通信。
另外因为浏览器单独保存端口号,这种赋值会导致端口号被重写为 null
。
3. 跨源访问
同源策略控制了不同源之间的交互,这些交互通常分为三类:
1.通常允许跨域写操作(Cross-origin writes)
链接(links)
重定向
表单提交
2.通常允许跨域资源嵌入(Cross-origin embedding)
3.通常不允许跨域读操作(Cross-origin reads)
可能嵌入跨源的资源的一些示例有:
<script src="..."></script> 标签嵌入跨域脚本
语法错误信息只能在同源脚本中捕捉到
<link rel="stylesheet" href="..."> 标签嵌入CSS
由于CSS的松散的语法规则
CSS的跨域需要一个设置
正确的Content-Type 消息头
<img> / <video> / <audio> 嵌入多媒体资源。
<object> <embed> 和 <applet> 的插件。
@font-face 引入的字体
一些浏览器允许跨域字体( cross-origin fonts)
一些需要同源字体(same-origin fonts)
<frame> 和 <iframe> 载入的任何资源
站点可以使用X-Frame-Options消息头
来阻止这种形式的跨域交互
3.1. JSONP跨域
JSONP就是利用 <script>
标签的跨域能力实现跨域数据的访问,请求动态生成的JavaScript脚本同时带一个callback函数名作为参数。
服务端收到请求后,动态生成脚本产生数据,并在代码中以产生的数据为参数调用callback函数。
JSONP也存在一些安全问题,例如当对传入/传回参数没有做校验就直接执行返回的时候,会造成XSS问题。没有做Referer或Token校验就给出数据的时候,可能会造成数据泄露。
另外JSONP在没有设置callback函数的白名单情况下,可以合法的做一些设计之外的函数调用,引入问题。这种攻击也被称为SOME攻击。
3.2. 跨源脚本API访问
Javascript的APIs中,如 iframe.contentWindow
, window.parent
, window.open
和 window.opener
允许文档间相互引用。当两个文档的源不同时,这些引用方式将对 window
和 location
对象的访问添加限制。
window
允许跨源访问的方法有
window.blur window.close window.focus window.postMessage
window
允许跨源访问的属性有
window.closed window.frames window.length window.location window.opener window.parent window.self window.top window.window
其中 window.location
允许读/写,其他的属性只允许读
3. 跨源数据存储访问
存储在浏览器中的数据,如 localStorage
和 IndexedDB
,以源进行分割。每个源都拥有自己单独的存储空间,一个源中的Javascript脚本不能对属于其它源的数据进行读写操作。
4. CORS
CORS是一个W3C标准,全称是跨域资源共享(Cross-origin resource sharing)。通过这个标准,可以允许浏览器读取跨域的资源。
4.1. 常见请求头
Origin
预检请求或实际请求的源站URI,
浏览器请求默认会发送该字段
Origin: <origin>
Access-Control-Request-Method
声明请求使用的方法
Access-Control-Request-Method: <method>
Access-Control-Request-Headers
声明请求使用的header字段
Access-Control-Request-Headers: <field-name>[, <field-name>]*
4.2. 常见返回头
Access-Control-Allow-Origin
声明允许访问的源外域URI
对于携带身份凭证的请求不可使用通配符 *
Access-Control-Allow-Origin: <origin> | *
Access-Control-Expose-Headers
声明允许暴露的头
e.g. Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header
Access-Control-Max-Age
声明Cache时间
Access-Control-Max-Age: <delta-seconds>
Access-Control-Allow-Credentials
声明是否允许在请求中带入
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods
声明允许的访问方式
Access-Control-Allow-Methods: <method>[, <method>]*
Access-Control-Allow-Headers
声明允许的头
Access-Control-Allow-Headers: <field-name>[, <field-name>]*
4.3. 防御建议
如非必要不开启CORS 定义详细的白名单,不使用通配符,仅配置所需要的头 配置 Vary: Origin
头部 如非必要不使用 Access-Control-Allow-Credentials
限制缓存的时间
5. 阻止跨源访问
阻止跨域写操作,可以检测请求中的 CSRF token
这个标记被称为Cross-Site Request Forgery (CSRF) 标记。
阻止资源的跨站读取,因为嵌入资源通常会暴露信息,需要保证资源是不可嵌入
的。但是多数情况下浏览器都不会遵守 Content-Type
消息头
例如如果在HTML文档中指定 <script>
标记
则浏览器会尝试将HTML解析为JavaScript
Web安全学习笔记 XSS上的更多相关文章
- Web安全学习笔记 SQL注入上
Web安全学习笔记 SQL注入上 繁枝插云欣 --ICML8 SQL注入分类 SQL注入检测 一.注入分类 1.简介 SQL注入是一种代码注入技术用于攻击数据驱动的应用程序在应用程序中,如果没有做恰当 ...
- 【前端】移动端Web开发学习笔记【2】 & flex布局
上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...
- 【前端】移动端Web开发学习笔记【1】
下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...
- 【前端】Web前端学习笔记【2】
[2016.02.22至今]的学习笔记. 相关博客: Web前端学习笔记[1] 1. this在 JavaScript 中主要有以下五种使用场景 在全局函数调用中,this 绑定全局对象,浏览器环境全 ...
- 【前端】Web前端学习笔记【1】
... [2015.12.02-2016.02.22]期间的学习笔记. 相关博客: Web前端学习笔记[2] 1. JS中的: (1)continue 语句 (带有或不带标签引用)只能用在循环中. ( ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- Web前端学习笔记(001)
....编号 ........类别 ............条目 ................明细....................时间 一.Web前端学习笔记 ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- Web Service学习笔记:动态调用WebService
原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我 ...
随机推荐
- 转载:TCP协议如何保证可靠传输
转载至:https://www.cnblogs.com/xiaokang01/p/10033267.html TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序 ...
- Zookeeper Watcher 机制 -- 数据变更通知 ?
Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务 端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通 知来实现分布式的通知功 ...
- Linux内核, 编译一个自己的内核
本文,我们将一步一步地介绍如何从源代码编译和安装一个Linux内核.需要注意的是本指导基于Ubuntu 20.04版本编译安装,其它发行版可能会有差异. 在前面文章中我们反复提到过Linux内核, ...
- 如何解决Ubuntu下的“E: Unable to correct problems, you have held broken packages.”的问题. aptitude
今天安装build-essential时出现了以下问题,这属于包的依赖. 解决方案: 1,sudo apt-get install aptitude:完成aptitude命令安装 2,sudo apt ...
- (stm32f103学习总结)—RTC独立定时器—实时时钟实验
一.STM32F1 RTC介绍 1.1 RTC简介 STM32 的实时时钟( RTC)是一个独立的定时器. STM32 的 RTC 模 块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的 ...
- (stm32f103学习总结)—待机唤醒实验
一.STM32待机模式介绍 1.1 STM32低功耗模式介绍 很多单片机具有低功耗模式,比如MSP430.STM8L等,我们的STM32 也不例外.默认情况下,系统复位或上电复位后,微控制器进入运行模 ...
- 浏览器默认解析文档模式IE7
背景:实习期间开发了一套页面,兼容到IE8+,可是在给产品体验时,他的QQ浏览器默认解析到了文档模式IE7,出现了页面的兼容性问题.问题排查:QQ浏览器目前有两个模式,极速模式和兼容模式,其中极速模式 ...
- 居中的css:完全指南(翻译)
这里主要参考的是CHRIS COYIER写的一篇的文章(点击查看),主要讲了关于css水平.垂直居中的一些方法,每个方法后面都有一个demo,可以在线查看效果. 1 水平 水平居中有行内元素和块元素, ...
- web项目中视频的上传和展示
思路: 上传:<form>表单提交视频-->后台使用字节流保存到本地. 展示:<video>标签展示: src属性发送请求 --> 使用字节流将视频绑定到响应并返回 ...
- 老版本的Spring应用该如何应对CVE-2022-22965漏洞?
昨天,在发布了<Spring官宣承认网传大漏洞,并提供解决方案>之后.群里就有几个小伙伴问了这样的问题:我们的Spring版本比较老,该怎么办?这是一个好问题,所以DD今天单独拿出来说说. ...