OWASP top10漏洞原理及防御(2017版官方)_owasp top 10 2017-程序员宅基地

技术标签: 安全漏洞  网络与安全  网络安全  


本文转载出处在文末表明,同时附上网上OWASP TOP 10的官方电子书 pdf 地址
OWASP Top 10 - 2017

一、OWASP top 10简介

1.OWASP介绍
OWASP:开放式Web应用程序安全项目(Open Web Application Security Project),OWASP是一家国际性组织机构,并且是一个开放的、非盈利组织,它致力于协助政府、企业开发、升级各类应用程序以保证其可信任性。所有OWASP的工具、文档、研讨以及所有分会都对任何就应用安全领域感兴趣的人士自由开放。
不过OWASP每四年发布一次,现在最新的OWASP是2017年的,在2021年会更新最新的OWASP top 10。

2.2017版的OWASP top 10
在这里插入图片描述

二、OWASP top 10详解

A1:2017-注入

1.注入攻击概念
注入攻击是指攻击者在输入数据时向解释器提交一些非法或者未授权的命令来欺骗解释权,使解释器错误的执行了这些代码,向攻击者返回一些本不应该被看见的数据。

2.常见注入分类
最常见的注入有SQL注入和命令执行。

  • SQL注入

(1):SQL注入介绍
SQL注入就是指Web应用程序对用户输入的数据的合法性没有进行判断,前端传入后端的参数使攻击者可控的,并且参数中带有数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作。

(2):SQL注入原理
SQL注入漏洞产生需要以下两个条件:

  • 参数是用户可控的:前端传给后端的参数内容是用户可以控制的
  • 参数带入数据库查询:传入的参数可以带入数据库中查询

如果满足以上两个条件,那么攻击者就可以在前端页面中通过SQL语句拼接,将自己想要查询的SQL语句拼接到合法参数后面,这样就就可以通过构造非法的SQL语句来对数据库进行增删改查等操作。

(3):SQL注入的防御方法

  • ①:过滤危险字符:现在很多CMS都采用过滤危险字符的方法,比如使用正则表达式匹配union、sleep、select等关键字,如果匹配到,那么就退出程序。(也可以使用PHP中mysql_real_escape_string()函数过滤一些特殊字符)
  • ②:采用PDO预编译技术:
    在使用PDO技术访问数据库时,真正的real prepared statements默认是不使用的,因此使用"setAttribute(PDO::ATTR_EMULATE_PREPARES, false);"这一句来禁掉模拟预处理语句,使用真正的预编译。
    在这里插入图片描述

为什么预编译可以防止SQL注入?
使用如上代码进行分析,当调用prepare()函数时,查询语句"select * from test where name = ? and password = ?“已经发送给了数据库,此时只有占位符”?"发送过去,并没有发送用户提交的数据;当调用到execute()函数时,用户提交的值才会传送给数据库,他们是分开传送的,两者是独立的。因此后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的语法结构了,因为语法分析已经完成了,那么后面输入的参数,就绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数来处理。
PDO不能防御以下三种SQL注入:

  • 你不能让占位符?代替一组值:select * from users where user_id IN (?);
  • 你不能让占位符?代替数据库表名和列名:select * from users order by ?;
  • 你不能让占位符?代替任何其他SQL语句:select extract ( ? from datetime_column) as variable_datetime_element from users;
  • OS注入

(1):OS注入介绍
OS指令执行是为了通过网络接口在web服务器执行OS命令的一种技术。如果应用程序使用外部输入的字符串或受外部影响的字符串组装命令,并且没有经过正确的过滤,就可能导致OS命令的注入攻击。

(2):OS注入原理
OS注入的原理就是程序开发者对输入的数据没有进行任何过滤,攻击者在前端可以在正确输入的命令后面拼接自己想要执行的命令。如果没有对&、&&、|、||等拼接字符进行过滤,那么就会造成命令注入,这样攻击者就可以使用拼接的命令来查看各种信息,甚至执行反弹shell拿到shell。

(3):OS注入的防御方法
①:过滤&、&&、|、||等字符,最好使用白名单过滤方法
②:不止在前端进行验证,还可以在服务器端再进行一次验证
③:要用最小权限去运行程序,不要给予程序多余的权限
④:在命令执行错误时不要显示过多的细节,这样攻击者就不能通过错误提示得到更多的信息

A2:2017-失效的身份认证

1.身份认证和会话管理的定义
身份认证:身份认证最常用于系统登录,形式一般为用户名加密码的登录方式,在安全性要求较高的情况下,还有验证码、客户端证书、Ukey等。
会话管理:HTTP利用会话机制来实现身份认证,HTTP身份认证的结果往往是获得一个令牌并放在cookie中,之后的身份识别只需读取授权令牌,如果授权令牌认证成功,那么就无需再次进行登录认证。

2.什么是失效的身份认证和会话管理
用户身份认证和会话管理是一个应用程序中最关键的过程,有缺陷的设计会严重破坏这个过程。在开发Web应用程序时,开发人员往往只关注Web应用程序所需的功能。由于这个原因,开发人员通常会建立自定义的认证和会话管理方案。但要正确实现这些方案却很难,结果这些自定义的方案往往在如下方面存在漏洞:退出、密码管理、超时、记住我、秘密问题、帐户更新等等。因此攻击者就可以通过破坏密码、密钥、会话令牌或攻击其他的漏洞去冒充其他用户的身份,这种身份的冒充可能是暂时的,也可能是永久的。

3.存在失效身份认证和会话管理的漏洞例子
(1):用户更改密码之前不验证用户,而是依靠会话的IP地址
(2):没有会话超时限制
(3):用户忘记密码后,密码找回功能太过简单。

4.防御失效身份和会话管理的方法
(1):区分公共区域和受限区域:站点的公共区域允许匿名用户访问,但是站点的受限区域只允许指定用户访问
(2):支持密码的有效期:向用户提供可以在一段时间后修改密码的功能
(3):能够禁用账户:在收到攻击后可以禁用账户来避免遭受进一步的损失
(4):要求用户使用强密码
(5):不要在网络上以纯文本方式传输用户名和密码:使用SSL对数据流进行加密,也可以对cookie进行加密

A3:2017-敏感数据泄露

1.敏感数据泄露介绍
近年来,敏感数据泄露已经成为了一最常见、最具影响力的攻击,不久前就爆出过Facebook泄露了用户的大量信息,以及12306也多次泄露用户的信息。现在信息泄露已经成为了owasp top 10中排名第三的漏洞,可想而知敏感信息泄露现在已经成为十分严重的问题。

2.敏感信息泄露原理
攻击者不是直接攻击密码,而是在传输过程中或从客户端窃取密钥、发起中间人攻击,或从服务器端窃取明文数据,还有可能由于管理员的安全性不高,使用弱密码,被攻击者暴力破解,进入到数据库拿到敏感信息。

3.防御敏感信息泄露的方法
(1):对系统处理、存储或传输的数据分类,并根据分类进行访问控制
(2):对重要数据进行加密存放,数据在传输过程中使用密文进行传输
(3):及时清理没有用的敏感数据,只能使用指定用户访问敏感数据

A4:2017-XML外部实体(XXE)

1.XXE介绍
XXE(XML External Entity)指的是XML外部实体注入,XML用于标识电子文件使其具有结构性的标识语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声名、DTD文档类型定义、文档元素。

2.XXE攻击原理
如果攻击者可以上传XML文档或者在XML文档中添加恶意内容,通过易受攻击的代码、依赖项或集成,他们就能够攻击含有缺陷的XML处理器。XXE缺陷可用于提取数据、执行远程服务器请求、扫描内部系统、执行拒绝服务攻击和其他攻击。

3.防御XXE的方法
(1):尽可能使用简单的数据格式(如:JSON),避免对敏感数据进行序列化
(2):禁止使用外部实体,例如libxml_disable_entity_loader(true)
(3):过滤用户提交的XML数据,防止出现非法内容

A5:2017-失效的访问控制

1.什么是失效的访问控制
访问控制:即保护资源不被非法访问和使用,目前应用最多的是基于角色的访问控制机制。失效的访问控制就是攻击者通过各种手段提升自己的权限,越过访问控制,使访问控制失效,这样攻击者就可以冒充用户、管理员或拥有特权的用户,或者创建、访问、更新或删除任何记录。

2.失效的访问控制攻击原理
(1):攻击者通过修改 URL、内部应用程序状态或 HTML 页面绕过访问控制检查,或简单地使用自定义的 API 攻击工具
(2):特权提升:在不登录的情况下假扮用户,或以用户身份登录时充当管理员
(3):元数据操作:如重放或篡改 JWT 访问控制令牌,以此来修改cookie提升权限

3.防御失效的访问控制的方法
(1):除公有资源外,其他资源默认情况下拒绝访问
(2):使用一次性的访问控制机制,并在整个应用程序中不断重用它们
(3):建立访问控制模型以强制执行所有权记录,而不是接受用户创建、读取、更新或删除的任何记录
(4):当用户注销后,服务器上的JWT令牌应失效

A6:2017-安全配置错误

1.安全配置介绍
由于系统管理员的疏忽,可能会产生一些安全配置错误。安全配置错误可以发生在一个应用程序堆栈的任何层面,包括网络服务、平台、Web服务器、应用服务器、数据库、框架、自定义代码和预安装的虚拟机、容器和存储。可以使用自动扫描器来检测错误的安全配置、默认帐户的使用或配置、不必要的服务、遗留选项等。

2.安全配置错误攻击原理
攻击者能够通过未修复的漏洞、访问默认账户、不再使用的页面、未受保护的文件和目录、开放的不必要的端口等来取得对系统的未授权的访问,比如如果由于管理员的疏忽,/etc/passwd文件具有777的访问权限,这样攻击者就可以在拿到普通用户的身份后通过修改该文件拿到root权限。

3.防御安全配置错误的方法
(1):使用的服务不包含任何不必要的功能、组件、文档和示例。移除或不安装不适用的功能和框架
(2):及时检测系统服务版本,为已发现的漏洞打补丁
(3):在对文件等分配权限时,根据其工作需要采取最小权限原则的方法

A7:2017-跨站脚本(XSS)

1.XSS介绍
XSS(Cross-Site Scripting,实际上应该是CSS,但是这与前端中的CSS重名,因此改名为XSS)简称为跨站脚本攻击,这是一种针对网站的应用程序的安全漏洞攻击技术,是代码注入的一种。它允许用户将恶意代码注入网页,其他用户在访问时就会收到影响。恶意用户利用XSS代码攻击成功后,可以进行重定向、获取cookie值等内容。

2.XSS分类
XSS分为三类:反射型XSS、存储型XSS、DOM型XSS

3.XSS原理
(1):反射型XSS原理
反射型XSS又称为非持久型XSS,这种攻击方式往往具有一次性。
攻击原理:攻击者向服务器一个带有恶意JS代码的请求,服务器会向攻击者返回一个带有JS脚本的页面,攻击者将带有恶意JS脚本的页面发送给目标用户,用户点击后就会触发XSS漏洞,从而被盗取cookie值或者被重定向到第三方网站。
(2):存储型XSS
存储型XSS又称为持久性XSS,攻击脚本将被永久地存放到目标服务器的数据库或者文件中,具有很高的隐蔽性。
攻击原理:攻击者向服务器一个带有恶意JS代码的请求,服务器会先在服务器上存储一份,然后会向攻击者返回一个带有JS脚本的页面。此时,当其他用户登录这个网站时,都会被盗取cookie值或者被重定向到第三方网站。
(3):DOM型XSS
DOM全称Document Object Model,DOM型XSS实际上是一种特殊类型的反射型XSS,它是一种基于DOM文档对象模型的一种漏洞
攻击原理:攻击者向服务器一个带有恶意JS代码的请求,服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。

4.防御XSS的方法
(1):对于截取cookie的XSS的防御可以在cookie上添加HttpOnly
(2):过滤输入的数据,过滤"

A8:2017-不安全的反序列化

1.什么是序列化
有些时候我们需要把应用程序中的数据以另一种形式进行表达,以便于将数据存储起来,并在未来某个时间点再次使用,或者便于通过网络传输给接收方。这一过程我们把它叫做序列化。

2.什么是反序列化
反序列化和序列化是两个正好相反的过程。当我们要再次使用这些数据的时候,应用程序读取序列化之后的数据,并将其恢复成应用程序中的数据。

3.反序列化有什么安全问题
尽管反序列化最严重可导致远程代码执行(RCE,Remote Code Execution),但最常见的反序列化安全问题却是通过修改序列化之后的数据字段,从而进行提权或越权操作。

4.反序列化攻击原理
序列化即是把对象转变为字节流,存放在内存、文件数据库中,而反序列化即是把字节流转变为对象。在java中有一个ObjectOutputStream类的writeobject方法可以实现序列化,而ObjectInputStream类的Readobject方法可以实现反序列化。该漏洞的原因出自于如果应用对恶意构造的用户输入的数据进行反序列化,这样就会产生非预期的对象,从而有可能产生远程代码执行。或者应用中存在可以在反序列化过程中或者之后被改变行为的类,则攻击者可以通过改变应用逻辑或者实现远程代码执行攻击。我们将其称为对象和数据结构攻击。

5.防御反序列化的方法
(1):最安全的方法是不接受来自不受信源的序列化对象,或使用只允许原始数据类型的序列化媒体
(2):反序列化之前,先进行严格的数据类型校验。由于校验规则容易被攻击者探索出来,进而容易被绕过,因此防御不能仅依赖这一个手段,但可以作为完整性校验防御方案的补充
(3):隔离运行那些在低特权环境中反序列化的代码
(4):对反序列化过程进行详尽的日志记录,监控反序列化过程,在发现疑似反序列化攻击时进行警报

A9:2017-使用含有已知漏洞的组件

1.攻击原理
由于现在的服务器都需要使用很多的组件,管理员并不能保证所使用的组件都是没有最新的,因此可能会存在一些版本是存在已知漏洞的(实际上比较新的版本的组件也是会存在漏洞的),攻击者可以使用这些已知的漏洞来进行攻击,甚至获得管理员权限。

2.防御方法
(1):移除不使用的依赖、不需要的功能、组件、文件和文档
(2):从官方渠道安全的获取组件,并使用签名机制来降低组件被篡改或加入恶意漏洞的风险
(3):关注最新的漏洞报告,及时为需要的组件进行升级或者打补丁

A10:2017-不足的日志记录和监控

1.日志记录介绍
日志记录是一个系统的最重要的功能之一。日志记录包括登录成功记录、登录失败记录、访问控制记录等,用来记录服务器的各种信息。

2.攻击原理
攻击者依靠监控的不足和响应的不及时来达成他们的目标而不被知晓。比如日志没有记录登录失败,那么攻击者可能就可以通过暴力破解多次进行登录尝试,但是日志中却没有记录。这就可能让攻击者成功入侵系统并隐匿自己的行踪。这个看似危害不大但却是十分严重的危害,因为一个日志系统不完善的服务器很容易遭受攻击并且在遭受攻击后无法判断攻击来源,这样就无法做出相应的防御,很可能再次遭受同样的攻击。

3.防御方法
(1):确保所有登录、访问控制失败、输入验证失败能够被记录到日志中去,并保留足够的用户上下文信息,以识别可疑或恶意帐户,并为后期取证预留足够时间
(2):建立有效的监控和告警机制,使可疑活动在可接受的时间内被发现和应对
(3):完善日志系统,使其可以监控各种日志信息
(4):及时对日志系统进行备份,并保存足够长时间


本文转载自OWASP top 10漏洞原理及防御(2017版官方)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/e_mmm0629/article/details/114136462

智能推荐

unity 物体沿某一坐标轴旋转_unity 绕一轴旋转-程序员宅基地

文章浏览阅读715次。obj.transform.Rotate(0, fRotateSpeed * Time.deltaTime, 0, Space.Self);_unity 绕一轴旋转

【测试】8bit和4bit量化对模型在MMLU数据集上准确率的影响_q4量化 mmlu-程序员宅基地

文章浏览阅读859次,点赞30次,收藏16次。下面是改变其中某个参数后在 MMLU 数据集上的准确率,可以看出即使是 4bit 对准确率影响都没有很大,首 Token 性能还可以接近原精度,还节省了大量的空间。ms,最后的测试结果还算比较接近官方的结果,以此作为 baseline 和量化后的模型权重对比推理下游任务准确率的损失情况。),4bit 量化包含两种 4bit 的数据类型 FP4 和 NF4,以及。Mistral-7B 是一个很强的 7B 开源模型,在 Mistral。)并直接在原精度(BF16)上进行推理,尝试复现出官方的准确率。_q4量化 mmlu

python——飞机大战小游戏_python小游戏代码飞机大战-程序员宅基地

文章浏览阅读2.9k次,点赞4次,收藏22次。先安装一下pygame这个库然后将素材烤入,一些飞机图片和背景需要修改一下编辑器不然会找不到草率了,貌似得再pycharm里下载pip下载的它找不到我又重新下载了一下再右面加号新建一个解释器选择本地python.exe,把公开它的库选上终于好了。_python小游戏代码飞机大战

Carla系列——4.Cara模拟器添加语义分割相机(Semantic segmentation camera)_如何使用carla仿真语义分割模型-程序员宅基地

文章浏览阅读1.8k次,点赞6次,收藏15次。本节的内容是生成一个语义分割相机,主要分为:四部分。一、初始化世界以及添加车辆二、生成语义分割相机Semantic segmentation camera三、监听语义分割相机,进行数据处理四、呈现最终效果一、初始化世界以及添加车辆这一节承接之前生成车辆的内容(Carla生成车辆).设置vehicle 为自动控制模式1.添加车辆的完整代码为:import globimport osimport sysimport timeimport randomimport._如何使用carla仿真语义分割模型

"Java:comp/env/"讲解与JNDI_comp.env.ejb.dbtableoperlocal-程序员宅基地

文章浏览阅读567次。我们在使用JNDI调用某个对象时,会有下述两种方式context.lookup(“Java:comp/env/XXX”) context.lookup(“XXX”)context.lookup(“java:comp/env/XXX”)只能用在J2EE环境,如果你自己写一个main函数,想通过context.lookup(“java:comp/env/XXX”)这样的方式_comp.env.ejb.dbtableoperlocal

2022年下半年系统架构设计师下午真题及答案解析_系统架构设计师真题-程序员宅基地

文章浏览阅读1.4w次,点赞10次,收藏63次。新系统除了保持现有的四级固定会员制度外,还需要根据用户的消费金额、偏好、重复性等相关特征动态调整商品的折扣力度,并支持在特定的活动周期内主动筛选与活动主题高度相关的用户集合,提供个性化的打折促销活动。系统的故障检测和诊断是宇航系统提高装备可靠性的主要技术之一,随着装备信息化的发展,分布式架构下的资源配置越来越多、资源布局也越来越分散,这对系统的故障检测和诊断方法提出了新的要求。因为宇航系统是一个非常复杂的系统,如果采用张工的基于解析模型的方法,这一类方法需要建立再精准数学模型的基础上来进行故障诊断。_系统架构设计师真题

随便推点

搭建Windows Server 2008故障转移群集-程序员宅基地

文章浏览阅读255次。本文章将详细讲述基于Windows Server 2008 R2的故障转移群集的实现,包括基本知识介绍,故障转移群集环境准备,实施过程,群集的维护等。故障转移群集可以配置使用多种不同的配置。组成群集的服务器可以是活跃状态或不活跃状态,而不同服务器可以被配置为在活跃服务器故障后立刻接管相应的资源。一般故障转移的过程只需要几分钟的时间,至于时间的长短主要取..._安装故障转移群集中的验证配置步骤,测试工作包括

【深大C语言OJ】对齐输出(格式化输出)_深大oj-程序员宅基地

文章浏览阅读748次,点赞19次,收藏9次。因为是输出部分的变化,所以我们需要调整printf函数中的内容,因为默认就是右对齐输出,所以这个可以不用管;至于占8个字符输出,将%d改为%8d即可。此题在输出整数的基础上多了两个要求,一个是每个整数占8个字符的宽度输出,一个是右对齐输出。另外还需要注意三个整数之间要用空格分开。只有一行,按照格式要求依次输出三个整数,之间以一个空格分开。读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们。只有一行,包含三个整数,整数之间以一个空格分开。_深大oj

Java面试题-数据结构_数据结构面试-程序员宅基地

文章浏览阅读3.5k次,点赞3次,收藏37次。八大基本数据结构以及衍生相关数据结构_数据结构面试

JVM详解之:java class文件的密码本_java 密码本-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏5次。一切的一切都是从javac开始的。从那一刻开始,java文件就从我们肉眼可分辨的文本文件,变成了冷冰冰的二进制文件。变成了二进制文件是不是意味着我们无法再深入的去了解java class文件了呢?答案是否定的。机器可以读,人为什么不能读?只要我们掌握java class文件的密码表,我们可以把二进制转成十六进制,将十六进制和我们的密码表进行对比,就可以轻松的解密了。下面,让我们开始这个激动人心的过程吧。_java 密码本

Android Proguard混淆打包经验总结_android proguard lambda-程序员宅基地

文章浏览阅读3.4k次,点赞10次,收藏76次。作为一名Android开发,应该了解并尝试给自己的项目进行Proguard混淆打包。项目经过Proguard混淆打包后,会发现apk包体积会变小,也就是混淆可以使得apk瘦身;并且反编译apk的时候会发现, 项目中的源码都被处理过,进一步保障了apk的安全;这就是我所理解的Proguard混淆打包的两个优点。不过,想要真正给自己的项目进行Proguard混淆打包,可不是一件容易的事情,真正尝试去做_android proguard lambda

input框限制只能输入正整数、字母、小数、-程序员宅基地

文章浏览阅读5.9k次,点赞2次,收藏2次。这篇博文大部分来自于网上,为了方便自己查阅,以及帮助他人。 1,只能输入正整数 <input onkeyup="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}" onaft..._input 只能输入数字和一位小数

推荐文章

热门文章

相关标签