白帽子讲WEB安全读书笔记(慢慢更新)

                       道哥写的白帽子讲WEB安全的读书笔记

2020.3.23

◆ 前言

Web是互联网的核心,是未来云计算和移动互联网的最佳载体,因此Web安全也是互联网公司安全业务中最重要的组成部分。

◆ 第一篇 世界观安全

互联网本来是安全的,自从有了研究安全的人之后,互联网就变得不安全了。

1.1 Web安全简史

>> 1.1.1 中国黑客简史

>> 1.1.2 黑客技术的发展历程

通过ACL可以控制只允许信任来源的访问

>> 1.1.3 Web安全的兴起

Web攻击的思路也从服务器端转向了客户端,转向了浏览器和用户。

比如Python、Ruby、NodeJS等,敏捷开发成为互联网的主旋律。

>> 1.2 黑帽子,白帽子

对于黑帽子来说,只要能够找到系统的一个弱点,就可以达到入侵系统的目的;而对于白帽子来说,必须找到系统的所有弱点,不能有遗漏,才能保证系统不会出现问题

黑帽子为了完成一次入侵,需要利用各种不同漏洞的组合来达到目的,是在不断地组合问题;而白帽子在设计解决方案时,如果只看到各种问题组合后产生的效果,就会把事情变复杂,难以细致入微地解决根本问题,所以白帽子必然是在不断地分解问题,再对分解后的问题逐个予以解决。

比如设计一个解决方案,在特定环境下能够抵御所有已知的和未知的SQL Injection问题。假设这个方案的实施周期是3个月,那么执行3个月后,所有的SQL Injection问题都得到了解决,也就意味着黑客再也无法利用SQL Injection这一可能存在的弱点入侵网站了。如果做到了这一点,那么白帽子们就在SQL Injection的局部对抗中化被动为主动了。

No Patch For Stupid!

最大的漏洞就是人

新技术不在一开始就考虑安全设计的话,防御技术就必然会落后于攻击技术,导致历史不断地重复。

>> 1.3 返璞归真,揭秘安全的本质

通过一个安全检查(过滤、净化)的过程,可以梳理未知的人或物,使其变得可信任。

安全问题的本质是信任的问题。

在现实生活中,我们很少设想最极端的前提条件,因为极端的条件往往意味者小概率以及高成本,因此在成本有限的情况下,我们往往会根据成本来设计安全方案,并将一些可能性较大的条件作为决策的主要依据。

。因此,把握住信任条件的度,使其恰到好处,正是设计安全方案的难点所在,也是安全这门学问的艺术魅力所在。

2020. 3.24

>> 1.4 破除迷信,没有银弹

Pwn2own竞赛是每年举行的让黑客们任意攻击操作系统的一次盛会

>> 1.5 安全三要素

简称CIA安全三要素是安全的基本组成元素,分别是机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)。

完整性则要求保护数据内容是完整、没有被篡改的。常见的保证一致性的技术手段是数字签名。

了,停车场无法再提供正常服务。在安全领域中这种攻击叫做拒绝服务攻击,简称DoS(Denial of Service)。拒绝服务攻击破坏的是安全的可用性。

>> 1.6 如何实施安全评估

资产等级划分、威胁分析、风险分析、确认解决方案

如果面对的是一个尚未评估的系统,那么应该从第一个阶段开始实施;如果是由专职的安全团队长期维护的系统,那么有些阶段可以只实施一次。在这几个阶段中,上一个阶段将决定下一个阶段的目标,需要实施到什么程度。

>> 1.6.1 资产等级划分

资产等级划分是所有工作的基础,这项工作能够帮助我们明确目标是什么,要保护什么。

资源的可用性也可以理解为数据的可用性

在互联网的基础设施已经比较完善的今天,互联网的核心其实是由用户数据驱动的——用户产生业务,业务产生数据。互联网公司除了拥有一些固定资产,如服务器等死物外,最核心的价值就是其拥有的用户数据,所以——互联网安全的核心问题,是数据安全的问题。

接下来就是要划分信任域和信任边界了。通常我们用一种最简单的划分方式,就是从网络逻辑上来划分

>> 1.6.2 威胁分析

在安全领域里,我们把可能造成危害的来源称为威胁(Threat),而把可能会出现的损失称为风险(Risk)

比如使用一个模型,帮助我们去想,在哪些方面有可能会存在威胁,这个过程能够避免遗漏,这就是威胁建模。

STRIDE模型。STRIDE是6个单词的首字母缩写,我们在分析威胁时,可以从以下6个方面去考虑

头脑风暴的过程可以确定攻击面(Attack Surface)

一个威胁到底能够造成多大的危害,如何去衡量它?这就要考虑到风险了。

我们判断风险高低的过程,就是风险分析的过程

2020.3.25

>> 1.6.3 风险分析

风险由以下因素组成: Risk = Probability * Damage Potential

影响风险高低的因素,除了造成损失的大小外,还需要考虑到发生的可能性

如何更科学地衡量风险呢?这里再介绍一个DREAD模型,它也是由微软提出的。DREAD也是几个单词的首字母缩写,它指导我们应该从哪些方面去判断一个威胁的风险程度。

之所以会被这个模型判断为中危的原因,就在于一旦被突破,造成的损失太大,失败不起

所以会相应地提高该风险值。

在任何时候都应该记住——模型是死的,人是活的,再好的模型也是需要人来使用的,在确定攻击面,以及判断风险高低时,都需要有一定的经验,这也是安全工程师的价值所在。

>> 1.6.4 设计安全方案

安全评估的产出物,就是安全解决方案。解决方案一定要有针对性,这种针对性是由资产等级划分、威胁分析、风险分析等阶段的结果给出的。

从产品的角度来说,安全也应该是产品的一种属性。一个从未考虑过安全的产品,至少是不完整的。

对于互联网来说,安全是要为产品的发展与成长保驾护航的。我们不能使用“粗暴”的安全方案去阻碍产品的正常发展,所以应该形成这样一种观点:没有不安全的业务,只有不安全的实现方式。产品需求,尤其是商业需求,是用户真正想要的东西,是业务的意义所在,在设计安全方案时应该尽可能地不要改变商业需求的初衷。

作为安全工程师,要想的就是如何通过简单而有效的方案,解决遇到的安全问题。安全方案必须能够有效抵抗威胁,但同时不能过多干涉正常的业务流程,在性能上也不能拖后腿

好的安全方案对用户应该是透明的,尽可能地不要改变用户的使用习惯

一个优秀的安全方案应该具备以下特点:
❍ 能够有效解决问题;❍ 用户体验好;❍ 高性能;❍ 低耦合;❍ 易于扩展与升级。

>> 1.7 白帽子兵法

>> 1.7.1 Secure By DefauIt原则

“Secure by Default”原则,也可以归纳为白名单、黑名单的思想。

如果更多地使用白名单,那么系统就会变得更安全。

>> 1.7.1.1 黑名单、白名单

在Web安全中,对白名单思想的运用也比比皆是。

比如应用处理用户提交的富文本时,考虑到XSS的问题,需要做安全检查。常见的XSS Filter一般是先对用户输入的HTML原文作HTML Parse,解析成标签对象后,再针对标签匹配XSS的规则。

选择白名单的思想,基于白名单来设计安全方案,其实就是信任白名单是好的,是安全的。但是一旦这个信任基础不存在了,那么安全就荡然无存。

所以在选择使用白名单时,需要注意避免出现类似通配符“*”的问题。

Secure By Default的另一层含义就是“最小权限原则”。最小权限原则也是安全设计的基本原则之一。最小权限原则要求系统只授予主体必要的权限,而不要过度授权,这样能有效地减少系统、网络、应用、数据库出错的机会。

比如在Linux系统中,一种良好的操作习惯是使用普通账户登录,在执行需要root权限的操作时,再通过sudo命令完成

>2020.3.26

>> 1.7.1.2 最小权限原则

Secure By Default的另一层含义就是“最小权限原则”。最小权限原则也是安全设计的基本原则之一。最小权限原则要求系统只授予主体必要的权限,而不要过度授权,这样能有效地减少系统、网络、应用、数据库出错的机会。

比如在Linux系统中,一种良好的操作习惯是使用普通账户登录,在执行需要root权限的操作时,再通过sudo命令完成

。在使用最小权限原则时,需要认真梳理业务所需要的权限,在很多时候,开发者并不会意识到业务授予用户的权限过高。

>> 1.7.2 纵深防御原则

纵深防御包含两层含义:首先,要在各个不同层面、不同方面实施安全方案,避免出现疏漏,不同安全方案之间需要相互配合,构成一个整体;其次,要在正确的地方做正确的事情,即:在解决根本问题的地方实施针对性的安全方案。

在常见的入侵案例中,大多数是利用Web应用的漏洞,攻击者先获得一个低权限的webshell,然后通过低权限的webshell上传更多的文件,并尝试执行更高权限的系统命令,尝试在服务器上提升权限为root;接下来攻击者再进一步尝试渗透内网,比如数据库服务器所在的网段。

就入侵的防御来说,我们需要考虑的可能有Web应用安全、OS系统安全、数据库安全、网络环境安全等。在这些不同层面设计的安全方案,将共同组成整个防御体系,这也就是纵深防御的思想。

纵深防御的第二层含义,是要在正确的地方做正确的事情。如何理解呢?它要求我们深入理解威胁的本质,从而做出正确的应对措施

XSS真正产生危害的场景是在用户的浏览器上,或者说服务器端输出的HTML页面,被注入了恶意代码。只有在拼装HTML时输出,系统才能获得HTML上下文的语义,才能判断出是否存在误杀等情况。

>> 1.7.3 数据与代码分离原则

另一个重要的安全原则是数据与代码分离原则。这一原则广泛适用于各种由于“注入”而引发安全问题的场景。

缓冲区溢出,也可以认为是程序违背了这一原则的后果——程序在栈或者堆中,将用户数据当做代码执行,混淆了代码与数据的边界

此类问题均可以根据“数据与代码分离原则”设计出真正安全的解决方案,因为这个原则抓住了漏洞形成的本质原因。

如果把用户数据片段 $var当成代码片段来解释、执行,就会引发安全问题。

>>HTML语言中,网页中插入图片所用标签<img>, <img>的src属性用来指定图片位置。
>><img src=“ming.bmp”>便是插入名为ming.bmp的图象. 此时SRC是source的简写,
>意思是“源”即image的源文件为ming.bmp; 
>网页中插入脚本所用标签<script>,<script>的src属性用来指定脚本文件的位置。
><script src="1.js"></script>,意思如上;
>src

在这里应该对用户数据片段 $var进行安全处理,可以使用过滤、编码等手段,把可能造成代码混淆的用户数据清理掉

alert在英语中的意思是警告,javascript中,alert()是弹出警告框的意思。
alert

>> 1.7.4 不可预测性原则

前面介绍的几条原则:Secure By Default,是时刻要牢记的总则;纵深防御,是要更全面、更正确地看待问题;数据与代码分离,是从漏洞成因上看问题;接下来要讲的“不可预测性”原则,则是从克服攻击方法的角度看问题。

使用DEP来保证堆栈不可执行,使用ASLR让进程的栈基址随机变化,从而使攻击程序无法准确地猜测到内存地址,大大提高了攻击的门槛。

即使无法修复code,但是如果能够使得攻击的方法无效,那么也可以算是成功的防御。

不可预测性(Unpredictable),能有效地对抗基于篡改、伪造的攻击。

不可预测性原则,可以巧妙地用在一些敏感数据上。

比如在CSRF的防御技术中,通常会使用一个token来进行有效防御。这个token能成功防御CSRF,就是因为攻击者在实施CSRF攻击的过程中,是无法提前预知这个token值的,因此要求token足够复杂时,不能被攻击者猜测到

不可预测性的实现往往需要用到加密算法、随机数算法、哈希算法,好好使用这条原则

>> 1.8 小结

安全是一门朴素的学问,也是一种平衡的艺术。无论是传统安全,还是互联网安全,其内在的原理都是一样的。我们只需抓住安全问题的本质,之后无论遇到任何安全问题(不仅仅局限于Web安全或互联网安全),都会无往而不利,因为我们已经真正地懂得了如何用安全的眼光来看待这个世界!

>> (附)谁来为漏洞买单?

因为破坏有程度轻重之分,当破坏程度超过某一临界值时,多数人(注意不是所有人)会接受这是一个漏洞的事实。

loginID一旦泄露后,可能会导致被暴力破解;甚至有的用户将loginID当成密码的一部分,会被黑客猜中用户的密码或者是黑客通过攻击一些第三方站点(比如SNS)后,找到同样的loginID来尝试登录。

一个业务安全设计得好的网站,往往loginID和nickname(昵称)是分开的。登录ID是用户的私有信息,只有用户本人能够看到;而nickname不能用于登录,但可以公开给所有人看。这种设计的细节,是网站积极防御的一种表现。

在我看来,漏洞只是对破坏性功能的一个统称而已。

在当时的历史背景下,很多问题都不是“漏洞”,只是功能。

2020.3.28
好多没看懂,先停更一下哈,我真的没有犯懒在这里插入图片描述

发布了40 篇原创文章 · 获赞 3 · 访问量 524

猜你喜欢

转载自blog.csdn.net/weixin_43079958/article/details/105058789