Web技术的成熟使得Web应用的功能越来越强大,最终成为了互联网的主流。黑客们的目光,也渐渐转移到了Web这块大蛋糕上。
安全问题的本质是信任的问题。一切安全方案的设计基础,都是建立在信任关系上的。
安全三要素,机密性,完整性,可用性
实施安全评估
一个安全评估的过程,可以简单地分为4个阶段:资产等级划分,威胁分析,风险分析,确认解决方案。实施的过程是层层递进,前后之间有因果关系。
- 资产等级划分,帮助我们明确目标是什么,要保护什么。对互联网公司拥有的资产进行等级划分,就是对数据做等级划分。每家公司的侧重点可能不同。互联网安全的核心问题,是数据安全的问题。
- 威胁分析,就是把所有的威胁都找出来。可以参考微软的STRIDE模型。
- 风险分析,可以参考微软的 DREAD模型。
- 安全评估的产出物,就是安全解决方案。一个优秀的安全方案应该具备:能有效的解决问题,用户体验好,高兴呢,低耦合,易于扩展和升级。
客户端脚本安全
包含
- 浏览器安全
- 跨站脚本攻击(XSS)
- 跨站点请求伪造(CSRF)
- 点击劫持(ClickJacking)
- HTML5安全
1.浏览器安全
浏览器是目前互联网最大的入口。浏览器具备许多安全功能。
同源策略(same origin policy)
是一种约定,是浏览器最核心也是最基本的安全功能。浏览器的同源策略,限制了不同源的document或JavaScript脚本,对当前document读取或设置某些属性。
对于JavaScript,影响源的因素有:host(域名或IP,ip地址当做根域名)、子域名、端口、协议(例如http和https)。
浏览器中,“script img iframe link” 等标签都能可以跨域加载资源,不受同源策略限制。XMLHttpRequest受到同源策略的约束,不能跨域访问资源。跨域访问方案的安全基础就是信任 “JavaScript无法控制该HTTP头”。
浏览器沙箱 Sandbox
采用沙箱技术,无疑可以让不受信任的网页代码、JavaScript代码运行在一个受限制的环境中,从而保护本地桌面系统的安全。
恶意网站拦截
浏览器周期性的从服务器获取一份最新的恶意网址黑名单,如果用户上网时访问的网址存在于此黑名单中,浏览器就会弹出一个警告页面。除了恶意网站拦截功能外,主流浏览器都开始支持EVSSL证书(Extended Validation SSL Certificate),以增强对安全网站的识别。EV证书在浏览器上会有特殊的效果,比如绿色的标识。
浏览器的安全以同源策略为基础,加深理解同源策略,才能把握住浏览器安全的本质。
2.跨站脚本攻击(XSS)
跨站脚本攻击,全称Cross Site Script。为了和层叠样式表有所区别,所以在安全领域叫做XSS。XSS攻击,通常指黑客通过“html 注入”篡改了网页,插入了恶意脚本,从而在用户浏览器网页是,控制用户浏览器的一种攻击。XSS根据效果可以分成3种类型:
- 反射型XSS,反射型XSS只是简单的把用户输入的数据“反射”给浏览器。也就是说,黑客往往需要诱使用户点击一个恶意链接,才能攻击成功。反射型XSS也叫做“非持久型XSS”。
- 存储型XSS,存储型XSS会把用户输入的数据“存储”在服务端,这种XSS有很强的稳定性。存储型XSS通常也叫做“持久型XSS”。
- DOM Based XSS,通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS。
XSS进阶攻击:
XSS playload ,XSS攻击成功后,攻击者能够对用户当前浏览的页面植入恶意脚本,通过恶意脚本,控制用户浏览器。XSS playload实际上就是JavaScript脚本,所以任何JavaScript脚本能做的事,XSS playload都能做到。
XSS蠕虫
XSS 实例查看:
http://www.cnblogs.com/leestar54/p/5798937.html#top
http://blog.csdn.net/kevon_sun/article/details/51135880
XSS攻击平台
这些平台的主要目的是演示XSS的危害,有助于深入理解XSS的原理和危害:
XSS的攻击手段和技巧,还有很多,具体可以参考《白帽子讲web安全》一书。
XSS防御
- 设置HttpOnly,禁止JavaScript访问带有httponly属性的cookie。
- 输入输出检查
- 安全的编码函数
- 处理富文本
- 防御DOM Based XSS
实例参考:http://www.cnblogs.com/digdeep/p/4695348.html
3.跨站点请求伪造(CSRF)
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。
原理和防御方法参考:http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
4.点击劫持
点击劫持,clickjacking,也被称为UI-覆盖攻击。这个词首次出现在2008年,是由互联网安全专家罗伯特·汉森和耶利米·格劳斯曼首创的。
它是通过覆盖不可见的框架误导受害者点击。
虽然受害者点击的是他所看到的网页,但其实他所点击的是被黑客精心构建的另一个置于原网页上面的透明页面。
这种攻击利用了HTML中 iframe 标签的透明属性。
攻击和防御参考实例:
http://www.freebuf.com/articles/web/67843.html
5.HTML5安全
HTML5新增的标签和功能,可能带来新的XSS攻击。
该网站 http://html5sec.org/ 列举了大部分的攻击方式。
服务器端应用安全
- 注入攻击
- 文件上传漏洞
- 认证与会话管理
- 访问控制
- 加密算法与随机数
- Web框架安全
- 应用层拒绝服务攻击
- webserver 配置安全
1.注入攻击
SQL注入
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。
攻击手段示例和防御方法参考:http://www.cnblogs.com/baizhanshi/p/6002898.html
XML注入
http://blog.csdn.net/mevicky/article/details/48239481
代码注入
http://blog.csdn.net/hitwangpeng/article/details/45716821
CRLF注入
http://www.2cto.com/article/201406/312590.html
2.文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本获得了执行服务器端命令的能力。文件上传后导致的常见安全问题一般有:
- 上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行;
- 上传文件是Flash的策略文件crossdomain.xml,黑客用以控制flash在该域下的行为(其他通过类似方式控制策略文件的情况类似);
- 上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;
- 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
大多数情况下,文件上传漏洞一般都是指“上传web脚本能够被服务器解析”的问题,也就是通常所说的webshell,要完成这个攻击,要满足几个条件:
- 首先,上传的文件能够被web容器解释执行;
- 其次,用户能够从web上访问这个文件;
- 最后,用户上传的文件若被安全检查,格式化,图片压缩等功能改变了内容,则也可能导致攻击不成功。
攻击实例:http://www.cnblogs.com/crazylocust/p/6759529.html
防御手段:
- 文件上传的目录设置为不可执行
- 判断文件类型
- 使用随机数改写文件名和文件路径
- 单独设置文件服务器的域名
3.认证与会话管理
认证的目的是为了认出用户是谁,而授权的目的是为了决定用户能够做什么。
密码的合理保存方式:将明文密码经过哈希后再保存到数据库,在计算哈希值时,增加一个“salt”,salt是一个字符串,作用是增加明文哈希值的复杂度,并使得彩虹表一类的攻击失效。
多因素认证:对于很多重要的系统,如果只有密码作为唯一的认证手段,从安全上看会略显不足,因此为了增强安全性, 大多数网上银行和网上支付平台都会采用双因素认证或多因素认证。
session fixation 攻击:用户登录网站的过程中,如果登录前后用户的sessionID没有发生变化,则会存在session fixation问题。
session 保持攻击:一般来说session是有生命周期的,当用户长时间未活动,或者用户退出,服务器将销毁session。如果攻击者能一直持有一个有效的session,而服务器对于活动的session一直不销毁的话,攻击者就能通过此有效session一直使用用户的账号,成为一个永久的后门。攻击者可以通过不停的发起访问请求,让session一直活下去,比如不停的刷新页面。如何对抗这种session保持攻击,常见的做法是在一定的时间后, 强制销毁session。但是强制销毁可能会影响到一些正常的用户,还可以选择的方法是在当用户客户端发生变化时,要求用户重新登录。比如用户的IP、useragent等信息发生了变化,就可以强制销毁当前的session,并要求用户重新登录。
单点登录(SSO):英文全称,single sign on,简称sso。它希望用户只需要登录一次,就可以访问所有系统。从用户体验的角度看,sso无疑让用户的使用更加的方便,从安全角度看,sso把风险集中在单点上,这样做是有利有弊的。利是风险集中,缺点是风险集中了,所以单点一旦被攻破,后果会非常严重。
4.访问控制
web安全领域中,权限控制的问题都可以归纳为访问控制的问题。
访问控制实际上是建立用户与权限之间的对应关系,现在应用广泛的一种方法,就是基于角色的访问控制(Role-Based Access Control),简称RBAC。RBAC事先会在系统中定义出不同的角色,不同的角色拥有不同的权限,一个角色实际上就是一个权限的集合,而系统的所有用户都会被分配到不同的角色中,一用户可能拥有多个角色,角色之间有权限高低之分。在系统验证权限时,只需要验证用户所属角色,然后就可以根据角色所拥有的权限进行授权了。
RBAC属于垂直权限管理,在RBAC下,系统只会验证用户A是否属于角色RoleX,而不会判断用户A是否能否访问只属于用户B的数据DataB,用户B和用户A是属于同一角色的。因此发生了越权访问。这种问题,我们就称之为“水平权限管理问题”。此问题难以在统一框架下解决。
OAuth 是一个在不提供用户名和密码的情况下,授权第三方应用访问web资源的安全协议。
具体说明和参考:
http://www.tuicool.com/articles/qqeuE3
http://blog.jobbole.com/49211/
5.加密算法和随机数
常见的加密算法通常分为分组加密算法与流密码加密算法两种,两者实现原理不同。
分组加密算法基于“分组”(block)进行操作,根据算法的不同, 每个分组的长度可能不同。分组加密算法的代表有DES,3-DES,Blowfish,IDEA,AES等。流密码加密算法,则每次只处理一个字节,密钥独立于消息之外,两者通过异或实现加密与解密。流密码加密算法的代表有RC4,ORYX,SEAL等。
针对加密算法的攻击,一般根据攻击者能获得的信息,可以分为:
- 唯密码攻击,攻击者有一些密文,它们是使用同一加密算法和同一密钥加密的。这种攻击是最难的。
- 已知明文攻击,攻击者除了能得到一些密文外,还能得到这些密文对应的明文。本章中针对流密码的一些攻击为已知明文攻击。
- 选择明文攻击,攻击者不仅能得到一些密文和明文,还能选择用于加密的明文。
- 选择密文攻击,攻击者可以选择不同的密文来解密。
Reused Key Attack
在流密码的使用中,最常见的错误便是使用同一个密钥进行多次加/解密。这将使得破解流密码变得非常简单。在这种攻击下,攻击者不需要知道,密钥,即可还原出明文。
常见的加密模式有:ECB,CBC,CFB,OFB,CTR等。
对于web应用来说,密钥管理,常见的做法是将密钥(包括密码)保存在配置文件或者数据库中。
其他更多的攻击手段和案例参考《白帽子讲web安全》。
加密算法的选择和使用的最佳实践:
1.不要使用ECB模式
2.不要使用流密码(比如RC4)
3.使用HMAC-SHA1代替MD5(甚至是代替SHA1)
4.不要使用相同的key做不同的时期
5.salt与IV需要随机产生
6.不要自己实现加密算法,尽量使用安全专家已经实现好的库
7.不要依赖系统的保密性
当你不知道如何选择时,有一下建议:
1.使用CBC模式的AES256用于加密
2.使用HMAC-SHA512用于完整性检查
3.使用带salt的SHA-256或SHA-512用于Hashing。
6.web框架安全
在框架中实施安全方案,比由程序员在业务中修复一个个具体的bug,有着更多的优势。
模板引擎与XSS防御,在View层,可以解决XSS问题。使用“输出编码” 的防御方法,针对不同的情况使用不同的编码函数。
在web框架中可以使用security token解决CSRF攻击,在web开发中,对“读操作”和“写操作”予以区分,比如所有的“写操作”都使用Http post。
参考:Spring MVC防御CSRF、XSS和SQL注入攻击
此外还有web框架本身的安全漏洞。
Web 应用安全利器:IBM Rational AppScanIBM Rational AppScan 是一个全面的 Web 应用安全解决方案,为 Web 及 Web 2.0 应用提供了安全漏洞扫描、报告和修复建议等功能,可以帮助开发者全面准确地发现并解决安全问题。
7.应用层拒绝服务攻击
DDOS又称为分布式拒绝服务,常见的DDOS攻击有SYN flood,UDP flood,ICMP flood等。应用层DDOS攻击是针对服务器性能的一种攻击,那么许多优化服务器性能的方法,或多或少地能缓解此种攻击。常见的防御措施:
- 限制请求频率,在应用中,针对每个“客户端”做一个请求频率的限制。
- 应用代码做好性能优化
- 网络架构上做好优化,利用好负载均衡和CDN。
- 实现一些对抗手段,比如限制每个IP的请求频率
- 加入验证码
CC攻击:Challenge Collapasar,意值在黑洞(一款反DDOS设备)的防御下,仍然能有效的完成拒绝服务攻击。CC攻击的原理就是对一些消耗资源较大的应用页面不断的发起正常的请求,以达到消耗服务器资源的目的。
资源耗尽攻击
slowloris攻击,原理是以极低的速度往服务器发送http请求,由于webserver对于并发的连接数都有一定的上限,因此若是恶意的占用住这些连接不放,那么webserver的所有连接都将被恶意连接占用,从而无法接受新的请求,导致拒绝服务。
http post dos,原理是在发送http post包时,指定一个非常大的content-length值,然后以很低的速度发包,比如10~100s发一个字节,保持住这个连接不断开。这样客户端连接数多了以后,占用住了webserver的所有可用连接,从而导致DOS。
8.WebServer配置安全
web服务器是web应用的载体,如果这个载体出现安全问题,那么运行在其中的web应用程序的安全也无法得到保障。