目前在阅读《白帽子讲Web安全》,在此做一些随笔记录。
第1章 我的安全世界观
- 在早期互联网中,黑客们的主要攻击目标是网络、操作系统以及软件等领域。而运营商、防火墙对于网络的封锁,使得暴露在互联网上的非Web服务越来越少,且Web技术的逐渐成熟,使得其成为了黑客攻击的主要目标。
- Web攻击技术的发展:
- Web1.0时代,主要关注的是服务器端动态脚本的安全问题。
- SQL注入的出现是Web安全史上的一个里程碑。
- XSS(跨站脚本攻击)的出现是另一个里程碑。
- Web2.0的兴起,XSS,CSRF等攻击变得更强大,Web攻击的思路也由服务器端转向了客户端。
- Web1.0时代,主要关注的是服务器端动态脚本的安全问题。
- 安全问题中,极端条件意味着小概率及高成本,因此会根据成本设计安全方案,并将一些可能性较大的条件作为决策的主要依据。
- 安全问题的组成属性总结为三要素,简称CIA:
- 机密性(Confidentiality):要求保护数据内容不能泄露,加密为常用手段。
- 完整性(Integrity):要求保护数据内容是完整、没有被篡改的,数字签名为常用手段。
- 可用性(Availability):要求保护资源是”随需而得”。
- 如停车场100个车位,被坏人用100个大石头把车位都占用了,停车场无法继续提供正常服务。
- 安全领域这种攻击叫拒绝服务攻击(DoS),该攻击破坏的就是安全的可用性。
- 安全评估过程可以分为4个阶段:
- 资产等级划分:帮助明确目标是什么,要保护什么。
- 威胁分析:可能造成危险的来源称为威胁,威胁建模的一个方法是微软提出的STRIDE模型
- 伪装、篡改、抵赖、信息泄露、拒绝服务、提升权限
- 风险分析:可能会出现的损失称为风险,衡量风险的一个模型也是微软提出的DREAD模型(书中Page14)
- 确认解决方案
- 优秀的方案应该能够有效解决问题、用户体验好、高性能、低耦合、易于扩展与升级。
- 纵深防御原则,包含2层含义:
- 首先,要在各个不同层面、不同方面实施安全方案,避免出现疏漏,不同安全方案之间需要相互配合,构成一个整体。
- 其次,要在正确的地方做正确的事情,即在解决根本问题的地方实施针对性的安全方案。
第2章 浏览器安全
同源策略(Same Origin Policy)是浏览器最核心也最基本的安全功能,它限制了来自不同源的”document”或脚本,对当前”document”读取或设置某些属性。
- 受到同源策略约束就不能跨域访问资源,但随着业务发展,跨域请求的需求愈发强烈。
挂马:在网页中插入一段恶意代码,利用浏览器漏洞执行任意代码的攻击方式被称为挂马。
沙箱SandBox:可以让不受信任的网页代码、JS代码运行在一个受到限制的环境中,从而保护本地桌面系统的安全。
恶意网站拦截:目前主要通过推送恶意网址黑名单的方式,另外主流浏览器也开始支持EV SSL证书来增强对安全网站的识别。
- PhishTank是一个免费提供恶意网站黑名单的组织,更新频繁。
- 谷歌也公开了内部使用的SafeBrowsing API。
第3章 跨站脚本攻击(XSS)
XSS攻击:通常指黑客通过”HTML注入”篡改了网页,插入了恶意脚本(这些脚本被称为XSS Payload),从而在用户浏览网页时控制用户浏览器的一种攻击。
XSS根据效果不同主要分为以下几类:
- 反射型XSS(非持久型XSS)
- 只是简单地把用户输入的数据”反射”给浏览器,需要用户点击链接才能攻击成功。
- 存储型XSS(持久型XSS)
- 会把用户输入的数据”存储”在服务器端,具有很强稳定性。
- DOM Based XSS
- 从效果上看也是反射型XSS,出于历史原因单独分类。
- 通过修改页面的DOM节点形成的XSS。
- 反射型XSS(非持久型XSS)
一个最常见的XSS Payload就是通过读取浏览器的Cookie对象,从而发起Cookie劫持攻击。
具体的一些XSS攻击及相关的代码可以在书中3.2.2节查阅。
一些XSS攻击平台:
- Attack API
- BeEF
- XSS-Proxy
XSS Worm
- 一般来说,用户之间发生交互行为的页面,如果存在存储型XSS,则比较容易发起XSS Worm攻击。
想写好XSS Payload,需要有很好的JS功底,调试JS就成了必不可少的技能。介绍几款常用的JS调试工具:
- Firebug
- IE 8 Developer Tools
- Fiddler
- HttpWatch
实际环境中,XSS的利用技巧比较复杂,下面是一些常见的XSS攻击技巧,也是网站在设计安全方案时需要注意的地方:
- 利用字符编码
- 绕过长度限制(某些环境下还可以利用注释符绕过长度限制)
- 使用
标签 - 该标签作用是定义页面上的所有使用”相对路径”标签的hosting地址
- window.name的妙用
- 还有一些曾经被认为无法利用的XSS漏洞,都被人找到了利用方法(书中3.2.7节):Apache Expect Header XSS、Anehta的回旋镖、
除了基于HTML的XSS攻击,在Flash中同样也可能造成XSS攻击,通常是在Flash中嵌入ActionScript。
- 限制Flash动态脚本的最重要的参数是”allowScriptAccess”,其定义了Flash能否与HTML页面进行通信。
在Web前端开发中,一些JS开发框架深受开发者欢迎,但一些JS框架也曾暴露过一些XSS漏洞:
- Dojo
- YUI
- jQuery
XSS的防御
现在的浏览器都会内置对抗XSS的措施,但网站也应该寻找优秀的解决方案。
HttpOnly:由微软提出,禁止页面的JS访问带有HttpOnly属性的Cookie。主要解决的是XSS后的Cookie劫持。
输入检查。
输出检查:在变量输出到HTML页面时,可以使用编码或转义的方式防御XSS攻击。但需要分清楚输出变量的语境,根据情况区分对待:(书中3.3.4节)
- 在HTML标签中输出
- 在HTML属性中输出
- 在”<script>“标签中输出
- 在事件中输出
- 在CSS中输出
- 在地址中输出
处理富文本:允许用户提交的自定义HTML代码。
从输入检查的思路走,因为富文本数据是完整的HTML代码,可以特殊处理。目前有一些比较成熟的开源项目实现了对富文本的XSS检查,如Anti-Samy。
DOM Based XSS防御
DBX是从JS中输出数据到HTML页面中,与前面针对的从服务器应用直接输出到HTML页面不同。
而从JS输出到HTML页面也相当于一次XSS输出的过程,需要分语境进行编码。
JS输出到HTML的方式见(书Page106)
第4章 跨站点请求伪造(CSRF)
- CSRF,Cross Site Request Forgery,伪造对其他站点操作的请求。
- 浏览器所持有的Cookie分2种:
- Third-party Cookie,本地Cookie。服务器在Set-Cookie时指定了Expire时间,只有到时间后Cookie才会失效,保存在本地。
- Session Cookie,临时Cookie。没有指定Expire时间,浏览器关闭后失效,保存在浏览器进程的内存空间。
- 一些浏览器会默认禁止浏览器在img、iframe、script、link标签中发送第三方Cookie
- 默认拦截:IE 6、7、8、Safari
- 默认不拦截:Firefox 2、3、Opera、Chrome、Android
- 拦截第三方Cookie某种程度上降低了CSRF攻击的威力,但P3P的介入使得情况变得复杂。在网站的业务中,P3P头主要用于类似广告等需要跨域访问的页面。