同源策略
同源策略(Same-Origin Policy),就是为了保证互联网之中,各类资源的安全性而诞生的产物,它实际上是一个众多浏览器厂商共同遵守的约定。同源策略是浏览器中最基本的安全功能。缺少同源策略,很多浏览器的常规功能都会受到影响,可以说Web是构建在同源策略基础之上的。
如果Web世界没有同源策略,当你登录FreeBuf账号并打开另一个站点时,这个站点上的JavaScript可以跨域读取你的FreeBuf账号数据,这样的话整个WEB世界就没有 隐私而言。
浏览器的同源策略,限制了不同源的“document”或是脚本,对当前“document”或资源及其属性的读写权限。
同源策略是一种安全思想,但并不是统一的规范体系。不同语言脚本以及插件,它们的同源策略规则也不尽相同,不可一概而论。
javaScript中的同源,需要对比 两者中的协议、域名、端口。三者完全相同才认为是同源的,否则即是来自不同源的内容。
在HTML语言中,有部分标签在引用第三方资源时,不受同源策略的限制:
上述这种带src属性的标签,在加载时,实际是生成一条GET请求,向指定服务器申请资源。
前言
跨站脚本攻击(Cross Site Scripting)的缩写,为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
- 跨站: 从字面来分析,因为这个“跨”实际上是浏览器的特性,而不是缺陷,造成“跨”这样的假象是因为绝大多数XSS攻击都会采用嵌入一段远程或者第三方域上的脚本资源。
- 脚本: 跨站脚本重点已经不在“跨站”这个字母上,而是“脚本”。脚本主要是有两个:JavaScript和ActionScript。
XSS的原理
用户提交的数据没有过滤,或者过滤不严格,输出到网页中 ,导致可以构造执行JS代码,或者修改网页内容。
XSS的危害
XSS没有危害,很少有人去关注它。对于那些半年没有更新的小企业网站来说,发生XSS漏洞几乎没有什么用。但是在各类的社交平台,邮件系统,开源流行的Web应用,BBS,微博等场景中,造成的杀伤力却十分强大。
XSS的危害
- 盗取用户或者管理员的Cookie
- XSS Worm
- 挂马(水坑攻击)
- 有局限性的键盘记录
…
XSS的分类
- 反射型XSS
- 存储型XSS
- DOM XSS
- Flash XSS
反射型XSS
反射型XSS又称为非持久型XSS。XSS代码出现在URL参数或者请求中,浏览器发出请求时,参数值作为输入提交到服务器,服
务器接受处理后参数值出现在响应的HTML中,最后浏览器解析执行了这段XSS代码。
反射型XSS利用过程
- 恶意的攻击者发给受害者一个链接(链接中携带xss代码)
- 攻击者诱使受害者点开这个链接
- XSS代码被提交到有XSS漏洞的Web应用程序上
- WEB应用程序没有过滤提交上来的数据,或者过滤不严格。
- WEB应用程序输出用户提交上来的数据(包含XSS代码)。
- 用户浏览器渲染返回的HTML页面,执行返回的JavaScript代码
- 恶意的javascript代码在后台悄悄执行,获取用户信息
存储型XSS
存储型XSS,又称持久型XSS,他和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库或文件中。
- 恶意的攻击者让存在XSS漏洞的网站提交一段XSS代码
- Web应用程序接受提交数据,没有过滤或者过滤不严格
- 写入到数据库中或者是文件中
- 受害者访问这个存在XSS恶意代码的页面时
- Web应用程序从数据库读取之前恶意攻击者提交的数据
- Web应用服务器返回这段数据
- 受害者浏览器渲染返回的HTML页面,执行返回的JavaScript代码
- 恶意的javascript代码在后台悄悄执行,获取用户信息。
DOM XSS
DOM XSS与反射型XSS和存储型XSS的差别是在于DOM XSS的代码不需要服务器解析响应的直接参与,触发XSS靠的是浏览器DOM解析器的解析,可以完全认为是客户端的事情。
Flash XSS
利用的是网页上flash文件缺陷来执行js脚本,一般是反射型xss
XSS手动挖掘
- 看URL参数输出的位置
- 看输入框输出位置
输出点位置
输出在标签外
需要可以构造标签,如果不能构造标签就不存在XSS漏洞。输出到标签中
如果输出在"双引号或者’单引号内部,需要能够闭合引号,如果不能闭合引号,就需要看能否在当前的标签属性中执行js代码,如果不能,就不存在XSS漏洞。
如果没有输出在"双引号或者’单引号内部,或者可以闭合引号,可以构造一个新的属性,使用新的属性的值来执行JS代码,比如事件属性。输出到Script标签中
- 如果输出在"双引号或者’单引号内部,需要能够闭合引号,
- 如果不能闭合引号,需要看当前变量能不能innerHTML或者document.write,插入到网页中,如果可以就可以构造XSS,如果没有,就不存在XSS(引号内部可以使用unicode编码, < 不能编码)
- 如果输出"双引号或者’单引号内部,需要能够闭合引号,如果可以闭合引号,就可以直接传递进去js代码,使用注释符号,注释掉后面的js代码就可以构造XSS
XSS防御
- 对XSS的防御需要根据实际情况对用户的输入进行严格的过滤。基于过滤的XSS防御方式通常可分为两种:基于黑名单的过滤和基于白名单的过滤。后者的防御效果往往更好,对于用户在白名单之外的输入,可以直接忽略。在构造白名单的过程中需要保证在不影响用户体验的同时,尽可能杜绝一切不必要的输入内容。
- 在cookie中加入httponly属性可以在一定程度上保护用户的cookie,减少出现XSS时损失
- (1,apache2.2.x;2.注册网站,把攻击者自己的加了httponly的cookie复制过去,补全信息)
- Flash XSS的修复需要对相应的flash进行修改或升级替换。