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):及时对日志系统进行备份,并保存足够长时间

Leave a Reply