前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >渗透测试web安全综述(4)——OWASP Top 10安全风险与防护

渗透测试web安全综述(4)——OWASP Top 10安全风险与防护

原创
作者头像
zhouzhou的奇妙编程
修改2024-09-27 19:21:39
2230
修改2024-09-27 19:21:39
举报
文章被收录于专栏:渗透测试专栏

OWASP Top 10

OWASP(Open Web Application Security Project,开放式Web应用程序安全项目)是一个在线社区,开源的、非盈利的全球性安全组织,主要在Web应用安全领域提供文章、方法论、文档、工具和技术,致力于应用软件的安全研究。

OWASP的使命是使应用软件更加安全,使企业和组织能够对应用安全风险做出更清晰的决策。目前OWASP全球拥有250个分部,近7万名会员,共同推动了安全标准、安全测试工具、安全指导手册等应用安全技术的发展。

OWASP Top 10列出了公认的最有威胁性的Web应用安全洞,总结并更新Web应用程序中最可能、最常见、最危险的十大漏洞。

攻击者可以通过应用程序中许多的不同的路径方式去危害企业业务,每种路径方法都代表了一种风险,这些风险都值得关注。

注入

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

应用程序存在如下情况时,是脆弱的且易受攻击:

  • 用户提供的数据没有经过应用程序的验证、过滤或净化
  • 动态查询语句或非参数化的调用,在没有上下文感知转义的情况下,被用于解释器
  • 在ORM搜索参数中使用了恶意数据,这样搜索就获得包含敏感或未授权的数据
  • 恶意数据直接被使用或连接,诸如SQL语句或命令在动态查询语句、命令或存储过程中包含结构和恶意数据

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

  • 最佳选择是使用安全的API,完全避免使用解释器,或提供参数化界面的接口,或迁移到ORM或实体框架。
  • 使用正确的或“白名单”的具有恰当规范化的输入验证方法同样会有助于防止注入攻击,但这不是一个完整的防御,因为许多应用程序在输入中需要特殊字符,例如文本区域或移动应用程序的API。
  • 对于任何剩余的动态查询,可以使用该解释器的特定转义语法转义特殊字符OWASP的Java Encoder和类似的库提供了这样的转义例程。
  • 在查询中使用LIMIT和其他SQL控件,以防止在SQL注入时大量地泄露记录。

失效的身份认证

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

应用程序存在如下情况时,那么可能存在身份验证的脆弱性:

  • 允许凭证填充,这使得攻击者获得有效用户名和密码的列表
  • 允许暴力破解或其他自动攻击
  • 允许默认的、弱的或众所周知的密码,例如 " Password1 " 或 "admin/admin"
  • 使用弱的或失效的验证凭证,忘记密码程序,例如“基于知识的答案”
  • 使用明文、加密或弱散列密码(参见:敏感数据泄露)
  • 缺少或失效的多因素身份验证
  • 暴露URL中的会话ID(例如URL重写)
  • 在成功登录后不会更新会话ID
  • 不正确地使会话ID失效。当用户不活跃的时候,用户会话或认证令牌(特别是单点登录(SSO)令牌)没有正确注销或失效

防护策略如下:

  • 在可能的情况下,实现多因素身份验证,以防止自动、凭证填充、暴力破解和被盗凭据再利用攻击
  • 不要使用发送或部署默认的凭证,特别是管理员用户
  • 执行弱密码检查,例如测试新或变更的密码,以纠正 "排名前10000个弱密码"
  • 将密码长度、复杂性和循环策略与NIST-800-63 B的指导方针(记住秘密)或其他现代的基于证据的密码策略相一致
  • 确认注册、凭据恢复和API路径,通过对所有输出结果使用相同的消息,用以抵御账户枚举攻击
  • 限制或逐渐延迟失败的登录尝试。记录所有失败信息并在凭据填充、暴力破解或其他攻击被检测时提醒管理员。
  • 使用服务器端安全的内置会话管理器,在登录后生成高度复杂的新随机会话ID。会话ID不能在URL中,可以安全地存储和当登出、闲置、绝对超时后使其失效。

敏感数据泄露

我们需要对敏感数据加密,这些数据包括: 传输过程中的数据、存储的数据以及浏览器的交互数据。

对于敏感数据,要确定:

  • 在数据传输过程中是否使用明文传输 ? 这和传输协议相关,如:HTTP、SMTP和FTP 外部网络流量非常危险。验证所有的内部通信,如:负载平衡器、Web服务器或后端系统之间的通信。
  • 当数据被长期存储时,无论存储在哪里,它们是否都被加密,包含备份数据?
  • 无论默认条件还是源代码中,是否还在使用任何旧的或脆弱的加密算法?
  • 是否使用默认加密密钥,生成或重复使用脆弱的加密密钥,或者缺少恰当的密钥管理或密钥回转?
  • 是否强制加密敏感数据,例如:用户代理(如:浏览器)指令和传输协议是否被加密?
  • 用户代理(如:应用程序、邮件客户端)是否未验证服务器端证书的有效性?

通常,防护策略如下:

  • 对系统处理、存储或传输的数据分类,并根据分类进行访问控制。
  • 熟悉与敏感数据保护相关的法律和条例,并根据每项法规要求保护敏感数据。
  • 对于没必要存放的、重要的敏感数据,应当尽快清除,或者通过PCIDSS标记或拦截。
  • 确保存储的所有敏感数据被加密。
  • 确保使用了最新的、强大的标准算法或密码、参数、协议和密匙,并且密钥管理到位。
  • 确保传输过程中的数据被加密(HTTPS);确保数据加密被强制执行。
  • 禁止缓存对包含敏感数据的响应。
  • 确保使用密码专用算法存储密码。将工作因素(延迟因素)设置在可接受范围。
  • 单独验证每个安全配置项的有效性。

XML外部实体(XXE)

攻击者可以利用外部实体窃取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻击。

应用程序和特别是基于XML的Web服务或向下集成,可能在以下方面容易受到攻击:

  • 应用程序直接接受XML文件或者接受XML文件上传,特别是来自不受信任源的文件或者将不受信任的数据插入XML文件,并提交给XML处理器解析。
  • 在应用程序或基于Web服务的SOAP中,所有XML处理器都启用了文档类型定义(DTDS)。因为禁用DTD进程的确切机制因处理器而不同。
  • 如果为了实现安全性或单点登录(SSO),应用程序使用SAML进行身份认证。而SAML使用XML进行身份确认,那么应用程序就容易受到XXE攻击。
  • 如果应用程序使用第1.2版之前的SOAP,并将XML实体传递到SOAP框架,那么它可能受到XXE攻击。
  • 存在XXE缺陷的应用程序更容易受到拒绝服务攻击,包括:BilionLaughs攻击。

通常,防护策略如下:

  • 尽可能使用简单的数据格式(如:JSON),避免对敏感数据进行序列化。
  • 及时修复或更新应用程序或底层操作系统使用的所有XML处理器和库。同时,通过依赖项检测,将SOAP更新到1.2版本或更高版本。
  • 在应用程序的所有XML解析器中禁用XML外部实体和DTD进程。
  • 在服务器端实施积极的(“白名单”)输入验证、过滤和清理,以防止在XML文档标题或节点中出现恶意数据。
  • 验证XML或XSL文件上传功能是否使用XSD验证或其他类似验证方法来验证上传的XML文件。
  • 尽管在许多集成环境中,手动代码审查是大型、复杂应用程序的最佳选择,但是SAST工具可以检测源代码中的XXE漏洞。如果无法实现这些控制,请考虑使用虚拟修复程序API安全网关或Web应用程序防火墙(WAF)来检测、监控和防止XXE攻击。

失效的访问控制

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

常见的访问控制脆弱点包括:

  • 通过修改URL、内部应用程序状态或HTML页面绕过访问控制检查,或简单地使用自定义的API攻击工具。
  • 允许将主键更改为其他用户的记录,例如查看或编辑他人的帐户。
  • 特权提升。在不登录的情况下假扮用户,或以用户身份登录时充当管理员。
  • 元数据操作,如重放或篡改JWT访问控制令牌,或作以提升权限的cookie或隐藏字段。
  • CORS配置错误允许未授权的API访问。
  • 以未通过身份验证的用户身份强制浏览的通过身份验证时才能看到的页面、或作为标准用户 访问具有相关权限的页面、或API没有对POST、PUT和DELETE强制执行访问控制。

访问控制只有在受信服务器端代码或没有服务器的API中有效,这样攻击者才无法修改访问控制检查或元数据。

  • 除公有资源外,默认情况下拒绝访问。
  • 使用一次性的访问控制机制,并在整个应用程序中不断重用它们,包括最小化CORS使用。
  • 建立访问控制模型以强制执行所有权记录,而不是接受用户创建、读取、更新或删除的任何记录。
  • 域访问控制对每个应用程序都是唯一的,但业务限制要求应由域模型强制执行。
  • 禁用 Web服务器目录列表,并确保文件元数据(如:git)不存在于 Web的根目录中。
  • 记录失败的访问控制,并在适当时向管理员告警(如:重复故障)。
  • 对API和控制器的访问进行速率限制,以最大限度地降低自动化攻击工具的危害。
  • 当用户注销后,服务器上的JWT令牌应失效。

安全配置错误

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

应用程序存在以下情况,可能受到攻击:

  • 应用程序栈堆的任何部分都缺少适当的安全加固,或者云服务的权限配置错误。
  • 应用程序启用或安装了不必要的功能(例如:不必要的端口、服务、网页、帐户或权限)。默认帐户的密码仍然可用且没有更改。
  • 错误处理机制向用户披露堆栈跟踪或其他大量错误信息。
  • 对于更新的系统,禁用或不安全地配置最新的安全功能。
  • 应用程序服务器、应用程序框架(Struts、Spring、ASP.NET)、库文件、数据库等没有进行安全配置。
  • 服务器不发送安全标头或指令,或者未对服务器进行安全配置。
  • 您的应用软件已过期或易受攻击(参见:使用含有已知漏洞的组件)。

通常,防护策略如下:

  • 一个可以快速且易于部署在另一个锁定环境的可重复的加固过程。开发、质量保证和生产环境都应该进行相同配置,并且在每个环境中使用不同的密码。这个过程应该是自动化的,以尽量减少安装一个新安全环境的耗费。
  • 搭建最小化平台,该平台不包含任何不必要的功能、组件、文档和示例。移除不适用的功能和框架。
  • 检查和修复安全配置项来适应最新的安全说明、更新和补丁,并将其作为更新管理过程的一部分,(参见:使用含有已知漏洞的组件)。在检查过程中,应特别注意云存储权限。
  • 一个能在组件和用户间提供有效的分离和安全性的分段应用程序架构,包括分段容器化和云安全组。
  • 向客户端发送安全指令,如:安全标头。
  • 在所有环境中能够进行正确安全配置和设置的自动化过程。

跨站脚本(XSS)

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

典型的XSS攻击可导致盗取session、账户、绕过MFA、DIV替换、对用户浏览器的攻击(例如:恶意软件下载、键盘记录)以及其他用户侧的攻击。存在三种XSS类型,通常针对用户的浏览器:

  • 反射式XSS:应用程序或AP包括未经验证和未经转义的用户输入,作为HTML输出的一部分。一个成功的攻击可以让攻击者在受害者的浏览器中执行任意的HTML和JavaScript。 通常,用户将需要与指向攻击者控制页面的某些恶意链接进行交互,例如恶意漏洞网站,广告或类似内容。
  • 存储式XSS:你的应用或者API将未净化的用户输入存储下来了,并在后期在其他用户或者管理员的页面展示出来。 存储型XSS一般被认为是高危或严重的风险。
  • 基于DOM的XSS:会动态的将攻击者可控的内容加入页面的JavaScript框架、单页面程序或API存在这种类型的漏洞。理想的来说,你应该避免将攻击者可控的数据发送给不安全的JavaScript API。

通常,防护策略如下,防止XSS需要将不可信数据与动态的浏览器内容区分开。

  • 使用设计上就会自动编码来解决XSS问题的框架,如:Ruby3.0或ReactJS。
  • 为了避免反射式或存储式的XSS漏洞,要根据HTML输出的上下文(包括:主体、属性、JavaScript、CSS或URL)对所有不可信的HTTP请求数据进行恰当的转义。
  • 在客户端修改浏览器文档时,为了避免DOM XSS攻击,最好的选择是实施上下文敏感数据编码。如果这种情况不能避免,可以采用类似上下文敏感的转义技术应用于浏览器API。
  • 使用内容安全策略(CSP)是对抗XSS的深度防御策略。如果不存在可以通过本地文件放置恶意代码的其他漏洞(例如:路径遍历覆盖和允许在网络中传输的易受攻击的库),则该策略是有效的。

不安全的反序列化

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

如果反序列化进攻者提供的敌意或者篡改过的对象将会使将应用程序和API变的脆弱这可能导致两种主要类型的攻击:

  • 如果应用中存在可以在反序列化过程中或者之后被改变行为的类,则攻击者可以通过改变应用逻辑或者实现远程代码执行攻击。我们将其称为对象和数据结构攻击。
  • 典型的数据篡改攻击,如访问控制相关的攻击,其中使用了现有的数据结构,但内容发生了变化。

在应用程序中,序列化可能被用于:

  • 远程和进程间通信(RPC/IPC)
  • 连线协议、Web服务、消息代理
  • 缓存/持久性
  • 数据库、缓存服务器、文件系统
  • HTTP cookie、HTML表单参数、API身份验证令牌

安全的架构模式是不接受来自不受信源的序列化对象,或使用只允许原始数据类型的序列化媒体。如果不可能的话,考虑使用下述方法:

  • 执行完整性检查,如:任何序列化对象的数字签名,以防止恶意对象创建或数据篡改。
  • 在创建对象之前强制执行严格的类型约束,因为代码通常被期望成一组可定义的类。绕过这种技术的方法已经被证明,所以完全依赖于它是不可取的。
  • 如果可能,隔离运行那些在低特权环境中反序列化的代码。
  • 记录反序列化的例外情况和失败信息,如:传入的类型不是预期的类型或反序列处理引发的例外情况。
  • 限制或监视来自于容器或服务器传入和传出的反序列化网络连接。
  • 监控反序列化,当用户持续进行反序列化时,对用户进行警告。

使用含有已知漏洞的组件

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

如果满足下面的某个条件,那么应用程序就易受此类攻击:

  • 不知道所有使用的组件版本信息(包括:服务端和客户端)。这包括了直接使用的组件或其依赖的组件。
  • 如果软件易受攻击,不再支持或者过时。这包括:OS、Web服务器、应用程序服务器、数据库管理系统(DBMS)、应用程序、API和所有的组件、运行环境和库。
  • 不定期做漏洞扫描和订阅你使用组件的安全公告。
  • 如果不基于风险并及时修复或升级底层平台、框架和依赖库。很可能发生这种情况根据变更控制,每月或每季度进行升级,这使得组织在这段时间内会受到已修复但未修补的漏洞的威胁。
  • 如果软件工程师没有对更新的、升级的或打过补丁的组件进行兼容性测试。
  • 如果你没有对组件进行安全配置。

应该制定一个补丁管理流程:

  • 移除不使用的依赖、不需要的功能、组件、文件和文档。
  • 利用如versions、DependencyCheck、retire.js等工具来持续的记录客户端和服务 器端以及它们的依赖库的版本信息。持续监控如CVE和NVD等是否发布已使用组件 的漏洞信息。订阅关于使用组件安全漏洞的警告邮件。
  • 仅从官方渠道安全的获取组件,使用签名机制降低组件被篡改或恶意漏洞的风险。
  • 监控那些不再维护或者不发布安全补丁的库和组件。如果不能打补丁,可以考虑部署虚拟补丁来监控、检测或保护。每个组织都应该制定相应的计划,对整个软件生命周期进行监控、评审、升级或更改配置。

不足的日志记录和监控

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

下列情况会导致不足的日志记录、检测、监控和响应:

  • 未记录可审计性事件,如:登录、登录失败和高额交易。
  • 告警和错误事件未能产生或产生不足的和不清晰的日志信息。
  • 没有利用应用系统和API的日志信息来监控可疑活动。
  • 日志信息仅在本地存储。
  • 没有定义合理的告警阈值和制定响应处理流程
  • 渗透测试和使用DAST工具(如:OWASP ZAP)扫描没有触发告警。
  • 对于实时或准实时的攻击,应用程序无法检测、处理和告警。

通常防护策略如下:

  • 确保所有登录、访问控制失败、输入验证失败能够被记录到日志中去,并保留足够的用户上下文信息,以识别可疑或恶意帐户,并为后期取证预留足够时间。
  • 确保日志以一种能被集中日志管理解决方案使用的形式生成。
  • 确保高额交易有完整性控制的审计信息,以防止篡改或删除,例如审计信息保存在只能进行记录增加的数据库表中。
  • 建立有效的监控和告警机制,使可疑活动在可接受的时间内被发现和应对。
  • 建立或采取一个应急响应机制和恢复计划,例如:NIST800-61rev2或更新版本。

目前已有商业的和开源的应用程序防护框架(例如:OWASPAppSensor)、Web应用防火墙(例如 :Modsecurity )、带有自定义仪表盘和告警功能的日志关联软件。

本文部分图片摘自深信服安全服务认证工程师课程课件中,为方便个人学习使用,勿作商用!!!!文字内容为自己手打,并非直接搬运!如有侵权,请联系删除!!!

本文档所提供的信息仅用于教育目的及在获得明确授权的情况下进行渗透测试。任何未经授权使用本文档中技术信息的行为都是严格禁止的,并可能违反《中华人民共和国网络安全法》及相关法律法规。使用者应当合法合规地运用所学知识,不得用于非法入侵、破坏信息系统等恶意活动。我们强烈建议所有读者遵守当地法律与道德规范,在合法范围内探索信息技术。

我正在参与2024腾讯21天技术创作挑战赛|年中回顾特别季,年中技术沉淀,拯救你的flag,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OWASP Top 10
    • 注入
      • 失效的身份认证
        • 敏感数据泄露
          • XML外部实体(XXE)
            • 失效的访问控制
              • 安全配置错误
                • 跨站脚本(XSS)
                  • 不安全的反序列化
                    • 使用含有已知漏洞的组件
                      • 不足的日志记录和监控
                      相关产品与服务
                      云服务器
                      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档