网安-入门1

网络安全法

《中华人民共和国网络安全法》是为了保障网络安全,维护网络空间主权和国家安全、社会公共利益,保护公民、法人和其他组织的合法权益,促进经济社会信息化健康发展,制定的法律,对中国网络空间法治化建设具有重要意义。

第二十六条 开展网络安全认证、检测、风险评估等活动,向社会发布系统漏洞、计算机病毒、网络攻击、网络侵入等网络安全信息,应当遵守国家有关规定。

第二十七条 任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具;明知他人从事危害网络安全的活动的,不得为其提供技术支持、广告推广、支付结算等帮助。

第六十二条 违反本法第二十六条规定,开展网络安全认证、检测、风险评估等活动,或者向社会发布系统漏洞、计算机病毒、网络攻击、网络侵入等网络安全信息的,由有关主管部门责令改正,给予警告;拒不改正或者情节严重的,处一万元以上十万元以下罚款,并可以由有关主管部门责令暂停相关业务、停业整顿、关闭网站、吊销相关业务许可证或者吊销营业执照,对直接负责的主管人员和其他直接责任人员处五千元以上五万元以下罚款。

第六十三条 违反本法第二十七条规定,从事危害网络安全的活动,或者提供专门用于从事危害网络安全活动的程序、工具,或者为他人从事危害网络安全的活动提供技术支持、广告推广、支付结算等帮助,尚不构成犯罪的,由公安机关没收违法所得,处五日以下拘留,可以并处五万元以上五十万元以下罚款;情节较重的,处五日以上十五日以下拘留,可以并处十万元以上一百万元以下罚款。

安全观念

web安全简史

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

起初,研究计算机系统和网络的人被称为“Hacker”,他们对计算机系统有深入的理解,因此往往能够发现其中的问题。Hacker 在中国按照音译叫作“黑客”。在计算机安全领域,黑客是一群破坏规则、不喜欢拘束的人,因此总想着找到系统的漏洞,以获得一些规则之外的权力。对于现代计算机系统来说,用户态的最高权限是root(或Administrator),也是黑客们最渴望获取的系统最高权限。“root”对黑客的吸引,就像兔子对饿狼的吸引。

不想获取“root”权限的黑客,不是好黑客。漏洞利用代码能够帮助黑客达成这一目标。黑客使用的漏洞利用代码,被称为“exploit”。在黑客的世界里,有的黑客精通计算机技术,能自己挖掘漏洞并编写exploit;而有的黑客则只对攻击本身感兴趣,对计算机原理和各种编程技术的了解比较粗浅,因此只能使用别人的代码,自己并没有开发和创造能力,这种黑客被称为Script Kid”,即“脚本小子”。在现实世界里,真正造成破坏的,往往并非那些挖掘并研究漏洞的黑客,而是这些脚本小子。在今天已经形成黑色产业的计算机犯罪、网络犯罪中,造成主要破坏的,也是这些脚本小子。

黑客技术发展历程

在早期(2002年前),黑客的主要攻击目标是系统软件。一方面,是这个时期的web技术还远远不成熟;另一方面,则是因为通过攻击系统软件,黑客往往能够直接获取root权限。这段时期产生了非常多的经典漏洞以及exploit。

网安-入门1_第1张图片

在早期互联网上,web应用并非主流应用,相对来说,基于SMTP、POP3、FTP等协议的服务拥有绝大多数的用户。因此,黑客的主要攻击目标是网络、操作系统及软件等,Web安全领域的攻击与防御技术均处于非常原始的阶段。

相对于那些攻击系统软件的 exploit 而言,基于 Web 的攻击一般只能让黑客获取一个较低权限的账户,对黑客的吸引力远远不如直接攻击系统软件。

但是时代在发展,防火墙技术的兴起改变了互联网安全的格局,尤其是以 Cisco、华为等为代表的网络设备厂商,开始在网络产品中更加重视网络安全,最终改变了互联网安全的走向。防火墙、ACL 技术的兴起,使得直接暴露在互联网上的系统得到了保护。

比如一个网站的数据库,在没有保护的情况下,数据库服务的端口是允许任何人随意连接的。在有了防火墙的保护后,通过 ACL 可以只允许来自可信任来源的访问。这些措施在很大程度上保证了系统软件处于信任边界之内,从而杜绝了大部分的攻击来源。

2003 年的冲击波蠕虫是一个里程碑式的事件,这个针对 Windows 操作系统 RPC 服务(运行在 445 端口)的蠕虫,在很短的时间内席卷了全球,导致数百万台机器被感染,造成的损失难以估量。在此次事件后,网络运营商们很坚决地在骨干网络上屏蔽了 135、445 等端口的连接请求,而且整个互联网对于安全的重视达到了一个空前的高度。

在运营商的网络策略、企业防火墙的共同作用之下,暴露在互联网上的非 Web 服务越来越少,而web技术的成熟也使得越来越多的服务web应用化。最终,web成为互联网上的主流服务。黑客们的目光,也渐渐转移到了web这块大蛋糕上。

此外,近年来移动互联网和云计算的快速发展,也催生了移动安全和云安全等重要的分支,每一个分支单独来看都是一个大的领域,它们与web安全会有交叉的地方。

web安全的兴起

web攻击技术的发展可以分为几个阶段。在Web1.0时代,人们更多的是关注服务端动态脚本的安全问题,比如攻击者将一个可执行脚本(俗称webshell)上传道服务器上,从而获得权限。动态脚本语言的普及,以及web技术发展初期对安全问题认知的不足,导致很多web安全血案,也遗留下很多历史问题。比如,php语言至今仍然只能靠较好的 代码规范来保证没有文件包含漏洞,而无法从语言本身杜绝此类安全问题。

SQL 注入 (SQL Injection)的出现是 Web 安全史上的一个里程碑,它最早大概出现在 1999年,并很快就成为 Web 安全的头号大敌。就如同出现缓冲区溢出时一样,程序员们不得不夜以继日地修改程序中存在的漏洞。黑客们发现通过 SOL 注入漏洞,可以获取很多重要的、敏感的数据,甚至能够通过数据库获取系统访问权限,这种效果并不比直接攻击系统软件差,因此Web 攻击一下子就流行起来。SOL 注入至今仍然是 Web 安全领域的一个重要课题。

XSS 攻击(Cross-Site Scripting,跨站脚本攻击)的出现则是 Web 安全史上的另一个里程碑,实际上,XSS 攻击出现的时间和SQL 注入差不多,但是它真正引起人们重视大概是在 2003年以后。在经历了 MySpace 的XSS 蠕虫事件后,安全界对XSS 的重视程度提高了很多,OWASP2007 Top 10 威胁甚至把XSS 排在榜首。

伴随着 Web 2.0 的兴起,XSS、CSRF 等攻击已经变得更为强大。Web 攻击也从服务端转客户端,转向浏览器和用户。黑客们的攻击思路覆盖了 Web 的每一个环节,攻击形式变得更加多样化。

Web 应用变得越来越复杂,涌现出大量企业级应用标准和框架。最典型的是 Java 语言及其生态,Java 丰富的开源组件和日益复杂的技术栈,吸引了众多安全人员进行研究,漏洞挖掘和防御技术的深度都今非昔比,已经不能再用“脚本小子”来形容 Web 安全研究人员。

Web 技术发展到今天,构建出了丰富多彩的互联网。移动互联网的蓬勃发展,把 HTML5迅速引爆;云计算的快速普及,给应用的开发、部署和运维带来了全新的体验;浏览器厂商群雄逐鹿,把 Web 标准推向了新高度。与此同时,Web 安全技术也将紧跟互联网发展的脚步,不断地演化。

安全的本质

安全是什么? 在什么样的况下会产生安全问题?我们要如何看待安全问题? 只有弄清楚这些最基本的问题,才能明白攻击与防御技术的出发点,才能明白为什么我们要这样做或那样做。

在武侠小说中,真正的高手往往对武功有着最透彻、最接近本质的理解,达到了返璞归的境界。在安全领域认为搞明白了安全的本质,就好比学会了“独孤九剑”,天下武功万变不离其宗,遇到任何复杂的情况都可以轻松应对,任何安全方案也都可以信手拈来了。

那么,一个安全问题是如何产生的呢?我们不妨先从现实世界入手。在火车站、机场里在乘客们开始旅程之前,都有一个必要的程序: 安全检查。机场的安全检查,会扫描乘客的李箱,检查乘客身上是否携带了打火机、可燃液体等危险物品。抽象地说,这种安全检查,就是过滤掉有害的、危险的东西。因为在飞行的过程中,飞机远离地面,如果发生危险,将会接危及乘客的生命安全。因此,飞机是一个高度敏感和重要的区域,任何有危害的物品都不该进入这一区域。为了达到这一目标,登机前的安全检查就是一个非常有必要的步骤

从安全的角度来看,我们划分出不同重要程度的区域:通过安全检查(过滤、净化)过,可以梳理未知的人或物,使其变得可信任。被划分出来的具有不同信任级别的域,我们称为信任域;两个不同信任域之间的边界,我们称为信任边界。

数据从高等级的信任域流向低等级的信任域,是不需要经过安全检查的;数据从低等级的信任域流向高等级的信任域,则需要经过信任边界的安全检查。

我们在机场通过安检后,想要从候机厅出来,是不需要做检查的:但如果要再回到候机厅则需要再做一次安全检查,就是这个道理。

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

一切安全方案都是建立在信任关系上的。我们必须相信一些东西,必须有一些最基本的假设,安全方案才能得以建立;如果我们否定一切,安全方案就会如无源之水、无根之木,无法设计,也无法完成。

举例来说,假设我们有一份很重要的文件要好好保管,能想到的一个方案是把文件“锁”到抽屉里。这里就包含了几个基本的假设,首先,制作这把锁的工匠是可以信任的,他没有私自藏一把钥匙;其次,制作抽屉的工匠没有私自给抽屉装一个后门;最后,钥匙还必须保管在一个不会出问题的地方,或者交给值得信任的人保管。反之,如果我们一切都不信任,那么也就不可能认为文件放在抽屉里是安全的。

当制锁的工匠无法打开锁时,文件才是安全的,这是我们假设的前提之一。但是如果那个工匠私自藏有一把钥匙,那么这份文件也就不再安全了。这个威胁存在的可能性,依赖于对工匠的信任程度。如果我们信任工匠,那么在这个前提下,我们就能确定文件的安全性。这种对条件的信任程度,是确定对象是否安全的基础。

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

由此看来,安全的本质又是一个概率问题。一个好的安全方案,需要在成本和攻击的概率之间做好平衡,这是一种艺术。如果将任何风险推至极端情况,将攻击概率放大,认为攻击是种必然事件,则安全方案将无从实施。一个好的安全方案,是在有限的时空范围中,对有限的资产所面临的有限威胁,给出一个遭受攻击的概率的断言,进而针对这一断言实施安全策略。其难度就好比你去医院看病,医生总是很难把话说得太绝对一样。计算机系统的安全问题和人类的身体健康问题类似,疾病的诊断方案总会有小概率事件,医生无法做出 100%的承诺。

比如,在设计物理安全方案时,需要根据不同的地理位置、不同的政治环境等,考虑台风地震、战争等因素。但在考虑、设计安全方案时,根据这些情况发生的可能性,需要确定不同的侧重点。如果机房位于大陆深处,考虑台风的因素则显得不太实际;同样的道理,在大陆板块稳定的地区,考虑地震的因素也会带来较高的成本。而极端的情况比如“彗星撞击地球后如何保证机房不受影响”的问题,一般都不在考虑之中,因为发生的可能性太小。

从另一个角度来说,一旦我们作为决策依据的条件被破坏、被绕过,那么安全方案所假设的前提条件就不再可靠,变成一个伪命题。因此,把握信任条件的度,使其恰到好处,正是设计安全方案的难点所在,也是安全这门学问的魅力所在

近年来安全产业界流行一个概念叫“零信任”,这是一个容易被混淆的概念。“零信任”的提出源自谷歌的内部安全团队出于安全上的考虑去除了网络边界防火墙,而将访问控制策略的粒度细化到每个员工和应用上,意为即便在公司内部,应用也默认不会信任内部的访问者,只有当访问者拥有合法的身份凭证和明确的授权时才能访问应用。“零信任”把网络访问的信任条件限制为可信的身份和明确的授权,很多时候还要求设备是可信的,所以在“零信任”中也存在信任条件。从安全设计的思想上来说,“零信任”是不存在的,如果什么都不信任,安全就无从谈起。

没有绝对的安全

安全是一个持续对抗的过程

自从互联网有了安全问题以来,攻击和防御技术就在不断碰撞和对抗的过程中得到发展。从微观上来说,在某一时期可能某一方占了上风;但是从宏观上来看,某一时期的攻击或防御技术,都不可能永远有效,永远用下去。这是因为防御技术在发展的同时,攻击技术也在不断发展,两者是互相促进的辩证关系。以不变的防御手段对抗不断发展的攻击技术,就犯了刻舟求剑的错误。在安全领域,没有银弹。

很多安全厂商在推销自己的产品时,会向用户描绘一些很美好的蓝图,似乎他们的产品无所不能,购买之后用户就可以高枕无忧了。但实际上,安全产品本身也需要不断升级,也需要有人来运营。产品本身也需要推陈出新,否则就会被淘汰。在现代的互联网产品中,自动升级功能已经成为一个标准配置,一个有活力的产品总是会不断地改进自身

微软在发布 Vista 时,曾信誓旦旦地保证这是有史以来最安全的操作系统。我们看到了微软的努力,Vista的安全问题确实比它的前辈们(Windows XP、Windows2000Windows 2003等)少了许多,尤其是高危的漏洞。但即便如此,在 2008 年的Pwn2own 竞赛上,Vista 也被黑客成功攻击。Pwn2own 竞赛是每年举行的允许黑客任意攻击操作系统的盛会,一般黑客们都会提前准备好 0day 漏洞的攻击程序,以求在会上一举夺魁。

黑客在不断地研究和寻找新的攻击技术,作为防御的一方,我们没有理由不持续跟进。微软近几年在产品安全上做得越来越好,其所推崇的安全开发流程将安全检查贯穿于整个软件生命周期。经过实践检验,这是一条可行的道路。对每一个产品,都要持续地实施严格的安全查,这是微软通过自身的教训传授给业界的宝贵经验。而安全检查本身也需要不断更新,增加针对新型攻击方式的检测与防御方案。

安全的三要素

要全面地认识一个安全问题,我们有很多种办法,但首先要理解安全问题的组成。前人通过无数实践,最后将安全的属性总结为安全三要素。安全三要素是安全的基本组成元素,分别是机密性 (Confidentiality)、完整性 (Integrity) 和可用性 (Availability),简称为 CIA

机密性要求数据内容不能泄露,加密是实现机密性要求的常见手段。

比如,在前面的例子中,如果文件不是放在抽屉里,而是放在一个透明的玻璃盒子里,那么虽然外人无法直接获取文件,但因为玻璃盒子是透明的,文件内容还是可能会被人看到,所以不符合机密性要求。但是如果给文件增加一个封面,掩盖文件内容,那么也起到了隐藏的效果,从而满足了机密性要求。可见,我们在选择安全方案时,需要灵活变通,因地制宜,没有一成不变的方案。

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

传说清朝康熙皇帝遗诏中写的是“传位十四子”,结果被当时还是四阿哥的胤镇篡改,变成了“传位于四子”。我们姑且不论传说的真实性,在这个故事中,对遗诏的保护显然没有达到完整性要求。如果在当时有数字签名之类的技术,遗诏就很难被篡改。从这个故事也可以看出保护数据的完整性、一致性的重要意义。

可用性要求保证资源是“随需而得”的。

假设一个停车场里有 100 个车位,在正常情况下,可以停 100 辆车。但是某一天,有个坏人搬了 100 块大石头,把每个车位都占用了,导致停车场无法正常提供服务。在安全领域中,这种攻击叫作拒绝服务攻击(DenialofService,DoS)。拒绝服务攻击破坏的是安全的可用性。

在安全领域中,最基本的要素就是这三个,后来还有人想扩充,增加了诸如可审计性、不可抵赖性等,但最重要的还是以上三个要素。在设计安全方案时,也要以这三个要素为基本的出发点,全面地思考所面对的问题。

态势感知

这些年随着云计算、大数据和人工智能技术的进步,数据成为一种生产要素,安全方案的设计也与时俱进。其中最重要的变化趋势是“以数据为核心构建安全系统

安全是一个持续对抗的过程,必然存在攻防两方,而在大规模网络对抗过程中,能够快速根据攻防态势的变化进行决策和行动的一方,将在对抗过程中获得优势,因此可以借用军事上的一个术语“态势感知”来描述这种攻防对抗的能力。安全方案的设计目标,在新形势和新技术下,就变成“全面、快速、准确地感知敌我双方态势”。这里既包括“态”,即我方的资产漏洞和攻击面,敌方的威胁源和能力;也包括“势”,即我方动向、敌方动向、敌方的动机、敌方攻击的可能性,以及外部环境。因此,态势感知是一种实时的基于内外环境的综合研判。

通过数字化技术,可以对敌我双方和外部环境建立一套实时的数据沙盘,监控系统运行情况,模拟敌我双方动态和可能采取的策略,从而有针对性地进行有效防御。全面、快速、准确是对数据的要求,数字化是实施态势感知的关键,决定了防御系统的成败。因此,这种攻防的对抗也是对信息和情报收集能力的考验,掌握更多数据和信息的一方将获得胜利。一个好的态势威知系统甚至能做到对全互联网的准确实时监控,对暴露在互联网上的资产、端口进行大范围的感知。

在情报学中,一般将收集到的材料按照价值的高低分为数据、信息、知识和情报等四个层次。最基础的数据来自各个采集单元,它是没有组织形式的原始内容,如一串数字或字符,对数据进行汇总和治理,从中提取和推导出有价值、有意义的内容,就将数据转换为了信息;基于信息,我们可以提取出更抽象和通用的知识,知识之间有逻辑关系,可以进行推理;基于信息和知识,最终可以提炼出情报。情报是含金量最高的信息,是短时间内对于少数人有价值的信息,一般具有秘密性。安全攻防的对抗也是情报的对抗,在大数据时代,大数据和云计算的方法也开始被用于收集情报。

美国的 FireEye 公司最早提出了“威胁情报”的概念,该公司从一些蠕虫和木马后门的逆向分析开始,通过记录恶意程序的指纹,结合从互联网上采集到的信息,推测攻击者是什么黑客组织,源自哪里,惯用手法是什么,能力如何。此后,其他一些安全公司的威胁情报则来自共享的威胁源数据。随着部署的安全终端增加,当某一个终端被攻击后,所采集到的攻击者信息就成为威胁情报的一部分,被分发给其他未受攻击的终端进行防御。一些分布式的蜜罐系统或者探针系统,在互联网上部署了成千上万个点,用于采集攻击者信息,形成威胁情报。

随着对威胁情报研究的深入,另一家名为 MITRE 的公司提出了“攻击矩阵”-ATT &CK框架。黑客在攻击时一般会综合运用一系列技术,打的是一套组合拳。ATT & CK 框架尝试将每一种攻击方式还原为一个个原子步骤,将攻击的基本步骤结构化。建立 ATT& CK 框架是项繁杂的工作,需要具备丰富的攻防技术知识,但这项工作进一步完成了对攻击过程的数字化可以通过数据驱动来分析所有的攻击行为。

基于以上这些新的方式,尤其随着态势感知、威胁情报、数据化安全系统的出现,安全系统逐渐往自适应的智能化控制系统演进。当一个计算机系统的安全治理体系完成充分的数字化后,自动化控制就成为可能。目前出现的一些半人工的安全编排系统,就通过脚本语言的方式实现了对系统中各个安全设备、安全模块、安全策略的统一控制。如果安全系统朝自动化方向进一步演化,就会出现自适应的安全控制系统,这种系统就会表现出类似于人体免疫系统的能力。

HTTP和Web应用

HTTP协议

HTTP的全称是Hypertext transfer protocol,他是构建web应用的基础,虽然开发web应用大部分时候都不用关心http协议细节,但是如果未能正确的使用该协议,可能会带来安全隐患。HTTP协议设计的内容非常多,西面将简单介绍HTTP协议中和安全有关的知识。

HTTP协议简介

HTTP协议是一种Client-Server协议,所以只能由客户端单向发起请求,服务端再响应请求。这里的客户端也叫用户代理(User Agent),在大多数情景下是一个浏览器

网安-入门1_第2张图片

HTTP请求

http通信由请求和响应组成,一个HTTP请求的数据包如下所示。(抓包演示)

网安-入门1_第3张图片

http请求方法

http方法用于指定请求的操作系统,标准的方法如下所示

方法 用途
OPTIONS 用于客户端向服务端询问是否支持特定的选项
GET 向服务端获取URI指定的资源
HEAD 和GET方法类似,但是服务端不返回实际内容
POST 向服务端提交数据
PUT 向指定的URL存储文件
DELETE 删除URI指定的服务器上的文件
TRACE 让服务器回显请求中的内容
CONNECT 用户在HTTP协议中建立代理隧道

Web应用中的绝大部分请求使用的是GET和POST方法,通过XMLHttpRequest 可以发送HEAD、PUT、DELETE 方法的请求。在部分场景下,浏览器会发送OPTIONS 请求,用于预检。CONNECT 请求一般用于HTTP 隧道代理场景。

虽然 Web 应用中的一项功能,使用不同的HTTP方法都能实现,但出于安全考虑,我们要遵循如下基本原则:

(1)GET和HEAD方法应当只用于对服务端没有副作用的操作,即对服务端是“只读”的操作,它们被称为安全的方法。如果该操作对服务端会有副作用,比如增加、删除、更改数据,则应该使用别的 HTTP 方法。考虑到安全性,对于 GET 请求,浏览器在刷新页面时不会要求用户确认,而对于有副作用的 POST 请求,在刷新页面时浏览器会询问用户是否要重新发送,避免在服务端产生多余的操作,比如重复交易、重复下单等。

网安-入门1_第4张图片

HEAD方法与GET方法的行为很类似, 但服务器在响应中只返回首部。不会返回实体的主体部分。这就允许客户端在未获取实际资源的情况下, 对资源的首部进行检查。使用HEAD, 可以: • 在不获取资源的情况下了解资源的情况(比如, 判断其类型) • 通过查看响应中的状态码, 看看某个对象是否存在, • 通过查看首部, 测试资源是否被修改了。 服务器开发者必须确保返回的首部与GET请求所返回的首部完全相同。遵循HTTP/1.1规范, 就必须实现HEAD方法。

网安-入门1_第5张图片

(2)PUT和 DELETE 方法一般用于直接上传和删除文件,大部分 Web 应用不会用到,如果这两种方法被攻击者利用,危害会非常大。因此如无业务需求,应当禁用这些方法。与GET从服务器读取文档相反,PUT方法会向服务器写入文档。有些发布系统允许用户创建Web页面, 并用PUT直接将其安装到Web服务器上去。

网安-入门1_第6张图片

(3)在 Web 应用中,尽量通过 POST 方法提交敏感数据,而不是通过GET 方法提交。POST方法起初是用来向服务器输入数据的。实际上, 通常会用它来支持HTML的表单。表单中填好的数据通常会被送给服务器, 然后由服务器将其发送到它要去的地方(比如, 送到一个服务器网关程序中, 然后由这个程序对其进行处理)。

网安-入门1_第7张图片

(4)在服务端获取请求参数时,应当明确指明是从GET参数还是 POST参数中获取,否则攻击者可将原本设计为用POST方法提交的操作改用GET方法提交,以绕过某些只针对POST请求设计的安全策略(如全局 CSRF 防御方案,我们将在第7 章详细介绍)。例如,在 PHP中尽量不要从$REQUEST中获取请求参数,而是明确指定从$ GET 或者$_POST中获取。

(5)TRACE 方法通常用于诊断调试,服务端直接返回请求中的内容,在 XSS 攻击中可用它绕过 Cookie的HttpOnly 策略,通过 JavaScript代码读取带有 HttpOnly 属性的 Cookie内容生产环境的服务器应当禁用TRACE方法。

客户端发起一个请求时, 这个请求可能要穿过防火墙、代理、网关或其他一些应用程序。每个中间节点都可能会修改原始的HTTP 请求。TRACE方法允许客户端在最终将请求发送给服务器时, 看看它变成了什么样子。TRACE请求会在目的服务器端发起一个“环回” 诊断。行程最后一站的服务器会弹回一条TRACE响应, 并在响应主体中携带它收到的原始请求报文。这样客户端就可以查看在所有中间HTTP应用程序组成的请求响应链上, 原始报文如何被毁坏或修改过。

网安-入门1_第8张图片

TRACE方法主要用于诊断,也就是说, 用于验证请求是否如愿穿过了请求——响应链。它也是一种很好的工具,可以用来查看代理和其他应用程序对用户请求所产生效果。

尽管TRACE可以很方便地用于诊断, 但它确实也有缺点, 它假定中间应用程序对各种不同类型请求( 不同的方法–GET、HEAD、POST等) 的处理是相同的。很多HTTP应用程序会根据方法的不同做出不同的事情一比如, 代理可能会将POST请求直接发送给服务器, 而将GET请求发送给另一个HITP应用程序(比如Web缓存)。TRACE并不提供区分这些方法的机制。通常, 中间应用程序会自行决定对TRACE请求的处理方式。TRACE请求中不能带有实体的主体部分。TRACE响应的实体主体部分包含了响应服务器收到的请求的精确副本。

(6)HEAD方法和GET 方法所消耗的服务端计算资源是一样的,只是服务端对 HEAD请求的响应不会包含正文,所以网络出方向的带宽消耗不一样。在 DDoS 攻击中,攻击者可能使用HEAD方法发起攻击,让服务器的网络出方向带宽不超过告警阙值,对服务器实施应用层的DDoS攻击,耗尽服务器的计算资源。

(7)CONNECT方法用于在客户端和目标地址之间建立一个 TCP 隧道,这个时候 Web 服务器充当代理服务器,只有初始请求用的是 HTTP 协议,后续的所有双向流量都是在 TCP 连接上传输的。所以当 Web 服务器支持 CONNECT方法时,可用于建立从外网穿透到内网的传输隧道。

URI的全称是Uniform Resource Identifier,客户用其标识该HTTP请求要作用到服务器上的资源路径,URI再加上HOST头才是一个完整的互联网路径,即HOST+URI。但是当浏览器使用了正向代理时,这个URI就是完整的目标URL。

现代浏览器发出的HTTP 请求,其 HTTP 版本号主要是 1.1和2,更低的HTTP版本多见于API调用,因为部分应用的底层 HTTP 库还未升级。更高版本的 HTTP/3虽然已经正式发布但目前支持它的网站不多。

HTTP/1.1比HTTP/1.0 多了一些新特性。HTTP/1.1支持持久连接 (Keep-Alive),即允许复用一个TCP 连接完成多个HTTP 请求。HTTP/1.1还支持管线化 (Pipelining),即在一个TCP连接中客户端无须等待前一个请求的响应,就可以发送下一个请求,服务端只需要按照请求的顺序逐一响应即可。这个特性提升了 Web 应用的网络性能,但是在 HTTP Flood攻击中,攻击者利用这个特性能大幅提升攻击效率一一只需要建立少数的 TCP 连接,无须等待服务器响应就能在短时间内连续发送大量HTTP请求。

host头

HTTP/1.1 在请求中新增了 HOST 头用于虚拟主机的场景,即当一个IP 地址上运行了多个网站时,Web 服务器通过 HOST 头中的域名即可判断要访问的目标网站是哪一个。在一些虚拟主机配置错误的服务器上,如果一个 Web 应用使用任意 HOST 头都能正常访问,而且 Web 应用中又没有明确配置网站的域名,而是获取 HOST 头作为网站域名时,那么该应用就可能获取一个错误的域名。当攻击者通过恶意构造的 HOST 头访问时,如果应用内部需要获取网站域名用于关键业务逻辑,比如向该域名的网站发送敏感信息,就会将敏感信息发送给恶意域名。如果HOST 头的域名会出现在缓存页面中(比如 Web 应用中使用了编译型模板,并且其中的某些URL 是通过这个 HOST 头拼接生成的),攻击者使用恶意构造的 HOST 头访问这个网站,可能导致其他用户访问受污染的页面。

user-agent头

HTTP 请求中的 User-Agent 头用来指示当前访问者的客户端类型,它的值是客户端指定的,黑客工具通常会伪装成一个正常浏览器的 User-Agent,所以在 Web 应用中不能基于User-Agent的值来做关键业务逻辑决策。甚至 User-Agent 头中也可能包含恶意内容,例如攻击者可能向其中插入XSS Payload,以便对后端的日志分析平台实现XSS 盲打。

referer头

Referer 头指示了当前请求是从哪个URL页面发起的,在旧版本的Flash 中这个值可以伪造但是在现代浏览器中不能通过 JavaScript 伪造这个头,所以有些安全防御方案会用这个头校验请求来源。在 JavaScript 中可以通过 window.history 对象的 pushState 和 replaceState 方法修改兰前窗口的历史记录,但是仅能够将其修改为与当前URL同源。所以依赖 Referer 中的域名做来源校验还是可靠的,但只能信任其域名,而不能信任 URL 级别的内容。

此外,当网页跳转到其他站点,或者加载其他站点资源时,会将当前 URL 作为 Referer传递给其他站点,所以URL 中一般不要包含敏感信息,以免信息泄露。

浏览器发送的 HTTP头的格式都是很标准的,而攻击者编写的自动化攻击程序通常是手丁构造的 HTTP 头,与标准的 HTTP 头在某些方面可能会有细微差异,如空格、标点符号、头的个数等。通过这些细微差异,我们可识别出异常的访问者并进行处置。另外,使用不同浏览器访问同一个页面时,HTTP 头的个数和顺序也会有差异,甚至同一个浏览器在访问不同类型的资源时,或者在不同的场景中发出的请求,也会有差异 (参见图 2-4)。这些细微的差异被安全产品用于鉴别访问者是不是真实用户。例如请求中的 User-Agent 宣称自己是 Firefox 浏览器而实际的HTTP头不符合 Firefox 浏览器的特征,那么访问者可能篡改了 User-Agent,或者它其实是个自动化程序

网安-入门1_第9张图片

网安-入门1_第10张图片

HTTP响应

HTTP 响应是与请求一一对应的,服务端将请求的操作结果通过 HTTP 响应返回给客户端。

网安-入门1_第11张图片

响应中的版本号不一定要与请求中的版本号一样,但是其大版本号(Major Version)不能高于请求中的大版本号,例如请求是 HTTP/1.0 版本的,服务端响应不能为 HTTP/2 版本,但可以为HTTP/1.1版本。

状态码

状态码用于指示服务器对于该请求的操作结果。在标准定义中,状态码按照区段分为 5大类

状态码 说明
100-199 表示已收到请求,但未完成操作,用于通知客户端
200-299 请求中的操作已成功完成
300-399 告知客户端执行额外的操作,通常用于跳转
400-499 客户端请求有错误
500-599 服务端出错

状态码的不规范使用是非常普遍的现象。在有些网站中,不管是正常响应、页面未找到,还是服务端出错,全部都响应 200 状态码,还有很多API被设计为全部响应 200状态码,然后通过响应正文JSON 中的某个字段,来标识请求是成功还是出错。这些设计相当于把 HTTP协议当作传输层协议来使用,而把 HTTP 协议本身包含的很强的语义信息全部丢掉了。从非安全的角度看,不规范地使用状态码对 SEO 非常不利,搜索引擎并不能理解“页面未找到”等字眼而会将状态码为 200 的页面全部收录进来。

从安全的角度看,在利用访问日志做安全分析时,状态码非常有价值,例如一个访问者在短时间内产生大量的 404 响应,很可能是有攻击者在做网站扫描探测;某个页面有大量的 500 响应,可能意味着程序存在 Bug,甚至是代码存在 SQL注入漏洞,正在被黑客攻击。通过统计和分析 HTTP 响应的状态码,对这类情况就能实现简单的安全监测。

HTTP 的响应头是通过“\r\n”分割的,如果请求中的数据会出现在响应头中,当这些数据未经服务端严格过滤时,可能产生 HTTP 消息头注入(有些文章里也叫 CRLF 注入),即攻击者可以使用“\r\n”注入任意的 HTTP 头。

如果在受害者的响应中注入了 Location 头,可将受害者重定向到指定网站;注入 Set-Cookie 头,可以让受害者使用攻击者指定的 Cookie 值,如实施定会话攻击;在跨域资源共享(CORS)和内容安全策略(CSP)中注入特定的响应头,可以改变浏览器接收到的安全策略,以便攻击者实施其他的攻击行为。所以,如果用户输入的数据会出现在响应头中,需要对其进行严格的校验,或在输出时对回车和换行符进行编码。

Web服务器

Web 服务器通过HTTP/HTTPS 协议向访问者提供服务,它可以是一台服务器或者一个服务器集群。

Web 服务器提供的内容按照其存在的形式可以分为两类:静态资源和动态资源。静态资源是指服务器上已经存在的文件,当客户端访问时,Web 服务器直接将它返回给客户端,比如图片和视频文件,通常这类资源可以缓存。动态资源是指服务端需要经过计算才能生成的内容,比如查询结果,不同的用户或不同的时间获得的结果都不一样,这类资源一般不缓存。

我们平常访问 Web应用并不都是直接访问 Web 服务器的,中间可能经过了HTTP代理,其中可能有客户端指定的正向 HTTP 代理,也有网站使用的CDN、WAF、负载均衡等反向 HTTP代理,在使用不当时可能会带来安全隐患。

正向代理:一位企业老总,他有一位助理小李,当老总想要订火车票时,就会委托小李帮忙订票,当老总想要订酒店时,小李就会负责查找合适的酒店并安排老总入住。助理小李帮老总办了很多事情,也就是代理了一些事情,而助理小李就充当了一个代理服务器的角色。

反向代理:雷池waf

操作系统

操作系统(Operating System,OS)是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充。其主要作用是管理好这些设备,提高它们的利用率和系统的吞吐量,并为用户和应用程序提供一个简单的接口,便于用户使用。OS 是现代计算机系统中最基本和最重要的系统软件,而其它的诸如编译程序、数据库管理系统等系统软件,以及大量的应用软件,都直接依赖于操作系统的支持,取得它所提供的服务。事实上 OS 已成为现代计算机系统、多处理机系统、计算机网络中都必须配置的系统软件。

Vmware workstation

网安-入门1_第12张图片

虚拟机概述

虚拟机是一种在物理计算机上创建并运行多个虚拟计算机的技术。在 Windows 平台上,常用的虚拟机平台包括 VMware Workstations、VMware Player、VirtualBox 和 Hyper-V 等。

网安-入门1_第13张图片

VMware Workstations(寄居架构)

VMware Workstations 是一款收费的虚拟机软件,支持多种操作系统,可以在 Windows 系统上创建多个虚拟计算机,每个虚拟计算机都可以运行不同的操作系统和应用程序。

网安-入门1_第14张图片

vmware sphere(原生架构)

hyper-v(微软)

虚拟机运行架构

1.寄居架构

2.原生架构

你可能感兴趣的:(网安入门,php,web安全,网络)