当前位置:网站首页>2021 OWASP TOP 10 漏洞指南
2021 OWASP TOP 10 漏洞指南
2022-07-31 14:20:00 【wespten】
一、什么是OWASP?
在 开放Web应用基金会致力于创造一个更安全的网络应用环境。它免费提供文章、工具、技术和论坛,让每个开发人员都能创建安全的代码。其最著名的项目之一是 OWASP Top 10。
OWASP 前 10 名榜单
OWASP项目最具权威的就是其“十大安全漏洞列表”(OWASP Top 10),OWASP Top 10不是官方文档或标准,而只是一个被广泛采用的意识文档,被用来分类网络安全漏洞的严重程度,目前被许多漏洞奖励平台和企业安全团队评估错误报告。这个列表总结了Web应用程序最可能、最常见、最危险的十大漏洞,可以帮助IT公司和开发团队规范应用程序开发流程和测试流程,提高Web产品的安全性。
根据 OWASP,漏洞是应用程序中的一个弱点,它允许恶意方对应用程序的利益相关者(所有者、用户等)造成伤害。 OWASP Top 10 列表由全球 Web 应用程序安全专家开发并4年更新一次。它旨在教育公司了解他们需要缓解以保护其 Web 应用程序的漏洞和关键安全风险。
此列表也正在为移动应用程序开发 。
在 Top 10 列表旁边,OWASP 还发布和维护以下资源:
- OWASP 测试指南:应用程序测试的“最佳实践”
- OWASP Juice Shop:用于安全培训的故意不安全的 Web 应用程序
上一次,该榜单的调整时间是在2017年11月,2021年发布的榜单与以往完全不同,且榜首也易主。
OWASP基金会解释了2017年和2021年漏洞排名的变化∶
(1)A01∶2021-访问控制崩溃(Broken Access Control)∶从原来的排名第5上升至排名第1;94%的所测应用程序中均存在某种形式的访问控制崩溃情况。应用程序中映射到访问控制崩溃的34个CWE漏洞,比其它类别的漏洞更多。
(2)A02∶2021-加密失败(Cryptographic Failure)∶排名上升了2位,升至第2名。此前被称为“敏感数据暴露”,但它只是宽泛的表现而非根本原因。更名后的“加密失败”强调的是和加密相关的失败,通常会导致敏感数据暴露或系统失陷。
(3)A03∶2021-注入∶下滑至第3名,94%的所测应用程序中存在某种形式的注入漏洞,该类型映射33个CWE漏洞,是应用程序中存在的第二大漏洞。在新版本中,跨站点脚本(XSS)成为注入类型的组成部分。
(4)A04∶2021-不安全的设计,是2021年版本的新增类型,关注的是和设计缺陷相关的风险。如果行业真正想要“左移”,那么就需要更多地使用威胁建模、安全的设计模式和原则、以及引用架构。
(5)A05∶2021-安全配置不当,从第6名上升至当前的第5名;90%的所测应用程序中存在某种形式的配置不当问题。随着向高度可配置软件的转变,该类漏洞的排名上升也属正常。此前的“XML外部实体(XEE)”漏洞类型现在属于该类型的组成部分。
(6)A06∶2021-易受攻击和过时的组件,此前该类型名为“使用含有已知漏洞的组件”,不仅在行业调查中排名第2,而且数据分析表明有足够数据在Top 10中占据一席之地。该类型在2017年时排名第9,是我们竭力测试并评估风险的已知问题。这是唯一一个不存在可映射到已有CWE的CVE漏洞的类型,因此分数中的默认利用和影响权重为5.0。
(7)A07∶2021-识别和认证失败,该类型此前名为“认证崩溃”且原先排名为第2名,当前包括和识别失败更具有相关性的CWE。该类别仍然是Top 10榜单的组成部分,不过标准化框架的可用性不断增强,似乎起到更大的作用。
(8)A07∶2021-软件和数据完整性失败是2021年的新增类型,专注于和软件更新、关键数据和 CI/CD 管道相关的假设设置且不设计完整性验证。在这个类型中,从CVE/CVSS数据映射到10个CWE的权重最高的影响之一。2017年的“不安全的反序列化”类型如今成为更大类型的组成部分。
(9)A08∶2021-安全日志记录和监控失败,此前名为“日志记录和监控不充分”,在行业调查中名列第3,原先名列第10。该类型涵盖的失败类型增多,测试难度增强,也并未在CVE/CVSS 数据中得到很好的表示。然而,这种失败类型可直接影响可见性、时间警报和取证。
(10)A10∶2021-服务器端请求伪造为新增,在行业调查中排名第1。它的测试覆盖率的事件比率高于平均水平,“利用”和“影响”的可能性比率也高于平均水平。该类型代表的是这样一种场景∶行业专业人士一直在指出该类型的重要性,即使目前并未得到数据证实。
二、历年榜单
2021年的榜单是继2007年以来,“注入”漏洞类型第一次未列榜首。原因在于web应用程序变得愈加复杂,而且它们经常是API的合集,当结合配置选项时,可引发配置不当、终端不受保护或交互无法预知的情况。
三、安全漏洞种类
1. 注入
(1)注入的概念
注入通常是指:将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。
(2)注入的分类
通常注入有sql注入和os(Operating System)注入
SQL注入:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
SQL注入的防御:
- 使用无需使用解释器或使用参数化查询的安全 API,避免使用解释器
- 如果应用程序中需要特殊字符,则应尽可能通过特定解释器的转义语法避免使用这些字符,例如LIKE '%M%' ESCAPE ‘M’,使用ESCAPE关键字定义了转义字符“M”,告诉DBMS将搜索字符串“%M%”中的第二个百分符(%)作为实际值,而不是通配符
- 在查询中使用数据库控件,例如 LIMIT SQL 子句,以最大限度地减少注入成功时暴露的数据量
- 使用白名单来规范化的输入验证方法
os注入:Web开发所使用的编程语言中,大多数都能通过Shell执行OS(操作系统)命令。通过Shell执行OS命令时,或者开发中用到的某个方法其内部利用了Shell时,就有可能出现OS命令被任意执行的情况。这种现象被称为OS命令注入。
os注入的防御:
- 引入积极的服务器端输入验证(白名单)
- 使用安全的函数对传递给OS命令参数进行转义
- 选择不调用OS命令的实现方法
不调用利用shell的功能,既能杜绝了OS命令注入漏 洞混入的可能性,又消除了调用OS命令的而系统开销,能够从多方面提高应用的性能。
2. 敏感数据泄露
(1)介绍
近年来,敏感数据泄露已经成为了一最常见、最具影响力的攻击,一般我们的敏感信息包括密码、财务数据、医疗数据等,由于web应用或者API未加密或不正确的保护敏感数据,这些数据极易遭到攻击者利用,攻击者可能使用这些数据来进行一些犯罪行为,因此,未加密的信息极易遭到破坏和利用,不久前就爆出过Facebook泄露了用户的大量信息,以及12306也多次泄露用户的信息。现在信息泄露已经成为了owasp top 10中排名前三的漏洞之一,可想而知敏感信息泄露现在已经成为十分严重的问题。
(2)防御
- 实施传输层安全性 (TLS) 以保护传输中的数据
- 尽可能避免存储敏感数据,或存储时间超过所需时间
- 对重要数据进行加密存放,数据在传输过程中使用密文进行传输
- 通过 HTTP 严格传输安全 ( HSTS ) 或类似指令强制加密
- 及时清理没有用的敏感数据缓存,只能使用指定用户访问敏感数据
- 对系统处理、存储或传输的数据分类,并根据分类进行访问控制
- 实施强大的标准算法、协议和密钥
- 使用哈希函数,例如 brcrypt、scrypt、Argon2、PBKDF2,这些函数总是对密码进行加盐和哈希处理
3. 失效的身份认证
(1)介绍
通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者暂时或永久的冒充其他用户的身份。
身份认证:身份认证最常用于系统登录,形式一般为用户名加密码的登录方式,在安全性要求较高的情况下,还有验证码、客户端证书、Ukey等。
会话管理:HTTP利用会话机制来实现身份认证,HTTP身份认证的结果往往是获得一个令牌并放在cookie中,之后的身份识别只需读取授权令牌,如果授权令牌认证成功,那么就无需再次进行登录认证。
(2)防御
防御失效身份和会话管理的方法:
- 使用内置的会话管理功能
- 通过认证的问候
- 使用单一的入口点
- 要求用户使用强密码
- 不要在网络上以纯文本方式传输用户名和密码,使用SSL对数据流进行加密,也可以对cookie进行加密
- 区分公共区域和受限区域:站点的公共区域允许匿名用户访问,但是站点的受限区域只允许指定用户访问
- 支持密码的有效期,向用户提供可以在一段时间后修改密码的功能
- 能够禁用账户,在收到攻击后可以禁用账户来避免遭受进一步的损失
4. 跨站脚本(xss)
(1)介绍
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表CSS(Cascading Style Sheets)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!
(2)分类
XSS分为三类:反射型XSS、存储型XSS、DOM型XSS
(3)原理
存储型XSS:存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie。
反射型XSS:非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
DOM型XSS:不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,攻击者向服务器发送一个带有恶意JS代码的请求,服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。
(4)防御
- 使用 React JS、Ruby on Rails 和其他在很大程度上避免 XSS 设计的框架
- 避免 HTML 中不受信任的 HTTP 请求数据,除非在 OWASP 备忘单系列“XSS 预防”中定义的允许插槽中
- 在 HTML 元素中插入任何不受信任的数据之前使用 HTML 编码,确保输入的字符被视为数据,而不是作为html被浏览器所解析
- 对基于 DOM 的 XSS 应用上下文敏感编码
- 实施内容安全策略 (CSP),为客户端资源创建源允许列表。如果没有允许通过本地文件插入恶意代码的漏洞,这将很有帮助
- 存储型:后台编写过滤器,对一些html标签和特殊的字符进行转义
- 反射型:特殊字符的转义
- DOM型:检查是否包含一些特殊的函数可以造成危害的地方
- 对于截取cookie的XSS的防御可以在cookie上添加HttpOnly
5. 外部实体(XXE)
(1)介绍
XXE(XML External Entity Injection)外部实体注入漏洞,XML在引用外部实体是的时候,攻击者可以构造恶意的XML代码,以造成任意文件读取、命令执行甚至是中断服务器。
XML用于标识电子文件使其具有结构性的标识语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声名、DTD文档类型定义、文档元素。
(2)防御
- 避免对潜在敏感信息进行序列化,并使用不太复杂的数据格式,例如 JSON
- 白名单服务器端输入验证,以避免通过 XML 文档发送恶意数据
- 通过 XML 模式验证传入的 XML,即 XSD 验证
- 确保定期修补或升级 XML 库和处理器
- 在解析器中完全禁用文档类型定义 (DTD) 处理(这也可以保护解析器免受 DOS 攻击)
- 手动查看 XXE 实例的源代码
- 使用开发语言提供的禁用外部实体的方法
- 过滤用户提交的XML数据
6. 安全配置错误
(1)介绍
安全配置错误是比较常见的漏洞,由于操作者的不当配置(默认配置,临时配置,开源云存储,http标头配置,以及包含敏感信息的详细错误),导致攻击者可以利用这些配置获取到更高的权限,安全配置错误可以发生在各个层面,包含平台、web服务器、应用服务器、数据库、架构和代码。
(2)防御
- 不安全的默认配置
- 不完整或临时配置
- 实施漏洞扫描和安全审计
- 及时检测系统服务版本,为已发现的漏洞打补丁
- 未使用的页面
- 在对文件等分配权限时,根据其工作需要采取最小权限原则的方法
- 未受保护的文件和目录
- 开放云存储
- 错误配置的 HTTP 标头或加密
- 包含敏感信息的详细错误消息
- 自动化安装部署,在所有环境中自动监控和验证安全配置的有效性,实时解决安全问题
- 使用的服务不包含任何不必要的功能、组件、文档和示例,移除或不安装不适用的功能和框架
7. 失效的访问控制
(1)介绍
访问控制:即保护资源不被非法访问和使用,目前应用最多的是基于角色的访问控制机制。失效的访问控制就是攻击者通过各种手段提升自己的权限,越过访问控制,使访问控制失效,这样攻击者就可以冒充用户、管理员或拥有特权的用户,或者创建、访问、更新或删除任何记录。
(2)防御
- 除公有资源外,其他资源默认情况下拒绝访问
- 引入访问控制机制并在整个应用程序中重复使用它们
- 使用一次性的访问控制机制,并在整个应用程序中不断重用它们
- 强制记录所有权
- 记录和监控访问控制失败,如果需要通知管理员(重复登录尝试)
- 当用户注销后,服务器上的 JSON Web 令牌(JWT)应失效
- 通过域模型强制执行独特的应用程序业务限制要求
- 确保元数据和备份文件不存在于 Web 根目录中
- 禁用网络服务器目录列表
- 执行功能访问控制单元和集成测试
- 删除不活动或不必要的帐户
- 对所有接入点实施多因素身份验证
- 如果不需要一些接入点,则减少接入点的数量
- 实施最小权限原则 (PoLP)
- 关闭服务器上不需要的服务
- 建立访问控制模型以强制执行所有权记录,而不是接受用户创建、读取、更新或删除的任何记录。
8. 不安全的反序列化
(1)介绍
序列化:序列化 (Serialization)是将对象的状态信息转换为可以存储或传输(一般是以二进制的形式保存)的形式的过程。
反序列化: 与序列化的过程刚好相反。
(2)原理
序列化即是把对象转变为字节流,存放在内存、文件数据库中,而反序列化即是把字节流转变为对象。在java中有一个 ObjectOutputStream 类的writeobject方法可以实现序列化,而 ObjectInputStream 类的Readobject方法可以实现反序列化。该漏洞的原因出自于如果应用对恶意构造的用户输入的数据进行反序列化,这样就会产生非预期的对象,从而有可能产生远程代码执行。或者应用中存在可以在反序列化过程中或者之后被改变行为的类,则攻击者可以通过改变应用逻辑或者实现远程代码执行攻击。我们将其称为对象和数据结构攻击。
(3)防御
- 最安全的方法是不接受来自不受信源的序列化对象,或使用只允许原始数据类型的序列化媒体
- 仅使用允许原始数据类型的序列化介质
- 反序列化之前,先进行严格的数据类型校验。由于校验规则容易被攻击者探索出来,进而容易被绕过,因此防御不能仅依赖这一个手段,但可以作为完整性校验防御方案的补充
- 实施数字签名以检查序列化对象的完整性
- 在反序列化期间强制执行严格的类型约束以检测意外子句
- 在可能的情况下,在低权限环境中隔离和运行反序列化代码以防止未经授权的操作
- 记录反序列化异常和失败的实例
- 监视和/或限制来自反序列化的服务器或容器的任何传出或传入网络连接
- 隔离运行那些在低特权环境中反序列化的代码
- 对反序列化过程进行详尽的日志记录,监控反序列化过程,在发现疑似反序列化攻击时进行警报
9. 不安全的对象直接引用
(1)介绍
意指一个已经授权的用户通过更改访问时的一个参数,从而访问到原本其并没有得到授权的对象,这种漏洞可以损坏参数所引用的所有数据。
(2)防御
- 使用基于用户或会话的间接对象访问,这样可防止攻击者直接攻击为授权资源
- 访问检查:对任何来自不受信源所使用的所有对象进行访问控制检查
- 避免在url或网页中直接引用内部文件名或数据库关键字
- 验证用户输入和url请求,拒绝包含./ ../的请求
10. 使用含有已知漏洞的组件
(1)介绍
由于现在的服务器都需要使用很多的组件,组件(例如:库、框架和其他软件模块)运行和应用程序相同的权限。如果使用含有已知漏洞的组件,这样的攻击可以造成严重的数据丢失或服务器接管。使用含有已知漏洞的组件的应用程序和API,可能会破坏应用程序防御、造成各种攻击并产生严重影响。
(2)防御
- 仅通过安全链接使用来自官方来源的组件。使用签名的包来最小化包中包含恶意组件的可能性
- 监控任何未维护且未为旧版本提供安全补丁的库和组件
- 识别正在使用的组件和版本,包括所有的依赖
- 更新组件或引用的库文件到最新
- 部署虚拟补丁以监控、检测和防范未打补丁组件的问题
- 删除所有未使用的依赖项以及不需要的功能、组件、文件和文档
- 保持客户端和服务器端组件及其版本和依赖项的最新清单。监控组件漏洞的重要来源,并尽可能自动化流程
- 在应用程序的生命周期内创建并持续执行监视、分类、更新或更改配置
- 建立安全策略来管理组件的使用
11. 不足的日志记录和监控
(1)介绍
不足的日志记录和监控,以及事件响应集成的丢失或无效,使得攻击者能够进一步攻击系统、保持持续性或转向更多系统,以及篡改、提取或销毁数据。大多数缺陷研究显示,缺陷被检测出的时间超过200天,并且通常通过外部检测方检测,而不是通过内部进程或监控检测。
日志记录:日志记录是一个系统的最重要的功能之一。日志记录包括登录成功记录、登录失败记录、访问控制记录等,用来记录服务器的各种信息。
(2)防御
- 在登录、访问控制失败和服务器端输入验证失败期间记录足够的用户上下文,并且日志数据保留足够长的时间。这将帮助您发现可疑活动和帐户
- 使用日志管理解决方案易于处理的日志格式
- 建立有效的监控和告警机制,使可疑活动在可接受的时间内被发现和应对
- 对所有高价值交易实施具有完整性控制的审计跟踪,以避免删除或篡改企图
- 使用监控和警报及时发现可疑活动并采取措施
- 引入事件响应和恢复计划以有效应对攻击
- 及时对日志系统进行备份,并保存足够长时间
12. 破解认证
(1)介绍
与身份验证和会话管理相关的应用程序功能 经常被错误地实现,允许攻击者破坏密码、密钥或会话令牌或利用其他实现缺陷来临时或永久地假设用户的身份。
攻击者可以利用该漏洞劫持用户会话,访问或修改其无权访问的信息。
(2)防御
为避免利用损坏的身份验证进行攻击,OWASP 建议采取以下措施:
- 引入确定密码弱点或强度的密码检查
- 将密码长度、复杂性和轮换与强大且现代的基于证据的密码策略保持一致
- 引入多因素身份验证,阻止使用被盗凭据、暴力攻击、填充等
- 使用服务器端安全会话管理器生成时间有限的新的随机会话 ID
- 避免 URL 中的会话 ID,安全地存储它们,并确保它们在用户注销、会话超时和空闲后失效
- 使用默认凭据时不允许部署
- 在监控失败的登录尝试时限制或延迟它们。检测到攻击时向管理员发出警报
13. 伪造跨站请求(CSRF)
(1)介绍
跨站请求伪造,利用了网站允许攻击者预测特定操作所有细节这一特点。由于浏览器自动发送会话cookie等认证凭证,导致攻击者可以创建恶意的web页面来产生伪造请求。这些伪造的请求很难和合法的请求区分开。
攻击者可以让受害者用户修改任何允许修改的数据,执行任何用户允许的操作,例如修改密码,登录注销等。
(2)防御
- 给每个HTTP请求添加一个不可预测的令牌,并保证该令牌对每个用户会话来说是唯一的。最好的办法就是将独有的令牌包含在隐藏字段中,通过HTTP请求发送,避免在URL中暴露出来
- 要求用户重新认证或判断他们是一个真实德用户
14. 限制URL访问失败(缺少功能级访问控制)
(1)介绍
这个漏洞也是与认证相关的,这种漏洞具体是指在系统已经对url的访问做了限制的情况下,但这种限制并没有生效。常见的例子是系统没有对用户进行角色的检查,以及用户通过修改URL的action并指向未被授权页面就能访问该页面同样是个漏洞。
攻击者很容易就能把网址改成享有特权的网页,这样就可以使用匿名或普通用户访问未授保护的私人页面,从而提升未授权功能和相关数据信息。
(2)防御
- 检查管理权限的过程并确保能够容易进行升级和审计
- 默认缺省情况下,应该拒绝所有访问的执行权限。对于每个功能得访问,需要明确的角色授权
- 检查每个功能分配的权限合理有效
15. 未验证的重定向和转发
(1)介绍
在Web应用中重定向是极为普通的,并且通常重定向所引发的目的是带有用户输入参数的目的url,而如果这些重定向未被验证,那么攻击者就可以引导用户访问他们想要用户访问的站点
同样,转发也是极为普遍的,本质上转发是在同一个应用中对一个新页面发送请求,并且有时是用参数来定义目标页面的。同样,如果参数未被验证,那么攻击者就可以利用其来绕过认证或是授权检查。
攻击者通过重定向可以试图安装恶意软件或诱使受害人泄露密码等铭感信息,通过转发可以绕过访问限制。
(2)防御
- 避免使用重定向和转发
- 如果使用了,不要在确定目标时涉及到用户参数
- 如果无法避免使用用户参数,则应确保目标参数值对于当前用户是有效的并已授权。如果是需要登录的,可以从session当中获取登录信息,然后判断
边栏推荐
- ML, DL, CV common problems sorting
- Redis与分布式:集群搭建
- 【redis】发布和订阅消息
- 五个维度着手MySQL的优化
- Linux bash: redis-server: command not found
- 20.nn.Module
- endnote引用
- MySQL has played to such a degree, no wonder the big manufacturers are rushing to ask for it!
- Why do we need to sub-library and sub-table?
- UnityShader入门学习(三)——Unity的Shader
猜你喜欢
MySQL has played to such a degree, no wonder the big manufacturers are rushing to ask for it!
"Listen to me, thank you" can be said in ancient poetry?Tsinghua University has developed an artifact of "Searching Sentences According to Meaning", which can search for the famous sayings you want wi
以后面试官问你 为啥不建议使用Select *,请你大声回答他!
LeetCode·304竞赛·6132·使数组中所有元素都等于零·模拟·哈希
I summed up the bad MySQL interview questions
Nuget package and upload tutorial
DELL SC compellent 康贝存储系统怎么抓取配置信息
Sentinel热点参数限流
jvm 一之 类加载器
AWS实现定时任务-Lambda+EventBridge
随机推荐
The pre-sale of the new Hyundai Paristi is open, and safety and comfort are not lost
Resolved (pymysqL connect to the database error) pymysqL. Err. ProgrammingError: (1146, "Table" test. Students' doesn 't exist ")
技能大赛训练题:登录安全加固
八大排序汇总及其稳定性
我把问烂了的MySQL面试题总结了一下
Shell项目实战1.系统性能分析
Node version switching management using NVM
For enterprises in the digital age, data governance is difficult, but it should be done
Combination series - there are combinations when there are arrangements
20.nn.Module
Spark学习(3)-Spark环境搭建-Standalone
五个维度着手MySQL的优化
I summed up the bad MySQL interview questions
MySQL 23道经典面试吊打面试官
C# using ComboBox control
Numbers that appear only once in LeetCode
自制的数据库安全攻防题,相关靶机自己制作
代码随想录笔记_哈希_454四数相加II
【Pytorch】torch.argmax()用法
leetcode:485.最大连续 1 的个数