Web安全学习笔记 序章
Web安全学习笔记 序章
繁枝插云欣 ——ICML8
- Web技术演化
- 网络攻防技术演化
- 网络安全观
- 法律与法规
1.1.Web技术演化
1.1.1 简单网站的进化史 
静态页面阶段
Web技术在最初的阶段
网站的主要内容是静态的
大多站点托管在ISP(在线系统编程)上
且基本由文字和图片组成
制作和表现形式也是以表格为主
当时的用户行为也非常简单
基本只是浏览网页
多媒体阶段
随着技术的不断发展
音频、视频、Flash等
多媒体技术诞生了
多媒体的加入使得网页页面变得更加生动形象
网页上的交互也给用户带来了更好的体验的观感
CGI阶段
渐渐的
多媒体已经逐渐不能满足人们的请求
于是CGI (Common Gateway Interface)
CGI(通用网关接口)
应运而生
CGI定义了
Web服务器与外部应用程序之间的通信接口标准
因此Web服务器可以通过CGI执行外部程序
让外部程序根据Web请求内容生成动态的内容
在这个时候
各种编程语言如PHP/ASP/JSP也逐渐加入市场
基于这些语言可以实现更加
模块化的功能和实现更强大的应用程序
MVC等思想的出现
经典MVC模式中
M是指业务模型
V是指用户界面
C则是控制器
使用MVC的目的是将M和V的实现代码分离
从而使同一个程序可以使用不同的表现形式
其中,View的定义比较清晰,就是用户界面。
随着Web应用开发越来越标准化
出现了MVC等思想
MVC是Model/View/Control的缩写
Model用于封装数据和数据处理方法
View视图是数据的HTML展现
Controller控制器负责响应请求
协调Model和View
Model,View和Controller的分开
是一种典型的关注点分离的思想
使得代码复用性和组织性更好
Web应用的配置性和灵活性也越来越好
而数据访问也逐渐通过面向对象的方式
来替代直接的SQL访问
出现了ORM框架的概念
ORM(Object Relational Mapping)框架
采用元数据来描述对象与关系映射的细节
元数据一般采用XML格式
并且存放在专门的对象一映射文件中
简单理解为一种框架的格式
除了MVC,类似的设计思想还有MVP、MVVM等
1.1.2. 数据交互的发展 
简单的数据交互
在Web技术发展最初,前后端交互大部分都使用
Web表单、XML、SOAP等较为简单的方式
Ajax的出现
(Asynchronous Javascript And XML)
(异步JavaScript和XML)
在开始的时候
用户直到提交整个表单后才能获取结果
导致了用户的体验感极差
于是Ajax技术(Web数据交互方式)
逐渐流行起来
它使得应用在不更新整个页面的前提下
也可以获得或更新数据
这使得Web应用程序更为迅捷地回应用户动作
并避免了在网络上重复发送那些没有改变的信息
RESTful架构是什么
REST指的是一组架构约束条件和原则
如果一个架构符合REST的约束条件和原则
我们就称它为RESTful架构
在CGI时期,前后端通常是没有做严格区分的
随着解耦和的需求不断增加
前后端的概念开始变得清晰
前端主要指网站前台部分
运行在PC端、移动端等浏览器上
展现给用户浏览的网站
由HTML5、CSS3、JavaScript组成
后端主要指网站的逻辑部分
涉及数据的增删改查等
此时
REST (Representation State Transformation)
逐渐成为一种流行的Web架构风格
REST鼓励基于URL来组织系统功能
充分利用HTTP本身的语义
而不是仅仅将HTTP作为一种远程数据传输协议
一般RESTful有以下的特征:
域名和主域名分开
api.example.com
example.com/api/
带有版本控制
api.example.com/v1
api.example.com/v2
使用URL定位资源
GET /users 获取所有用户
GET /team/:team/users 获取某团队所有用户
POST /users 创建用户
PATCH/PUT /users 修改某个用户数据
DELETE /users 删除某个用户数据
用 HTTP 动词描述操作
GET 获取资源 单个或多个
POST 创建资源
PUT/PATCH 更新资源 客户端提供完整的资源数据
DELETE 删除资源
正确使用状态码
使用状态码提高返回数据的可读性
默认使用 JSON 作为数据响应格式
有清晰的文档
GraphQL
graphql 是一种用于 API 的查询语言
对你的 API 中的数据提供了一套
易于理解的完整描述
使得客户端能够准确地获得它需要的数据
减少数据的冗余
部分网络服务场景的数据有复杂的依赖关系
为了应对这些场景
Facebook 推出了 GraphQL
以图状数据结构对数据进行查询存储
部分网站也应用了 GraphQL 作为 API 交互的方式
二进制
随着业务对性能的要求提高
前后端开始使用HTTP/2
自定义Protocol Buffer
等方式来加快数据交互
1.1.3. 架构的演进 
随着业务的不断发展
业务架构也越来越复杂
传统的功能被拆分成不同的模块
出现了中间件、中台等概念
代理服务、负载均衡、数据库分表
异地容灾、缓存、CDN、消息队列
安全防护等技术的应用越来越广泛
这增加了Web开发和运维的复杂度
客户端的形态越来越多
除了Web之外还有iOS、Android等
其他场景也出现在Web服务的客户端场景中
较早的关系型数据库MySQL、PostgreSQL等
已经不能满足需求
出现了Redis/Memcached缓存数据库
等一类满足特定需求的数据库
为了满足特定的业务需求
出现了
Lucene/Solr/Elasticsearch搜索应用服务器
Kafka/RabbitMQ/ZeroMQ消息系统
Spark计算引擎
Hive数据仓库平台等不同的基础架构
中间件
中间件是独立的软件程序
用于管理计算资源和网络通信
常用的功能有过滤IP、合并接口
合并端口、路由、权限校验
负载均衡、反向代理等
分布式
随着数据量的不断提高
单台设备难以承载这样的访问量
同时不同功能也被拆分到不同的应用中
于是出现了提高业务复用
及整合的分布式服务框架(RPC)
云服务
云计算诞生之前
大部分计算资源是处于“裸金属”状态的物理机
运维人员选择对应规格的硬件
建设机房的IDC网络
IDC(互联网数据中心)
完成服务的提供
投入硬件基础建设和维护的成本很高
云服务出现之后
使用者可以直接购买云主机
基础设施由供应商管理
这种方式也被称作
IaaS (Infrastructure-as-a-Service)
基础设施即服务
随着架构的继续发展
应用的运行更加细粒度
部署环境容器化
各个功能拆成微服务或是Serverless的构架
Serverless
Serverless 架构由两部分组成
即 Faas (Function-as-a-Service)
和 BaaS (Backend-as-a-Service)
FaaS是运行平台
用户上传需要执行的逻辑函数如一些定时任务
数据处理任务等到云函数平台
配置执行条件触发器、路由等等
就可以通过云平台完成函数的执行
BaaS包含了后端服务组件
它基于 API 完成第三方服务
主要是数据库、对象存储、消息队列、日志服务等
微服务
微服务起源于2005年Peter Rodgers博士
在云端运算博览会提出的微Web服务
(Micro-Web-Service)
根本思想类似于Unix的管道设计理念
2014年,由Martin Fowler与James Lewis
共同提出了微服务的概念
定义了微服务架构风格是一种通过
一套小型服务来开发单个应用的方法
每个服务运行在自己的进程中
并通过轻量级的机制进行通讯 (HTTP API)
微服务是一种应用于组件设计和
部署架构的软件架构风格
它利用模块化的方式组合出复杂的大型应用程序:
1.各个服务功能内聚,实现与接口分离
2.各个服务高度自治、相互解耦
可以独立进行部署、版本控制和容量伸缩
3.各个服务之间通过 API 的方式进行通信
4.各个服务拥有独立的状态
并且只能通过服务本身来对其进行访问
随着微服务技术的不断发展
这种思想也被应用到了前端
2018年
第一个微前端工具single-spa出现在github
而后出现了基于single-spa的框架qiankun
API网关
API网关是一个服务器
客户端只需要使用简单的访问方式
统一访问API网关
由API网关来代理对后端服务的访问
同时由于服务治理特性统一放到API网关上面
服务治理特性的变更可以做到对客户端透明
一定程度上实现了
服务治理等基础特性和业务服务的解耦
服务治理特性的升级也比较容易实现
1.1.5. 软件开发 
CI/CD
持续集成 (Continuous Integration, CI)
是让开发人员将工作集成到共享分支中的过程
频繁的集成有助于解决隔离,减少每次提交的大小
以降低合并冲突的可能性
持续交付 (Continuous Deployment, CD)
是持续集成的扩展
它将构建从集成测试套件部署到预生产环境
这使得它可以直接在类生产环境中评估每个构建
因此开发人员可以在无需增加任何工作量的情况下
验证bug修复或者测试新特性
1.1.6. 参考链接 
Scaling webapps for newbs
https://arcentry.com/blog/scaling-webapps-for-newbs-and-non-techies/
GitHub 的 Restful HTTP API 设计分解
https://learnku.com/articles/24050
1.2. 网络攻防技术演化
1.2.1. 历史发展 
1939年,图灵破解了Enigma
使战争提前结束了两年
这是较早的一次计算机安全开始出现在人们的视野中
这个时候计算机的算力有限
人们使用的攻防方式也相对初级
1949年
约翰·冯·诺依曼(John Von Neumann)
提出了一种可自我复制的程序的设计
这被认为是世界上第一种计算机病毒
1970年到2009年间
随着因特网不断发展
网络安全也开始进入人们的视野
在网络发展的初期
很多系统都是零防护的
安全意识也尚未普及开来
很多系统的设计也只考虑了可用性
对安全性的考虑不多
所以在当时结合搜索引擎与一些集成渗透测试工具
可以很容易的拿到数据或者权限
1972年,缓冲区溢出攻击
被Computer Security Technology Planning Study 提出
1984年,Ken Thompson 在 Reflections on Trusting Trust
一文中介绍了自己如何在编译器中
增加后门来获取 Unix 权限的
这也是较早的供应链攻击
1988年,卡耐基梅隆大学(Carnegie Mellon University, CMU)
的一位学生以测试的目的编写了Morris Worm
对当时的互联网造成了极大的损害
同年,CMU的CERT Coordination Center(CERT-CC)
为了处理Morris Worm对互联网造成的破坏
组成了第一个计算机紧急响应小组
(Computer Emergency Response Team)
而后全球多个国家、地区、团体
都构建了CERT、SRC等组织
同样是在1988年,Barton Miller教授在威斯康星大学的计算机实验课上
首次提出Fuzz生成器(Fuzz Generator)的概念
用于测试Unix程序的健壮性
即用随机数据来测试程序直至崩溃
因此,Barton Miller教授
也被多数人尊称为"模糊测试之父"
1989年,C.J.Cherryh发表了小说
The Cuckoo's Egg:
Tracking a Spy Through the Maze of Computer Espionage
这本书是作者根据追溯黑客攻击的真实经历改编
在书中提出了蜜罐技术的雏形
1990年,一些网络防火墙的产品开始出现
此时主要是基于网络的防火墙
可以处理FTP等应用程序
1993年起,Jeff Moss开始每年在
美国内华达州的拉斯维加斯
举办 DEFCON
(也写做 DEF CON, Defcon, or DC,
全球最大的计算机安全会议之一)
CTF (Capture The Flag)比赛的形式
也是起源于1996年的 DEFCON
1993年7月,Windows NT 3.1发布
引入了身份认证、访问控制和安全审计等
安全控制机制
在此之前的 Windows9x内核几乎没有
任何安全性机制
1996年,Smashing the Stack For Fun and Profit
发表在堆栈的缓冲区溢出的利用方式上
做出了开创性的工作
1997年起,Jeff Moss开始举办 Black Hat
以中立的立场进行信息安全研究的交流和培训
到目前为止,Black Hat也会在欧洲和亚洲举行
1998年12月,Jeff Forristal在一篇文章中
提到了使用SQL注入的技巧攻击一个网站的例子
从此SQL注入开始被广泛讨论
1999年1月21日-22日的第二届
Research with Security Vulnerability Databases
的WorkShop上
MITRE 的创始人
David E. Mann 和 Steven M. Christey
发表了一篇名为
《Towards a Common Enumeration of Vulnerabilities
的白皮书
提出了CVE
(Common Vulnerabilities and Exposures, 通用漏洞披露)
的概念
在当年收录并公开了321个CVE漏洞
1999年12月,MSRC的一些工程师发现了
一些网站被注入代码的例子
他们在整理讨论后公开了这种攻击
并称为 Cross Site Scripting
2002年1月,Microsoft发起了 “可信赖计算”
(Trustworthy Computing)计划
以帮助确保产品和服务在本质上具有高度安全性
可用性,可靠性以及业务完整性
SDL (Security Development Lifecycle)
也在此时被提出
2001年9月9日
Mark Curphey启动了OWASP
(Open Web Application Security Project)项目
开始在社区中提供一些
Web攻击技术的文章、方法和工具等
在此之后
Responsible disclosure/Full disclosure
等概念
也不断进入人们的视野之中。
2002年10月4日,Kevin Mitnick 编著的
The Art of Deception(欺骗的艺术)出版
这本书详细的介绍了
社会工程学在攻击中是如何应用的
Kevin Mitnick也被认为是社会工程学的开山鼻祖
2005年7月25日
Zero Day Initiative (ZDI) 创建
鼓励负责任的漏洞披露
2005年11月
基于从1941年2月开始的情报收集积累和发展
Director of National Intelligence
宣布成立 Open Source Center(OSC)
进行开源情报的收集
而后 Open-source intelligence(OSINT)
的概念也不断被人们认知。
2006年
APT(Advanced Persistent Threat,高级持续威胁)
攻击的概念被正式提出
用来描述从20世纪90年代末到21世纪初
在美国军事和政府网络中发现的
隐蔽且持续的网络攻击
2006年起,美国国土安全部(DHS)开始
每两年举行一次 “网络风暴”(Cyber Storm)系列
国家级网络事件演习
随着时代不断的发展
攻防技术有了很大的改变
防御手段、安全意识也随着演化
在攻击发生前有威胁情报、黑名单共享等机制
威胁及时能传播
在攻击发生时有基于各种机制的防火墙
如关键字检测、语义分析、深度学习
有的防御机制甚至能一定程度上防御零日攻击
在攻击发生后
一些关键系统系统做了隔离
攻击成果难以扩大
就算拿到了目标也很难做进一步的攻击
也有的目标蜜罐仿真程度很高
有正常的服务和一些难以判断真假的业务数据
2010年6月,震网 (Stuxnet) 被发现
在这之后供应链攻击事件开始
成为网络空间安全的新兴威胁之一
随后的XcodeGhost、CCleaner等
供应链攻击事件都造成了重大影响
在2010年Forrester Research Inc.的分析师
提出了“零信任”的概念模型时
2012年1月,Gartner 公司提出了IAST
(Interactive Application Security Testing)
的概念
提供了结合 DAST 和 SAST 两种技术的解决方案
这种方式漏洞检出率高、误报率低
同时可以定位到API接口和代码片段
2012年9月,Gartner公司研究员
David Cearley提出了DevSecOps的概念
表示 DevOps 的流程应该包含安全理念
2013年,MITRE 提出了 ATT&CK?
(Adversarial TacticsTechniques
and Common Knowledge, ATT&CK)
这是一个站在攻击者的视角来描述
攻击中各阶段用到的技术的模型
2013年,Michigan 大学开始了ZMap项目
在2015年这个项目演化为 Censys
从这之后网络空间测绘的项目逐渐出现
2014年,在Gartner Security and Risk Management Summit上
Runtime Application Self-protection
(RASP)的概念被提出
在应用层进行安全保护
2015年,Gartner首次提出了SOAR的概念
最初的定义是
Security Operations
Analytics and Reporting
即安全运维分析与报告
2017年,Gartner对SOAR概念做了重新定义
Security Orchestration
Automation and Response
即安全编排、自动化与响应
1.2.2. 参考链接 
OWASP
https://en.wikipedia.org/wiki/OWASP
NT Web Technology Vulnerabilities
http://phrack.org/issues/54/8.html
History of CVE
https://cve.mitre.org/about/history.html
history of some vulnerabilities and exploit techniques
https://documents.pub/document/history-of-some-vulnerabilities-and-exploit-techniques.html
securitydigest
http://securitydigest.org/
Early Computer Security Papers: Ongoing Collection
https://seclab.cs.ucdavis.edu/projects/history/CD/
Security Mailing List Archive
https://seclists.org/
Computer Security Technology Planning Study
https://csrc.nist.gov/csrc/media/publications/conference-paper/1998/10/08/proceedings-of-the-21st-nissc-1998/documents/early-cs-papers/ande72.pdf
Smashing The Stack For Fun And Profit
https://inst.eecs.berkeley.edu/~cs161/fa08/papers/stack_smashing.pdf
Happy 10th birthday Cross-Site Scripting!
https://docs.microsoft.com/en-us/archive/blogs/dross/happy-10th-birthday-cross-site-scripting
About Microsoft SDL
https://www.microsoft.com/en-us/securityengineering/sdl/about
ABOUT ZDI
https://www.zerodayinitiative.com/about/
Runtime Application Self-protection (RASP)
https://www.gartner.com/en/information-technology/glossary/runtime-application-self-protection-rasp
ZMap: Fast Internet-Wide Scanning and its Security Applications
https://zmap.io/paper.pdf
A Search Engine Backed by Internet-Wide Scanning
https://censys.io/static/censys.pdf
Black hat About
https://www.blackhat.com/about.html
The DEF CON Story
https://defcon.org/html/links/dc-about.html
Reflections on Trusting Tr
https://users.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf
What is DevSecOps?
https://www.devsecops.org/blog/2015/2/15/what-is-devsecops
1.3. 网络安全观
1.3.1. 网络安全定义 
网络安全的一个通用定义
指网络信息系统的硬件、软件及其
系统中的数据受到保护
不因偶然的或者恶意的
破坏、更改、泄露
系统能连续、可靠、正常地运行
服务不中断
网络安全简单的说是在网络环境下
能够识别和消除不安全因素的能力
网络安全在不同环境和应用中有不同的解释
例如系统运行的安全
系统信息内容的安全
信息通信与传播的安全等
网络安全的基本需求包括
可靠性、可用性、保密性
完整性、不可抵赖性、可控性
可审查性、真实性等
其中三个最基本的要素是
机密性 (Confidentiality)
完整性 (Integrity)
可用性 (Availability)
机密性是不将有用信息泄漏给非授权用户的特性
可以通过信息加密、身份认证
访问控制、安全通信协议等技术实现
信息加密是防止信息非法泄露的最基本手段
主要强调有用信息只被授权对象使用的特征
完整性是指信息在传输、交换、存储和处理过程中
保持信息不被破坏或修改
不丢失和信息未经授权不能改变的特性
也是最基本的安全特征
可用性指信息资源可被授权实体按要求访问
正常使用或在非正常情况下能恢复使用的特性
在系统运行时正确存取所需信息
当系统遭受意外攻击或破坏时
可以迅速恢复并能投入使用
是衡量网络信息系统面向用户的一种安全性能
以保障为用户提供服务
网络安全的主体是保护网络上的数据和通信的安全
数据安全性是指软硬件保护措施
用来阻止对数据进行非授权的泄漏、转移
修改和破坏等,通信安全性是通信保护措施
要求在通信中采用保密安全性、传输安全性
辐射安全性等措施
1.3.2. 系统脆弱性 
信息系统本身是脆弱的
信息系统的硬件资源.通信资源.软件及信息资源等
都可能因为可预见或不可预见
甚至恶意的原因而可能导致系统受到
破坏、更改、泄露和功能失效
从而使系统处于异常状态
甚至崩溃瘫痪
硬件资源的脆弱性主要表现为
物理安全方面的问题
多源于设计
采用软件程序的方法见效不大
软件的脆弱性来源于
设计和软件工程实施中遗留问题
如设计中的疏忽、内部设计的逻辑混乱
没有遵守信息系统安全原则进行设计等
1.4. 法律与法规
1.4.1. 相关链接 
中华人民共和国网络安全法
http://www.npc.gov.cn/
网络产品安全漏洞管理规定
http://www.gov.cn/zhengce/zhengceku/2021-07/14/content_5624965.htm
关键信息基础设施安全保护条例
http://www.gov.cn/zhengce/content/2021-08/17/content_5631671.htm
中华人民共和国个人信息保护法
http://www.npc.gov.cn/npc/c30834/202108/a8c4e3672c74491a80b53a172bb753fe.shtml
中华人民共和国数据安全法
http://www.npc.gov.cn/npc/c30834/202106/7c9af12f51334a73b56d7938f99a788a.shtml