Web安全学习笔记 XSS上

繁枝插云欣 ——ICML8


  1. XSS的分类和基本认识
  2. XSS的危害
  3. 同源策略的基本认识

一.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.coma.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上的更多相关文章

  1. Web安全学习笔记 SQL注入上

    Web安全学习笔记 SQL注入上 繁枝插云欣 --ICML8 SQL注入分类 SQL注入检测 一.注入分类 1.简介 SQL注入是一种代码注入技术用于攻击数据驱动的应用程序在应用程序中,如果没有做恰当 ...

  2. 【前端】移动端Web开发学习笔记【2】 & flex布局

    上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...

  3. 【前端】移动端Web开发学习笔记【1】

    下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...

  4. 【前端】Web前端学习笔记【2】

    [2016.02.22至今]的学习笔记. 相关博客: Web前端学习笔记[1] 1. this在 JavaScript 中主要有以下五种使用场景 在全局函数调用中,this 绑定全局对象,浏览器环境全 ...

  5. 【前端】Web前端学习笔记【1】

    ... [2015.12.02-2016.02.22]期间的学习笔记. 相关博客: Web前端学习笔记[2] 1. JS中的: (1)continue 语句 (带有或不带标签引用)只能用在循环中. ( ...

  6. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  7. Web前端学习笔记(001)

    ....编号    ........类别    ............条目  ................明细....................时间 一.Web前端学习笔记         ...

  8. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

  9. Web Service学习笔记:动态调用WebService

    原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我 ...

随机推荐

  1. Zookeeper 的典型应用场景 ?

    Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员 可以使用它来进行分布式数据的发布和订阅. 通过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watch ...

  2. 插值方法 - Newton向前向后等距插值

    通常我们在求插值节点的开头部分插值点附近函数值时,使用Newton前插公式:求插值节点的末尾部分插值点附近函数值时,使用Newton后插公式. 代码: 1 # -*- coding: utf-8 -* ...

  3. js和原生应用常用的数据交互方式

    场景1 在原生app中经常会使用到H5页面,比如说电商中的活动页,一些电商中的详情页,等等...这些页面都有一个特点,那就是在未来修改的可能性,和一次性的几率特别的大.所以用H5的页面是最睿智的一种选 ...

  4. 2022DASCTF X SU 三月春季挑战赛 Calc

    查看代码 #coding=utf-8 from flask import Flask,render_template,url_for,render_template_string,redirect,r ...

  5. Linux 0.11源码阅读笔记-文件管理

    Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件. 磁盘分区 生磁盘可以被分区,分区中可以安装文件系统, ...

  6. AS之AlertDialog使用

    关于AlertDialog的使用,主要是去做一个弹窗. import android.content.DialogInterface; import android.os.Bundle; import ...

  7. PAT B1014 福尔摩斯约会

    大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明白了,字条上奇 ...

  8. IDEA个人常用快捷键

    Ctrl+Z:撤销 Ctrl+Shift+Z:重做 Ctrl+X:剪贴 Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+Y:删除当前行 Ctrl+D:复制当前行 Alt+向左箭头:返回上次光标位置 ...

  9. 使用 ssm 实现登录日志记录

    使用 ssm 实现登录日志记录 学习总结 一.基础准备 1. 实现效果 2. 数据表 2.1 登陆日志信息表 2.3 员工表 二.代码实现 1. SysLogLogin 实体类 2. LogAspec ...

  10. jsp基础、el技术、jstl标签、javaEE的开发模式

    一.jsp技术基础 1.jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%=java变量或表达式> ...