# 前端安全
# 白帽子讲Web安全
作者:吴翰清
安全工程师的核心竞争力不在于他能拥有多少个0day,掌握多少种安全技术,而在于他对安全的理解,以及引申的看待安全问题的角度和高度
# 安全基础
exploit [ɪkˈsplɔɪt] 开发,利用
- 这里指漏洞利用代码
exploit code 漏洞检测代码
vulnerabilities 脆弱点,缺陷,漏洞
黑客精神:open free share
OWASP
安全本质是信任问题,所有的安全方案都应该有一些可以信任的前提。
安全是一个持续的过程
安全三要素: 机密性:(Confidentiality) [,kɒnfɪ,denʃɪ'ælɪtɪ] 完整性:(Integrity) [ɪn'tegrɪtɪ] 可用性:(Availability)
机密性:保护数据内容不能泄露
常见手段:加密
完整性:要求数据完整,没有被篡改 常见手段:数字签名
可用性:要求数据随需而得
安全评估 四个阶段: 资产等级划分 -> 威胁分析 -> 风险分析 -> 确认解决方案
原则:评估过程是层层递进,有前后的因果关系,每一个阶段中,上一个阶段讲决定下一个阶段的目标。
资产等级划分: 帮助我们明确目标是什么,要保护什么
机密性和完整性是和数据相关的,在可用性中有提到资源一词。
资源
指代的范围很广,远远超出了数据范围。
对于现在的互联网公司而言,一般都拥有一些固定资产,但是互联网公司的核心是用户数据驱动的。
由用户产生业务,业务产生数据。
所以,互联网安全的核心问题,是数据安全的问题。 资产 ==> 数据
过程:找清楚重点资产是什么? 用户数据?员工数据?最看重什么? 以此来明确我们我们要保护目标的情况(内容,优先级等); 之后,需要做一个划分信任域和信任边界。
威胁VS风险 威胁:可能造成危害的来源 风险:可能出现的损失
威胁分析:将所有的威胁找出来(确定攻击面)。可以通过头脑风暴的方式,参考STRIDE
模型。
风险分析:科学的衡量所有的风险。可以参考DREAD
模型
安全方案 1.Secure by default原则
- 黑名单,白名单
- 最小权限
2.纵深防御原则 3.数据与代码分离原则 4.不可预测性原则
# 客户端脚本安全
# 浏览器安全
# 同源策略 (Same origin policy)
同源策略:
如果协议,端口和主机对于两个页面是相同的,则两个页面具有相同的源
浏览器中,<script>
<img>
<iframe>
<link>
等标签可以跨域加载资源,而不受同源策略的限制,这些带src属性的标签每次加载时,实际上是由浏览器发起了一次GET请求。不同于XMLHttpRequest的是,通过src属性加载的资源,浏览器限制了Javascript的权限,使其不能读,写返回的内容
(//TOT)。
# 浏览器沙箱
防止网页挂马
的威胁。沙箱的设计目的是为了让不可信的代码运行在一定的环境中,限制不可信任的代码访问隔离区之外的资源。
一个沙箱的设计可能是多进程的架构。
# 恶意网址拦截
浏览器基于黑名单
过滤
# 跨站脚本攻击(XSS)
XSS
: Cross Site Script
跨站脚本(Cross-site scripting,通常简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入
的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。
- 存储型XSS 把用户输入
存储
在服务器端(持久型XSS) - 反射型XSS 把用户输入
反射
给浏览器(非持久型XSS) - DOM Based XSS 通过修改页面的DOM节点形成的XSS
# 存储型XSS
存储型指的是恶意脚本会存储在目标服务器上,当浏览器请求数据时,脚本从服务器传回并执行
攻击步骤:
- 攻击者将恶意代码提交到⽬标⽹站的数据库中。
- ⽤户打开⽬标⽹站时,⽹站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
- ⽤户浏览器接收到响应后解析执⾏,混在其中的恶意代码也被执⾏。
- 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作。
这种攻击常⻅于带有⽤户保存数据的⽹站功能,如论坛发帖、商品评论、⽤户私信等
# 反射型XSS
反射型指的是攻击者诱导用户访问一个带有恶意代码的 URL 后,服务器端接收数据后处理,然后把带有恶意代码的数据发送到浏览器端,浏览器端解析这段带有 XSS 代码的数据后当做脚本执行,最终完成 XSS 攻击
攻击步骤:
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- ⽤户打开带有恶意代码的 URL 时,⽹站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
- ⽤户浏览器接收到响应后解析执⾏,混在其中的恶意代码也被执⾏。
- 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作
反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库⾥,反射型 XSS 的恶意代码存在 URL ⾥。反射型 XSS 漏洞常⻅于通过 URL 传递参数的功能,如⽹站搜索、跳转等。 由于需要⽤户主动打开恶意的 URL 才能⽣效,攻击者往往会结合多种⼿段诱导⽤户点击
# DOM型XSS
攻击步骤:
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- ⽤户打开带有恶意代码的 URL。
- ⽤户浏览器接收到响应后解析执⾏,前端 JavaScript 取出 URL 中的恶意代码并执⾏。
- 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执⾏恶意代码由浏览器端完成,属于前端JavaScript ⾃身的安全漏洞,⽽其他两种 XSS 都属于服务端的安全漏洞
# 如何防御
XSS的本质是一种HTML注入,用户的数据被当做HTML代码一部分来执行,从而混淆了原本的语义,产生新的语义。
XSS可以做什么?
- 构造Get,Post请求,获取敏感信息
- XSS钓鱼
- 识别用户浏览器
- 识别用户安装的软件
- 获取用户的真实IP
- 流量窃取
- 钓鱼欺诈
防御XSS的方式
- url参数使用encodeURIComponent方法转义
- 尽量不是有InnerHtml插入HTML内容
- 使用特殊符号、标签转义符,对于可能存在的问题前端加以判断
- 使用
CSP(Content-Security-Policy)
,CSP 的本质是建立一个白名单,告诉浏览器哪些外部资源可以加载和执行,从而防止恶意代码的注入攻击 - 对一些敏感信息进行保护,比如 cookie 使用 http-only,使得脚本无法获取。也可以使用验证码,避免脚本伪装成用户执行一些操作
XSS示例
- 在一个论坛发帖中发布一段恶意的JavaScript代码就是脚本注入
# 跨站点请求伪造CSRF
Cross-site request forgery
CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
本质: 本质是利用 cookie 会在同源请求中携带发送给服务器的特点,以此来实现用户的冒充
P3P头 P3P头是W3C制定的一项关于隐私的标准,在某种程度上,将会允许浏览器发送第三方的Cookie。 P3P头只需要网站设置一次
Cookie劫持
CSRF示例 用户访问网站A,登录并生成本地cookie,此时并未登出。然后访问其他的网站,此时如果其他网站有一些恶意脚本,可能会冒充用户发起网站A的伪造请求(在用户不知情的情况下,且此时拥有cookie状态) 完成一些违背用户意愿的请求(如恶意发帖,删帖,改密码,发邮件等)
防御CSRF的方式
- 验证HTTP Referer字段(不够安全)
- 添加验证码
- 使用随机token
- 服务端给用户生成一个token,加密后传递给用户
- 用户在提交请求时,需要携带这个token
- 服务端验证token是否正确
- 在设置 cookie 属性的时候设置
sameSite
,限制 cookie 不能作为被第三方使用
# DDOS
DDoS又叫分布式拒绝服务,全称 Distributed Denial of Service,其原理就是利用大量的请求造成资源过载,导致服务不可用。
如何防御:
- 限制单IP请求频率
- 防火墙等防护设置禁止ICMP包等
- 检查特权端口的开放
# 中间人攻击
中间⼈ (Man-in-the-middle attack, MITM) 是指攻击者与通讯的两端分别创建独⽴的联系, 并交换其所收到的数据, 使通讯的两端认为他们正在通过⼀个私密的连接与对⽅直接对话, 但事实上整个会话都被攻击者完全控制。在中间⼈攻击中,攻击者可以拦截通讯双⽅的通话并插⼊新的内容。
攻击过程如下:
- 客户端发送请求到服务端,请求被中间⼈截获
- 服务器向客户端发送公钥
- 中间⼈截获公钥,保留在⾃⼰⼿上。然后⾃⼰⽣成⼀个伪造的
公钥
,发给客户端 - 客户端收到伪造的公钥后,⽣成加密hash值发给服务器
- 中间⼈获得加密hash值,⽤⾃⼰的私钥解密获得真秘钥,同时⽣成假的加密hash值,发给服务器
- 服务器⽤私钥解密获得假密钥,然后加密数据传输给客户端
# 如何防范
升级为HTTPS
# 核心的概念
安全运营