Web安全知识简单总结

《白帽子讲WEB安全》读后记录

Category: LearningSummary Tag: Web&Hack&Browser Created on 2020-01-12 Latest Update on 2020-01-14

通过阅读《白帽子讲WEB安全》,简单总结了一些Web安全方面的知识,作为资料查阅。

综述

安全的三要素可以归纳为机密性、完整性和可用性。机密性要求数据内容不可泄漏(加密),完整性要求保护数据内容完整,不被篡改(数据签名),可用性要求保护的资源是随需而得,如(DoS攻击)。此外,还可以加入可审计性与不可抵赖性。

对于安全方案,最基本的原则应为“Secure by Default”。这个原则可以归纳为白名单原则,以及最小权限原则。此外,纵深防御原则要求在正确的地方做正确的事。数据与代码分离原则需要避免如数据硬编码的问题。不可预测性原则往往要求随机程度,是从克服攻击方法的角度出发的。


客户端


浏览器

对于浏览器而言,最重要的是同源策略,换种说法:Web是构建在同源策略上的,而浏览器只是针对同源策略的一种实现。

同源策略限制了来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。

网站的crossdomain.xml文件会规定是否允许当前源的Flash跨域访问目标资源,这就是从origin层面控制安全性。此外,浏览器目前基本都采用多进程结构来运行标签,对每个进程建立沙箱,一个进程崩溃不会对所用标签造成影响。进程间使用IPC通讯,也会进行一定的安全检查。


XSS

对于跨站脚本攻击,与SQL注入有些相似,不同的是XSS注入的目标主要是网页的html代码。 XSS攻击主要分为三种,反射型XSS将用户(hacker)输入的数据反射给浏览器,这要求用户需要点击一个恶意链接才能成功;储存性XSS因为将用户输入的数据储存在服务端,具有很强的稳定性和持久性,DOM Based XSS也应归为反射型XSS,但它出现在网页有修改DOM节点的动作时,通过设计更改节点的数据(如属性、style)来将本来的节点更改为设想的代码。

XSS攻击可用于Cookie劫持,这可以使用Cookie的“HttpOnly”表示来缓解。此外,也可以通过模拟GET,POST请求以操作浏览器。当然,XSS也可用于钓鱼、探测用户信息等方面,XSS蠕虫的波及面最广。

对于XSS的防御,从目标来看,HttpOnly解决了Cookie劫持的影响,js脚本不会读取到标记后的Cookie,。对于其他方面,输入检查以略去或设置白名单是必要的手段,而输出检查可以在变量输出到html时编码(HtmlEncode)和转义,对于在标签或js事件中输出,可以使用JavascriptEncode。总的来说,对于基本的XSS攻击,使用分析语义的方法过滤是很有效的。

而对于DOM Based XSS,上述攻击都是由服务器应用直接输出数据到html,而这是从js中输出数据到html中,因此上面的方法不太适用。防御方法是要在js获取变量时做一次编码方法,在写入到html时,需要观察输出的地点是哪里。如果是时间或脚本,需要对js编码,如果是html内容,则需要对html编码。也就是对于不同输出需要分别对待。

总之,XSS攻击在建立攻击后便与攻击者关系不大了,攻击者通过不同的方法将受害人访问的页面篡改,网页会(自动/在点击后)执行其中包含的js代码或链接等,从而造成攻击。


CSRF

跨站点请求伪造与跨站脚本攻击最大的区别在于CSRF是更改的攻击者自己的页面,受害者在不知情时发送了攻击者伪造的请求,造成损失。

Cookie分“Session Cookie”和“Third-party Cookie”两种,Session往往存于内存中,浏览器关闭后失效,而第三方Cookie的持续时间会长很多,需要指定Expire时间。能够阻止发送第三方Cookie,便可防御一部分CSRF攻击,但攻击者也可以先使受害者打开目标网站以使Session Cookie有效再进行操作。

由于CSRF能够成功主要在于用户发送请求后即执行,所以加上强制交互可解决问题,如验证码,但因为用户体验问题不容易实现。另一种方法是Referer Check,但有些时候Referer头存在造假或因为隐私问题被屏蔽的可能。最有效的办法是Anti CSRF Token,注意这不是简单的通过服务器创建一个复杂但合理的url链接,这样不利于用户输入和收藏页面。这是将一个token储存在Session或Cookie中,因为攻击者不可能获得Session或Cookie的token,所以不会发生CSRF。不过,如果页面还存在XSS漏洞,则造成的XSRF攻击另当别论。

XSS与CSRF的概念很容易混淆,个人看来,XSS关键在“脚本”和“篡改”上,是通过篡改页面以运行脚本达到攻击的目的,服务端实际上作为攻击者与受害者之间的跳板。CSRF关键在“伪造”上,设计合理的请求以受害者身份欺骗服务器,从而达到目的。两个攻击方法有重叠的地方,应该记得从概念出发来考虑问题。


ClickJacking

点击劫持是一种高明的视觉欺骗,通过不可见的iframe标签覆盖网页,诱使受害者点击以完成攻击。通过禁止跨域的iframe可以对传统点击劫持进行防范。X-Frame-Options则是专门用来解决此问题的HTTP头,可以作为另一种解决方法。


服务端


SQL注入与文件上传攻击

这两种最常见的攻击方法由于是攻击服务端,一旦成功会造成很严重的数据泄漏和权限丧失。防范方法与攻击的种类密切相关,需要注意编码问题、储存问题,但是最严重的往往是应用和语言自身的漏洞,SQL注入时的返回信息,文件的解析处理是需要重视的地方。


认证与会话管理

认证与授权是两件事情,认证是为了认出用户是谁,授权是为了决定用户能做什么。

攻击发生在Session的生命周期中,如Session Fixation攻击与Session保持攻击,这些都能够让攻击者获得未关闭的受害者会话,在用户登录后刷新Session的id、设置Session的到期时间或trigger,可以防范上述攻击。认证是一件影响用户体验的事情,SSO(单点登录)能够将风险集中化,优化体验,但弊端是单点故障造成恶劣影响。


访问控制

访问控制(权限控制)指系统在某个主体对某个客体实施某种操作时进行的限制。需要形成的概念是垂直权限管理与水平权限管理。

对于垂直权限管理涉及的用户与权限的对应关系,有模型RBAC(基于角色的访问控制)。而垂直权限可以判断此人能不能作为用户进入,但不同的用户身份之间是需要隔离的。为了避免相同权限的用户之间数据发生共享,便需要水平权限管理。OAuth作为在不提供用户名和密码的情况下授权第三方应用访问Web资源的安全协议,主要目标是解决授权问题。一方应用使用Request Token访问OAuth,用户同意后发放Access Token,最后使用Access Token访问另一方应用的数据,就完成了授权的过程。