1.访问控制失效 (Broken Access Control)
2.加密失败 (Cryptographic Failures)
3.注入 (Injection)
4.不安全设计 (Insecure Design)
5.安全配置错误 (Security Misconfiguration)
概念:网站有一些页面受到保护,普通用户无法访问。例如,只有网站的管理员用户才能访问管理其他用户的页面,普通用户之间也不应该能够互相访问到一些敏感的个人数据等。如果网站用户可以访问他们不应该访问的受保护页面,那么访问控制就被破坏了。
风险:普通用户访问受保护页面可能导致以下情况:(1)查看其他用户的敏感信息;(2)访问未经授权的功能。简而言之,这极易引发不安全的直接对象引用 (IDOR),访问控制漏洞允许攻击者绕过授权,从而查看敏感数据或执行他们不应该执行的任务。
方案:(1)最小权限原则:给予用户和系统组件最小必要的权限以完成其工作。这可以通过确定每个用户或角色需要的最低权限级别、使用功能或资源级别的访问控制列表(ACL)来限制用户对资源的访问;(2)强制访问控制策略: 使用访问控制列表(ACL)或角色基础的访问控制来强制授权策略。确保只有经过授权的用户才能访问特定资源;(3)身份验证和授权机制: 实施强大的身份验证和授权机制,以确保只有经过身份验证的用户才能访问敏感资源,这可以包括多因素身份验证(MFA)和单一登录(SSO);(4)会话管理: 确保会话管理是安全的,不容易被绕过或劫持。使用随机生成的会话令牌,确保会话过期后自动注销,以及防止会话固定攻击等。
概念:加密失败是指由于滥用(或不使用)加密算法来保护敏感信息而产生的任何漏洞,有些弱加密信息可以通过一些加解密网站很容易就猜测出所加密的信息。网络应用程序需要使用加密技术在多个层面为用户提供保密性。例如,当你使用浏览器访问电子邮件账户时,你需要确保你和服务器之间的通信是加密的。这样,任何试图捕获你的网络数据包的窃听者都无法恢复你的电子邮件地址内容。当我们对客户端和服务器之间的网络通信进行加密时,我们通常称之为对传输中的数据进行加密。由于您的电子邮件存储在由提供商管理的服务器中,因此电子邮件提供商最好也无法读取客户的电子邮件。为此,您的电子邮件在服务器上存储时也可能会加密。这就是所谓的静态数据加密。
风险:加密失败往往会导致网络应用程序意外泄露敏感数据。这通常是与客户直接相关的数据(如姓名、出生日期、财务信息),但也可能是技术性更强的信息,如用户名和密码。在更复杂的层面上,利用某些加密失效往往涉及 "中间人攻击 "等技术,攻击者会通过他们控制的设备强行连接用户。然后,他们会利用任何传输数据的薄弱加密功能来访问截获的信息(如果数据一开始就加密的话)。当然,许多例子要简单得多,网络应用程序中也存在漏洞,事实上,在某些情况下,敏感数据可以直接在网络服务器上找到。
方案:(1)使用强密码和密钥管理: 确保使用足够强度的密码和密钥,避免使用弱密码,实施有效的密钥管理策略,包括定期旋转和更新密钥,使用硬件安全模块(HSM)来存储和管理密钥,提高安全性;(2)选择适当的加密算法: 选择经过安全审查和广泛接受的加密算法,如AES,避免使用已被证明存在弱点的算法;(3)避免硬编码密钥和密码: 不要将密钥和密码硬编码在应用程序代码中。将它们存储在安全的配置文件或密钥存储中;(4)安全传输协议: 对于数据在传输过程中的加密,使用安全的传输协议,如TLS/SSL,以确保通信的保密性和完整性。
概念:在当今的应用程序中,注入漏洞非常常见。出现这些缺陷的原因是应用程序将用户控制的输入解释为命令或参数。注入攻击取决于使用了哪些技术以及这些技术如何解释输入。
风险:一些常见的例子包括(1)SQL 注入: 当用户控制的输入被传递到 SQL 查询时,就会发生这种情况,攻击者可以通过 SQL 查询来操纵此类查询的结果,当这种输入被传递到数据库查询中时,攻击者就有可能访问、修改和删除数据库中的信息,这意味着攻击者可以窃取敏感信息,如个人信息和凭证等;(2)命令注入: 当用户输入被传递到系统命令时,就会发生这种情况,攻击者可以在应用服务器上执行任意系统命令,从而有可能访问用户的系统。
方案:防止注入攻击的主要方法是确保用户控制的输入不被解释为查询或命令。(1)使用允许列表:向服务器发送输入时,将输入与安全输入或字符列表进行比较。如果输入被标记为安全,则会被处理。否则,该输入将被拒绝,应用程序将抛出错误。(2)
删除输入: 如果输入包含危险字符,则会在处理前删除这些字符。
危险字符或输入被归类为可能改变底层数据处理方式的任何输入,与其手动构建允许列表或剥离输入,不如使用各种库来为你执行这些操作。
概念:不安全设计指的是应用程序架构中固有的漏洞。它们不是由于与不良实施或配置而引发的漏洞,而是整个应用程序(或其中的一部分)从一开始就存在缺陷。大多数情况下,这些漏洞发生在应用程序规划阶段的不当威胁建模,并一直传播到最终应用程序。还有一些时候,不安全的设计漏洞也可能是由开发人员在代码中添加一些 "快捷方式 "来简化测试时引入的。例如,开发人员可能会在开发阶段禁用 OTP 验证,以便快速测试应用程序的其他部分,而无需在每次登录时手动输入验证码,但在将应用程序发送到生产阶段时却忘记重新启用。
风险:不安全设计可能引发多种安全风险,这些风险通常涉及到应用程序、系统或产品的基本设计缺陷,可能会导致数据泄露、恶意攻击、身份盗窃和其他安全问题。
方案:由于不安全的设计漏洞是在开发过程的早期阶段引入的,要解决这些问题往往需要从头开始重建应用程序的漏洞部分,通常比其他与代码相关的简单漏洞更难解决。避免此类漏洞的最佳方法是在开发生命周期的早期阶段执行威胁建模。
概念:安全配置错误与其他 10 大漏洞不同,因为它们发生在本可以进行适当的安全配置但却没有进行的情况下。即使您下载的是最新的软件,配置不当也会使您的安装受到攻击。常见的安全错误配置可能有:云服务的权限配置不当;启用了不必要的功能,如服务、页面、账户或权限;密码未变的默认账户;错误信息过于详细,让攻击者能够发现更多系统信息;不使用 HTTP 安全标头。
风险:此漏洞通常会导致更多漏洞,如默认凭据允许访问敏感数据、XML 外部实体 (XXE) 或管理员页面上的命令注入等。
方案:(1)定期审计和评估: 定期审查配置,确保它们符合最佳实践和安全要求,进行漏洞扫描和安全测试,以发现潜在的配置问题;(2)默认配置修改: 修改默认配置,以降低攻击面,不要使用默认的管理员凭据和设置;(3)敏感信息保护: 避免在配置文件、日志或错误消息中泄露敏感信息,如数据库凭据或密钥;(4)安全云配置: 如果使用云服务,确保正确配置安全组、访问控制列表(ACL)、身份验证和授权策略等,以保护云资源;(5)错误信息处理: 对于生产环境,不要显示详细的错误信息,而是提供通用的错误消息,以防止攻击者获取关键信息。