OWASP TOP 10 – 终极漏洞指南(2021)

OWASP Top 10 是由开放 Web 应用程序安全项目 (OWASP) 建立的,该项目是一个非营利组织,可免费提供有关 Web 应用程序安全的文章和其他信息。

目录

什么是OWASP?

什么是 OWASP 前 10 名?

OWASP 前 10 名名单

1.注入攻击

2. 破解认证

3. 敏感数据暴露

4. XML 外部实体 (XXE)

5. 破坏访问控制

6. 安全配置错误

7. 跨站脚本(XSS)

8. 不安全的反序列化

9.使用已知漏洞的组件

10. 日志记录和监控不足


什么是OWASP?

在 开放Web应用基金会致力于创造一个更安全的网络应用环境。它免费提供文章、工具、技术和论坛,让每个开发人员都能创建安全的代码。其最著名的项目之一是 OWASP Top 10。

OWASP 前 10 名名单

OWASP 前 10 名名单

什么是 OWASP 前 10 名?

OWASP Top 10 是根据开放 Web 应用程序安全项目公开共享的 10 个最关键的 Web 应用程序安全漏洞列表。根据 OWASP,漏洞是应用程序中的一个弱点,它允许恶意方对应用程序的利益相关者(所有者、用户等)造成伤害。 

OWASP Top 10 列表由全球 Web 应用程序安全专家开发并定期更新。它旨在教育公司了解他们需要缓解以保护其 Web 应用程序的漏洞和关键安全风险。

此列表也正在为移动应用程序开发 。

在 Top 10 列表旁边,OWASP 还发布和维护以下资源:

  • OWASP 测试指南:应用程序测试的“最佳实践”
  • OWASP Juice Shop:用于安全培训的故意不安全的 Web 应用程序

 

OWASP 前 10 名名单

1.注入攻击

一个 注入攻击 是指恶意代码的输入攻击者到应用程序迫使其执行命令妥协数据或整个应用程序。最常见的注入攻击类型是 SQL 注入和跨站点脚本 (XSS) 攻击,但也有代码注入、命令注入、CCS 注入等。

SQL 注入 是指利用由于用户输入中缺少元字符屏蔽或验证而导致的 SQL 数据库漏洞。 

攻击者试图通过有权访问数据库的应用程序注入他自己的数据库命令。但是,由于请求未正确验证,插入的代码更改了原始 SQL 命令,因此更改了有利于攻击者的结果。 

攻击成功后,攻击者可以窥探、修改或完全删除数据,并控制服务器。为此,攻击者有不同的方法来破坏系统。例如,可以通过响应时间或错误消息找到进入系统的途径。

如何防止SQL注入攻击?

避免注入缺陷的主要方法是将数据库中的数据与命令和查询分开,即将其与 Web 应用程序逻辑分开。这可以通过几种不同的方式实现,包括:

  • 使用无需使用解释器或使用参数化查询的安全 API 
  • 引入积极的服务器端输入验证(白名单)
  • 如果应用程序中需要特殊字符,则应尽可能通过特定解释器的转义语法避免使用这些字符
  • 在查询中使用数据库控件,例如 LIMIT SQL 子句,以最大限度地减少注入成功时暴露的数据量

2. 破解认证

与身份验证和会话管理相关的应用程序功能  经常被错误地实现,允许攻击者破坏密码、密钥或会话令牌或利用其他实现缺陷来临时或永久地假设用户的身份。 

攻击者可以利用该漏洞劫持用户会话,访问或修改其无权访问的信息。

如何防止损坏的身份验证漏洞?

为避免利用损坏的身份验证进行攻击,OWASP 建议采取以下措施:

  • 引入确定密码弱点或强度的密码检查
  • 将密码长度、复杂性和轮换与强大且现代的基于证据的密码策略保持一致
  • 引入多因素身份验证,阻止使用被盗凭据、暴力攻击、填充等
  • 使用服务器端安全会话管理器生成时间有限的新的随机会话 ID
  • 避免 URL 中的会话 ID,安全地存储它们,并确保它们在用户注销、会话超时和空闲后失效
  • 使用默认凭据时不允许部署 
  • 在监控失败的登录尝试时限制或延迟它们。检测到攻击时向管理员发出警报

3. 敏感数据暴露

敏感数据泄露是最常见的攻击之一。它包括访问、修改或窃取未受保护的静止或传输中的数据(传输的数据)。此类数据通常包括个人身份信息 (PII),例如凭据、健康记录、信用卡号等。缺乏加密是数据最终暴露的原因之一。

获取敏感数据访问权限的方法各不相同,但可能包括攻击者窃取密钥、执行路径攻击(也称为中间人)、从服务器或用户窃取明文数据等。

模糊测试 是一种使用无效、随机或意外数据来产生意外状态或访问隐藏特征的技术。有多种类型的模糊测试:

  • 基于观察数据的模糊测试
  • 在没有先前知识的情况下进行模糊测试

如何防止敏感数据泄露?

您可以采取多种措施来保护任何敏感数据免遭泄露。这些包括:

  • 实施传输层安全性 (TLS) 以保护传输中的数据 
  • 尽可能避免存储敏感数据,或存储时间超过所需时间
  • 加密所有需要存储的静态数据
  • 通过 HTTP 严格传输安全 ( HSTS ) 或类似指令强制加密
  • 不要缓存包含敏感数据的用户响应
  • 对数据进行分类(处理、存储或传输)并根据分类应用控制
  • 实施强大的标准算法、协议和密钥
  • 使用哈希函数,例如 brcrypt、scrypt、Argon2、PBKDF2,这些函数总是对密码进行加盐和哈希处理

4. XML 外部实体 (XXE)

默认情况下,许多旧的或配置不当的 XML 处理器会评估  XML 文档中的外部实体引用。这可以被设法上传 XML 文档(例如 DOCX 或 SVG 文件)或在 XML 文档中包含恶意内容的攻击者利用。

在这种情况下,外部实体可用于使用文件 URI 处理程序提取内部文件。它们还可以启用内部文件共享、内部端口扫描、远程请求执行和拒绝服务攻击 (DOS) 的性能。

如何防止 XML 外部实体攻击?

为了防止这种攻击,开发人员需要接受培训以测试、识别和缓解 XXE。此外,OWASP 建议采取以下措施:

  • 避免对潜在敏感信息进行序列化,并使用不太复杂的数据格式,例如 JSON
  • 白名单服务器端输入验证,以避免通过 XML 文档发送恶意数据
  • 通过 XML 模式验证传入的 XML,即 XSD 验证
  • 确保定期修补或升级 XML 库和处理器
  • 在解析器中完全禁用文档类型定义 (DTD) 处理(这也可以保护解析器免受 DOS 攻击)
  • 手动查看 XXE 实例的源代码

5. 破坏访问控制

损坏的访问控制 是指对经过身份验证的用户的行为实施限制时存在的漏洞。当限制没有得到正确执行时,攻击者可以利用这个弱点来获得对系统功能和敏感个人数据的未经授权的管理访问。他们还可以创建、修改或删除数据。

如何防止访问控制失效?

为了有效地阻止访问控制,它必须在受信任的服务器端代码或无服务器 API 中强制执行。这将防止攻击者修改访问控制检查或元数据。OWASP 列出了以下措施来防止此类攻击:

  • 排除公共资源,默认拒绝
  • 引入访问控制机制并在整个应用程序中重复使用它们
  • 强制记录所有权
  • 记录和监控访问控制失败,如果需要通知管理员(重复登录尝试)
  • 注销后使 JSON Web 令牌 (JWT) 无效
  • 通过域模型强制执行独特的应用程序业务限制要求
  • 确保元数据和备份文件不存在于 Web 根目录中
  • 禁用网络服务器目录列表
  • 执行功能访问控制单元和集成测试

此外,您可能想要:

  • 删除不活动或不必要的帐户
  • 对所有接入点实施多因素身份验证
  • 如果不需要一些接入点,则减少接入点的数量
  • 实施最小权限原则 (PoLP) 
  • 关闭服务器上不需要的服务

6. 安全配置错误

安全配置错误 是打开攻击面的常见问题。这通常是由于: 

  • 不安全的默认配置
  • 不完整或临时配置
  • 未修补的缺陷
  • 未使用的页面
  • 未受保护的文件和目录
  • 开放云存储
  • 错误配置的 HTTP 标头或加密
  • 包含敏感信息的详细错误消息

不仅必须安全地配置所有操作系统、框架、库和应用程序,而且必须及时修补/升级它们。

像 Crashtest Security 这样的自动化渗透测试工具可以帮助检测安全漏洞,这些漏洞可能通过安全配置错误而导致漏洞。注册免费试用并 在几分钟内开始您的第一次扫描。

如何防止安全配置错误攻击?

OWASP 建议实施安全安装过程。除此之外,你应该:

  • 开发和自动化一个流程,该流程允许快速轻松地部署配置相同但可通过不同凭据访问的安全环境
  • 部署最小平台并删除未使用的功能和框架或不安装
  • 引入分离组件和租户的分段应用架构
  • 查看和更新​​所有安全说明、更新和补丁的配置,尤其是云存储权限
  • 在所有环境中自动监控和验证安全配置的有效性
  • 借助自动化工作流程实时解决安全问题

7. 跨站脚本(XSS)

跨站点脚本是将客户端脚本注入到 Web 应用程序中,这是通过不对用户输入进行验证和正确编码来实现的。恶意脚本在最终用户的浏览器中执行并启用各种攻击——从窃取他们的会话到监控和更改受影响网站上的任何操作。 

存在不同类型的跨站点脚本攻击,具体取决于恶意脚本是非持久性注入还是持久性注入。此外,还区分了由客户端或服务器端有缺陷的输入验证引起的漏洞。

如何防止跨站脚本(XSS)?

根据 OWASP 的说法,防止此类攻击的主要方法是将不受信任和未经验证的数据输入与活动浏览器内容分开。这可以通过以下方式完成:

  • 使用 React JS、Ruby on Rails 和其他在很大程度上避免 XSS 设计的框架
  • 避免 HTML 中不受信任的 HTTP 请求数据,除非在 OWASP 备忘单系列“XSS 预防”中定义的允许插槽中
  • 在 HTML 元素中插入任何不受信任的数据之前使用 HTML 编码
  • 对基于 DOM 的 XSS 应用上下文敏感编码
  • 实施内容安全策略 (CSP),为客户端资源创建源允许列表。如果没有允许通过本地文件插入恶意代码的漏洞,这将很有帮助

8. 不安全的反序列化

不安全反序列化 是一种攻击,其中将被操纵的对象注入到 Web 应用程序的上下文中。如果存在应用程序漏洞,则对象被反序列化并执行,从而导致 SQL 注入、路径遍历、应用程序拒绝服务和远程代码执行。

如何防止不安全的反序列化?

为了防止不安全的反序列化,OWASP 建议执行以下步骤:

  • 拒绝来自不受信任来源的序列化对象
  • 仅使用允许原始数据类型的序列化介质
  • 实施数字签名以检查序列化对象的完整性
  • 在反序列化期间强制执行严格的类型约束以检测意外子句 
  • 在可能的情况下,在低权限环境中隔离和运行反序列化代码以防止未经授权的操作
  • 记录反序列化异常和失败的实例
  • 监视和/或限制来自反序列化的服务器或容器的任何传出或传入网络连接

9.使用已知漏洞的组件

库、框架和其他软件模块等组件的权限与应用程序的权限相同。如果利用易受攻击的组件,则可能会丢失数据和服务器接管。使用具有已知漏洞的组件的应用程序和 API 可能会破坏应用程序防御并引发各种攻击和影响。这是一个普遍存在的问题。

为了帮助您评估您使用的组件是否存在已知漏洞,指纹扫描仪会尝试检测任何Web 服务器 或 Web 应用程序 框架以及服务器上运行的相关版本。

如何避免使用已知漏洞的组件?

要修复此类组件的使用,您应该:

  • 仅通过安全链接使用来自官方来源的组件。使用签名的包来最小化包中包含恶意组件的可能性
  • 监控任何未维护且未为旧版本提供安全补丁的库和组件
  • 部署虚拟补丁以监控、检测和防范未打补丁组件的问题
  • 删除所有未使用的依赖项以及不需要的功能、组件、文件和文档
  • 保持客户端和服务器端组件及其版本和依赖项的最新清单。监控组件漏洞的重要来源,并尽可能自动化流程
  • 在应用程序的生命周期内创建并持续执行监视、分类、更新或更改配置

10. 日志记录和监控不足

日志记录和监控不足,再加上与事件响应的集成缺失或无效,使攻击者能够进一步攻击系统,保持持久性,转向更多系统,并篡改、提取或破坏数据。 

大多数违规研究表明检测违规的时间超过 200 天,通常由外部方而不是内部流程或监控检测到。

如何避免因日志和监控不足而导致的攻击?

为了防止由于此问题而出现的常见漏洞,OWASP 建议您:

  • 在登录、访问控制失败和服务器端输入验证失败期间记录足够的用户上下文,并且日志数据保留足够长的时间。这将帮助您发现可疑活动和帐户
  • 使用日志管理解决方案易于处理的日志格式
  • 对所有高价值交易实施具有完整性控制的审计跟踪,以避免删除或篡改企图
  • 使用监控和警报及时发现可疑活动并采取措施
  • 引入事件响应和恢复计划以有效应对攻击

热门文章

暂无图片
编程学习 ·

Java输出数组的内容

Java输出数组的内容_一万个小时-CSDN博客_java打印数组内容1. 输出内容最常见的方式// List<String>类型的列表List<String> list new ArrayList<String>();list.add("First");list.add("Second");list.add("Third");list.ad…
暂无图片
编程学习 ·

母螳螂的“魅惑之术”

在它们对大蝗虫发起进攻的时候&#xff0c;我认认真真地观察了一次&#xff0c;因为它们突然像触电一样浑身痉挛起来&#xff0c;警觉地面对限前这个大家伙&#xff0c;然后放下自己优雅的身段和祈祷的双手&#xff0c;摆出了一个可怕的姿势。我被眼前的一幕吓到了&#xff0c;…
暂无图片
编程学习 ·

疯狂填词 mad_libs 第9章9.9.2

#win7 python3.7.0 import os,reos.chdir(d:\documents\program_language) file1open(.\疯狂填词_d9z9d2_r.txt) file2open(.\疯狂填词_d9z9d2_w.txt,w) words[ADJECTIVE,NOUN,VERB,NOUN] str1file1.read()#方法1 for word in words :word_replaceinput(fEnter a {word} :)str1…
暂无图片
编程学习 ·

HBASE 高可用

为了保证HBASE是高可用的,所依赖的HDFS和zookeeper也要是高可用的. 通过参数hbase.rootdir指定了连接到Hadoop的地址,mycluster表示为Hadoop的集群. HBASE本身的高可用很简单,只要在一个健康的集群其他节点通过命令 hbase-daemon.sh start master启动一个Hmaster进程,这个Hmast…
暂无图片
编程学习 ·

js事件操作语法

一、事件的绑定语法 语法形式1 事件监听 标签对象.addEventListener(click,function(){}); 语法形式2 on语法绑定 标签对象.onclick function(){} on语法是通过 等于赋值绑定的事件处理函数 , 等于赋值本质上执行的是覆盖赋值,后赋值的数据会覆盖之前存储的数据,也就是on…
暂无图片
编程学习 ·

Photoshop插件--晕影动态--选区--脚本开发--PS插件

文章目录1.插件界面2.关键代码2.1 选区2.2 动态晕影3.作者寄语PS是一款栅格图像编辑软件&#xff0c;具有许多强大的功能&#xff0c;本文演示如何通过脚本实现晕影动态和选区相关功能&#xff0c;展示从互联网收集而来的一个小插件&#xff0c;供大家学习交流&#xff0c;请勿…
暂无图片
编程学习 ·

vs LNK1104 无法打开文件“xxx.obj”

写在前面&#xff1a; 向大家推荐两本新书&#xff0c;《深度学习计算机视觉实战》和《学习OpenCV4&#xff1a;基于Python的算法实战》。 《深度学习计算机视觉实战》讲了计算机视觉理论基础&#xff0c;讲了案例项目&#xff0c;讲了模型部署&#xff0c;这些项目学会之后可以…
暂无图片
编程学习 ·

工业元宇宙的定义与实施路线图

工业元宇宙的定义与实施路线图 李正海 1 工业元宇宙 给大家做一个关于工业元宇宙的定义。对于工业&#xff0c;从设计的角度来讲&#xff0c;现在的设计人员已经做到了普遍的三维设计&#xff0c;但是进入元宇宙时代&#xff0c;就不仅仅只是三维设计了&#xff0c;我们的目…
暂无图片
编程学习 ·

【leectode 2022.1.15】完成一半题目

有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目&#xff0c;整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题&#xff0c;请返回被选的 N 道题目至少包含多少种知识点类型。 示例 1&#xff1a…
暂无图片
编程学习 ·

js 面试题总结

一、js原型与原型链 1. prototype 每个函数都有一个prototype属性&#xff0c;被称为显示原型 2._ _proto_ _ 每个实例对象都会有_ _proto_ _属性,其被称为隐式原型 每一个实例对象的隐式原型_ _proto_ _属性指向自身构造函数的显式原型prototype 3. constructor 每个prot…
暂无图片
编程学习 ·

java练习代码

打印自定义行数的空心菱形练习代码如下 import java.util.Scanner; public class daYinLengXing{public static void main(String[] args) {System.out.println("请输入行数");Scanner myScanner new Scanner(System.in);int g myScanner.nextInt();int num g%2;//…
暂无图片
编程学习 ·

RocketMQ-什么是死信队列?怎么解决

目录 什么是死信队列 死信队列的特征 死信消息的处理 什么是死信队列 当一条消息初次消费失败&#xff0c;消息队列会自动进行消费重试&#xff1b;达到最大重试次数后&#xff0c;若消费依然失败&#xff0c;则表明消费者在正常情况下无法正确地消费该消息&#xff0c;此时…
暂无图片
编程学习 ·

项目 cg day04

第4章 lua、Canal实现广告缓存 学习目标 Lua介绍 Lua语法 输出、变量定义、数据类型、流程控制(if..)、循环操作、函数、表(数组)、模块OpenResty介绍(理解配置) 封装了Nginx&#xff0c;并且提供了Lua扩展&#xff0c;大大提升了Nginx对并发处理的能&#xff0c;10K-1000K Lu…
暂无图片
编程学习 ·

输出三角形

#include <stdio.h> int main() { int i,j; for(i0;i<5;i) { for(j0;j<i;j) { printf("*"); } printf("\n"); } }
暂无图片
编程学习 ·

stm32的BOOTLOADER学习1

序言 最近计划学习stm32的BOOTLOADER学习,把学习过程记录下来 因为现在网上STM32C8T6还是比较贵的,根据我的需求flash空间小一些也可以,所以我决定使用stm32c6t6.这个芯片的空间是32kb的。 #熟悉芯片内部的空间地址 1、flash ROM&#xff1a; 大小32KB&#xff0c;范围&#xf…
暂无图片
编程学习 ·

通过awk和shell来限制IP多次访问之学不会你打死我

学不会你打死我 今天我们用shell脚本&#xff0c;awk工具来分析日志来判断是否存在扫描器来进行破解网站密码——限制访问次数过多的IP地址&#xff0c;通过Iptables来进行限制。代码在末尾 首先我们要先查看日志的格式&#xff0c;分析出我们需要筛选的内容&#xff0c;日志…
暂无图片
编程学习 ·

Python - 如何像程序员一样思考

在为计算机编写程序之前&#xff0c;您必须学会如何像程序员一样思考。学习像程序员一样思考对任何学生都很有价值。以下步骤可帮助任何人学习编码并了解计算机科学的价值——即使他们不打算成为计算机科学家。 顾名思义&#xff0c;Python经常被想要学习编程的人用作第一语言…
暂无图片
编程学习 ·

蓝桥杯python-数字三角形

问题描述 虽然我前后用了三种做法&#xff0c;但是我发现只有“优化思路_1”可以通过蓝桥杯官网中的测评&#xff0c;但是如果用c/c的话&#xff0c;每个都通得过&#xff0c;足以可见python的效率之低&#xff08;但耐不住人家好用啊&#xff08;哭笑&#xff09;&#xff09…