1.安全世界观
1.1安全三要素
机密性Confidentiality:要求保护数据内容不能泄露,加密是实现机密性要求烦人常见手段;
完整性Integrity:要求保护数据内容是完整,没有被篡改的;
可用性Availability:要求保护资源是“随需而得”。
1.2实施安全评估
资产等级划分:对数据做等级划分,后划分信任域和信任边界;
威胁分析:可能造成危害的来源称为威胁,威胁分析是要把所有的威胁都找出来,一般采用头脑风暴法或者建模法;
风险分析:可能会出现的损失称为风险,可通过DREAD模型科学衡量风险;
安全解决方案:方案应能够有效解决问题,用户体验好,高性能,低耦合,易于扩展与升级。
1.3白帽子兵法
1.3.1 Secure By Default原则:
>白名单黑名单
若更多地使用白名单,则系统就会变得更安全。
按照白名单的思想,应根据业务需求,列出一个允许使用的软件以及软件版本的清单,在此清单外的软件则禁止使用,注意避免出现类似通配符的问题。
>最小权限原则
要求系统只授予主体必要的权限,而不要过度授权,需要认真梳理业务所需要的权限。
1.3.2 Defense in Depth纵深防御原则:
首先,要在各个不同层面,不同方面实施安全方案,避免出现疏漏,不同安全方案之间需要相互配合,构成一个整体;
其次,要在正确的地方做正确的事情,在解决根本问题的地方实施针对性的安全方案。
1.3.3 数据与代码分离原则
程序在栈或者堆中,将用户数据当做代码执行,混淆了代码与数据的边界,导致缓冲区溢出等安全问题,使用过滤,编码等手段,把可能造成代码混淆的用户数据清理掉。在Web安全中,由“注入”引起的问题很多,如XSS,X-Path等。
1.3.4 不可预测性原则
不可预测性能有效地对抗基于篡改,伪造的攻击,可以巧妙用于一些敏感数据上,实现往往需要用到加密算法,随机数算法,哈希算法。
2.客户端脚本安全
浏览器安全:浏览器本身就是一个客户端,若具备安全功能,则能想安全软件一样对用户上网起到很好的保护作用,另外浏览器安全也是浏览器厂商之间竞争的底牌。
2.1同源策略
同源策略(Same Origin Policy)是浏览器最核心最基本的功能。限制了来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。
影响源的因素有:host(域名或IP地址),子域名,端口,协议。
对于当前页面来说,页面内存放JavaScript文件的域并不重要,重要的是加载JavaScript页面所在的域是什么。在浏览器中,<script>, <img>, <iframe>, <link>等标签是可以跨域加载资源,而不受同源策略的限制。
XMLHttpRequest受到同源策略的约束,不能跨域访问资源,若能跨域访问资源,则可能会导致一些敏感数泄露。
2.2浏览器沙箱
挂马:在网页中插入一段恶意代码,利用浏览器楼栋执行任意代码的攻击方式。
多进程架构:将浏览器的各个功能模块分开,各个浏览器实例分开,当一个进程崩溃时,也不会影响到其他的进程。
Sandbox:沙箱,泛指资源隔离类模块。设计一般是为了让不可信任的代码运行在一定的环境中,限制不可信任的代码访问隔离区之外的资源。O__O “…
2.3恶意网址拦截
浏览器周期性地从服务器端获取一份最新的恶意网址黑名单,若用户上网时访问的网址存在于此黑名单中,浏览器就会弹出一个警告页面。
恶意网站分两类:一类是挂马网站,这类网站通常包含恶意的脚本,如JavaScript或Flash,通过利用浏览器的漏洞执行shellcode,在用户电脑中植入木马;另一类是钓鱼网站,通过模仿知名网站的相似网页来欺骗用户。
目前浏览器厂商只是以推送恶意网址黑名单为主,浏览器收到黑名单后,对用户访问的黑名单进行拦截。PhishTank是互联网上免费提供恶意网址黑名单的组织之一。除了恶意网址黑名单拦截功能外,主流浏览器都开始支持EV SSL证书,以增强对安全网站的识别。
2.4浏览器安全
微软在IE8中退出了XSS Filter功能,以对抗反射型XSS。当用户访问的URL中包含了XSS攻击的脚本时,IE就会修改其中的关键字符使得攻击无法完成,并对用户弹出提示框。
Firefox 4推出Content Security Policy(CSP),由服务器端返回一个HTTP头,并在其中描述页面应该遵守的安全策略。
2.5.跨站脚本攻击(XSS)
2.5.1XSS简介
跨站脚本攻击Cross Site Script本来缩写是CSS,为了与层叠样式表(Cascading Style Sheet,CSS)区别,所以在安全领域叫做XSS。
XSS攻击是指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而正在用户浏览网页时,控制用户浏览器的一种攻击。
XSS根据效果分类:
1)反射型XSS
反射型XSS只是简单地把用户输入的数据“反射”给浏览器。黑客需要诱使用户点击一个恶意链接,才能攻击成功,又叫做”非持久型XSS“。
2)存储型XSS
存储型XSS会把用户输入的数据存储在服务器端,这种XSS具有很强的稳定性,又叫”持久型XSS“。
3)DOM Based XSS
DOM Based XSS通过修改页面的DOM节点形成的XSS。
2.5.2XSS攻击进阶
XSS攻击成功后,攻击者能够对用户当前浏览的页面植入恶意脚本,通过恶意脚本,控制用户的浏览器,这些用以完成各种具体功能的恶意脚本即”XSS Payload“。
强大的XSS Payload:
1)构造GET和POST请求
2)XSS钓鱼
对于验证码,XSS Payload可通过读取页面内容,将验证码的图片URL发送到远程服务器上来实施,攻击者可以在远程XSS后台接收当前验证码,并将验证码的值返回给当前的XSS Payload,从而绕过验证码。
对于修改密码,利用JavaScript在当前页面上伪造一个登录框,当用户在登录框中输入用户名和密码后,其密码将被发送至黑客的服务器上。
3)识别用户浏览器
若知道用户使用的浏览器,操作系统,就可能实施一次精准的浏览器内存攻击,最终给用户植入一个木马。
通过JavaScript脚本识别浏览器版本,最直接的是通过XSS读取浏览器的UserAgent对象,但UserAgent是可以伪造的。
由于浏览器之间的实现存在差异,不同的浏览器会各自实现一些独特的功能,而同一个浏览器的不同版本之间也可能会有细微差别,通过分辨这些差异,就能准确地判断出浏览器版本。
4)识别用户安装的软件
黑客通过判断用户安装的软件,选择对应的浏览器漏洞,最终达到植入木马的目的。
通过收集常见软件的classid,就可以扫描出用户电脑中安装的软件列表,甚至包括软件的版本。
在XSS Payload中使用时,可以在Flash的ActionScript中读取system.capabolities对象后,将结果通过ExternalInterface传给页面的JavaScript。
5)CSS History Hack
通过CSS,获取用户曾经访问过的网站。利用style的visited属性—若用户曾经访问过某个链接,则这个链接的颜色会变得与众不同。
6)获取用户的真实IP地址
XSS攻击需要借助第三方软件来完成。比如,客户端安装了Java环境(JRE),则XSS可以钓鱼Java Applet的接口获取客户端的本地IP地址。
2.5.3XSS攻击平台:
Attack API:总结了很多能够直接使用XSS Payload,归纳为API的方式。
BeEF:XSS演示平台,演示一个完整的XSS攻击过程,他有一个控制后台,攻击者可以在后台控制前端的一切。
XSS-Proxy:轻量级的XSS攻击平台,通过嵌套iframe的方式可以实时地远程控制被XSS攻击的浏览器。
终极武器:XSS Worm
Samy Worm:首先,MySpace过滤了很多危险的HTML标签,只保留了<a>, <img>, <div>等安全的标签,但允许用户控制标签的style属性,通过style构造出XSS。其次,MySpace过滤了’javascript’等敏感词,用拆分法绕过了这些限制。最后Samy通过AJAX构造的POST请求,完成了在用户的heros列表里添加自己名字的功能,同事复制蠕虫自身进行传播。
一般来说,用户之间发生交互行为的页面,如果存在存储型XSS,则比较容易发起XSS Worm攻击。
2.5.4调试JavaScript
Firebug:最常用的脚本调试工具,前端工程师与Web Hacking必备。
IE 8 Developer Tools:可以动态调试JavaScript。
Fiddler:本地代理服务器,需要将浏览器设置为使用本地代理服务器上网才可使用。Fiddler会家门口所有的浏览器请求,并有能力在浏览器请求中插入数据,支持脚本编程。
HttpWatch:以插件形式内嵌在浏览器中。能监控所有的浏览器请求,在目标网站是HTTPS时特别有用。
2.5.6XSS构造技巧
1)利用字符编码
2)绕过长度限制,利用事件能够缩短的字节数是有限的,最好是把XSS Payload写到别处,再通过简短的代码加载这段XSS Payload。最常用的是“location.hash”,根据HTTP协议,location.hash的内容不会在HTTP包中发送,所以服务器端的Web日志中并不会记录下location.hash里的内容。
3)使用<base>标签,它的作用是定义页面上的所有使用“相对路径”标签的hosting地址。<base>标签可以出现在页面的任何地方,并作用于位于该标签之后的所有标签。
4)window.name,对当前窗口的window.name对象赋值,没有特殊字符的限制。利用这个对象可以实现跨域,跨页面传递数据。
2.5.7变废为宝:Mission ImpossibIe
从XSS漏洞利用的角度来看,存储型XSS对攻击者的用处比反射型XSS要大。存储型XSS在用户访问正常URL时会自动触发,而反射型XSS会修改一个正常的URL,一般要求攻击者将XSS URL发送给用户点击,提高了攻击的门槛。
Apache Expect Header XSS:服务器在出错返回时,会把Expect头的内容未经任何处理便写入到页面中,因此Expect头中的HTML代码就被浏览器解析执行了。这需要再提交请求时向HTTP头中注入恶意数据,才能触发这个漏洞,但对于XSS攻击来说,JavaScript工作在渲染后的浏览器环境中,无法控制用户浏览器发出的HTTP头。而在Flash中发送HTTP请求时,可以自定义大多数的HTTP头。
Anehta的回旋镖:若在B域上存在一个反射型“XSS_B”,在A域上存在一个存储型“XSS_A”,当用户访问A域上的“XSS_A”时,同时嵌入B域上的“XSS_B”,则可以达到在A域的XSS攻击B域用户的目的。
2.5.8Flash XSS
在Flash中可以嵌入ActionScript脚本,ActionScript可以发起网络连接,应该尽可能禁止用户能够上传或加载自定义的Flash文件。
若网站应有一定要使用Flash,若只是视频文件,则要求转码未flv文件,flv文件是静态文件,不会产生安全隐患;若是带动态脚本的Flash,则可以通过Flash的配置参数进行限制。
2.5.9 JavaScript开发框架
Dojo:在Dojo 1.4.1中,存在两个DOM Based XSS。用户输入由theme参数传入,然后被赋值给变量themeCss,最终被document.write到页面里。
YUI:在YUI 2.8.1中,存在过一个DOM Based XSS。在官方demo页,点击一个Tab页,等待页面加载完成后,在URL的hash中插入恶意脚本,脚本会被执行。
jQuery:html()方法如果没有参数,就是读取一个DOM节点的innerHTML,若有参数,则会把参数值写入该DOM节点的innerHTML中,这个过程可能产生DOM Based XSS。
2.5.10 XSS的防御
1) HttpOnly
浏览器禁止页面的JavaScript访问带有HttpOnly属性的Cookie。这解决了XSS后的Cookie劫持攻击。
一个Cookie的使用过程如下:
浏览器向服务器发起请求,这是没有Cookie;
服务器返回时发送Set-Cookie头,向客户端浏览器写入Cookie;
在该Cookie到期前,浏览器访问该域下的所有页面,都将发送该Cookie。
HttpOnly是在Set-Cookie时标记的,但服务器可能会设置多个Cookie,而HttpOnly可以有选择性地加在任何一个Cookie值上。
2) 输入检查
常用的Web漏洞如XSS, SQL Injection等,都要求攻击者构造一些特殊字符。这些特殊字符可能是正常用户不会用到的,可以通过输入检查检测。
输入检查的逻辑,必须放在服务器端代码中实现,若只是在客户端使用JavaScript进行输入检车,是很容易被攻击者绕过的。目前Web开发的普遍做法,是同时在客户端JavaScript中和服务器端代码中实现相同的输入检车。
3) 输出检查
一般除了富文本的输出外,在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。
4)正确防御XSS
XSS可能发生的场景:
1)在HTML标签中/HTML属性中输出
所有在标签中输出的变量,若未做任何处理,都能导致直接产生XSS。这种情况下,XSS的利用方式一般是构造一个<script>标签,或者是任何能够产生脚本执行的方式。
防御方式:对变量使用HtmlEncode。
2)在<script>标签中输出
在<script>标签中/事件中输出时,首先应该确保输出的变量在引号中,攻击者需要先闭合引号才能实施XSS攻击。
防御方式:使用JavaScriptEncode。
3)在CSS中输出
一般尽可能禁止用户可控制的变量在<style>,HTML标签的style属性以及CSS文件中输出,若一定有这样的需求,则推荐使用OWASP ESAPI中的encodeForCSS()函数。
5) 处理富文本
在过滤富文本时,“事件”应该被严格禁止,因为“富文本”的展示需求里不应该包括事件这种动态效果,并禁止一些危险标签,如iframe, script,base,form等。
在标签的选择上,应该使用白名单,避免使用黑名单,如只允许a,img,div等比较安全的标签。白名单原则不仅仅用于标签的选择,同样应该用于属性和事件的选择。
Anti-Samy是OWASP上一个开源项目,也是目前最好的XSS Filter。
6)防御DOM Based XSS
DOM Based XSS是从JavaScript中输出数据到HTML页面里。
参考资料:
白帽子说Web安全思维导图:https://www.cnblogs.com/edisonchou/p/edc_web_security_foundation_notes.html