什么是OWASP TOP10
OWASP(开放式Web应用程序安全项目)是一个开放的社区,有非营利组织OWASP基金会支持的项目。对所有致力于改进应用程序安全的人士开放,旨在提高对应用程序安全性的认识。其最具有权威的就是“十项最严重的Web应用程序安全风险列表”。
这里是2017版和2021版的对比,每四年更新一次。
A1 失效的访问控制
概述
访问控制是指保护资源不被非法访问和使用,目前应用最多的就是基于角色的访问控制机制。
失效的访问控制也叫越权,其实就是越权访问漏洞。
漏洞原因
攻击者通过各种手段提升自己的权限,越过访问控制,使访问控制失效,这样攻击者就可以冒充用户、管理员或拥有特权的用户,查看敏感文件、修改数据、更改访问权限、删除任何记录等等。
漏洞影响
绕过路径:未对读取的参数做检查,导致路径绕过读取到敏感文件。
权限提升:未对权限做检查,导致攻击者变更权限。
垂直越权:攻击者可以从普通用户权限提升到管理员的权限访问应用程序。
水平越权:攻击者可以从普通用户A的权限提升到普通用户B的权限访问应用程序。
常见的访问控制漏洞:
1、通过修改 URL、内部应用程序状态或 HTML 页面来绕过访问控制的检查,或者使用自定义的API 攻击工具来绕过访问控制检查
2、允许将主键更改为其他用户的记录
3、特权提升。在未登录的情况下充当用户或以用户身份登录时充当管理员。
4、元数据操作,例如重放或篡改JWT令牌,或用做提升权限的 cookie 或者隐藏字段。
5、CORS 的错误配置允许未经授权的 API 访问。
6、以未经身份验证的用户身份强制浏览通过身份验证的页面,作为标准用户身份访问具有相关特权页面, API 没有对 POST、PUT 和 DELETE 强制执行访问控制。
防护
访问控制仅在受信任的服务器端代码或无服务器 API 中有效,攻击者无法修改访问控制检查或元数据。
1、对参数的白名单过滤
2、除公有资源外,其他资源默认情况下拒绝访问
3、建立访问控制模型以强制执行所有权记录,而不是接受用户可以创建、读取、更新或删除任何记录
4、实施一次访问控制机制并在整个应用程序中重复使用它们,包括最大限度地减少 CORS 的使用
5、禁用 Web 服务器目录列表,并确保文件元数据(例如 .git)和备份文件不在 Web 根目录中
6、对API 和控制器访问进行速率限制,以最大程度的降低自动攻击工具的危害
7、记录失败的访问控制,并向管理员告警
8、当用户注销后,服务器上的JWT令牌应失效
A2 加密机制失效
概述
也就是2017版的敏感数据泄露。一般我们的敏感信息包括密码、财务数据、医疗数据等,都是由于Web应用、API未加密或者不正确的保护敏感数据,这些数据很容易遭到攻击者利用,攻击者可能使用这些数据来进行一些犯罪行为。在数据加密过程中,常见的问题是不安全的密钥生成和管理、使用弱加密算法、弱协议和弱密码。特别是使用弱的哈希算法来保护密码。在服务器端,检测传输过程中的数据弱点很容易,但检测存储数据的弱点是非常困难的。
攻击者不是直接攻击密码,而是在传输过程中或从客户端中窃取密钥、发起中间人攻击,在服务器端窃取明文数据。
常见的攻击方式主要是扫描应用程序获取到敏感数据。
漏洞原因
维护或开发人员无意间上传敏感数据
敏感数据文件的权限设置错误
网络协议、算法本身的弱点,如:Telent、FTP、MD5等
漏洞影响
应用程序、网站被修改
个人资料、公司资料泄露,被用于售卖获利
防护
1、定期扫描
2、使用强大的网络协议与算法
3、对系统处理、存储或传输的数据分类,并根据分类进行访问控制
4、确保存储的所有敏感数据被加密,确保传输过程中的数据被加密,确保数据加密被强制执行
5、禁止缓存对包含敏感数据的响应
6、单独验证每个安全配置项的有效性
7、没必要存放的、重要的敏感数据,应当尽快清除,或者通过PCI DSS标记、拦截。未存储的数据不能被窃取。
A3 注入
概念
将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。
注入漏洞一般在SQL、LDAP、XPath或是NoSQL查询语句、OS命令、XML解析器、SMTP包头、表达式语句及ORM查询语句中找到。它很容易通过代码审查发现。扫描器和模糊测试工具可以帮助攻击者找到注入漏洞。
攻击方式
利用应用程序弱点,通过恶意字符将恶意代码写入数据库,获取敏感数据,进一步在服务器执行命令。
漏洞原因
用户提供的数据未经过验证和过滤
未审计的数据输入框
未过滤的特殊字符
恶意数据直接被使用或连接,SQL语句或命令在动态查询语句、命令或存储过程中包含结构和恶意数据
SQL错误回显
漏洞影响
获取敏感数据,导致数据丢失、破坏或泄露给无授权方,缺乏可审计性或是拒绝服务,进一步在服务器执行命令接管服务器。
防护
1、使用安全的API,完全避免使用解释器,或提供参数化界面的接口,或迁移到ORM或实体框架
2、对输入字符白名单验证
3、对输入的特殊字符使用转义处理
4、代码审计
5、使用WAF,防止SQL注入的策略
6、严格限制网站访问数据库的权限
A4 不安全设计
概述
不安全设计漏洞是指在系统设计和架构设计中,由于不恰当的设计导致的安全风险。
防护
1、建立并使用安全开发流程,与专业的安全人员进行安全和隐私的风险评估
2、建立和使用安全设计模式库
3、建立威胁建模,明确可能来自的攻击有哪些
4、扫描程序的安全漏洞
5、编写单元和集成测试以验证所有关键流都能抵抗威胁模型
6、对于文件上传功能,需要对文件大小、类型进行严格检查和控制
7、敏感信息不要存储在本地,所有存放到 cookie 或者 localStorage 里的信息都要进行加密
A5 安全配置错误
攻击方式
攻击者利用错误配置攻击,获取敏感数据,提升权限
漏洞原因
开发或维护人员设置了错误的配置(默认配置,临时配置,开源云存储、http标头配置,包含敏感信息的详细错误),导致攻击者可以利用这些配置获取到更高的权限
应用程序启用或安装了不必要的功能
错误处理机制向用户披露堆栈跟踪或其他大量错误信息
漏洞影响
获取敏感数据
提升权限
防护
1、自动化安装部署
2、使用最小化平台
3、移除或不安装不适用的功能和框架
4、及时检测系统的版本,及时给已发现的漏洞打补丁
5、向客户端发送安全指令,例如安全标头
A6 自带缺陷和过时的组件
概述
在2017版本中叫使用具有已知漏洞的组件。
漏洞原因
不注意组件的版本和依赖组件的版本的使用
使用易受攻击的,不受支持的,和已过期的。包括操作系统、Web服务器、应用程序服务器、数据库管、应用程序、API和所有的组件、运行环境和库
没有定期做漏洞扫描,不注意使用组件的安全公告
没有对组件进行安全配置
开发人员未对更新、升级、打过补丁的组件进行兼容性测试
漏洞影响
敏感数据的泄露
提升权限
远程代码执行
防护
1、识别正在使用的组件和版本,包括所有的依赖
2、及时更新、修复组件漏洞或引用的库文件
3、移除不在使用的依赖组件,不需要的功能、组件、文件和文档
4、持续监控如CVE 和 NVD等是否发布已使用组件的漏洞信息,订阅关于使用组件安全漏洞的警
告邮件
5、从官方安全的获取组件,并使用签名机制来降低组件被篡改和加入恶意漏洞的风险
6、建立安全策略来管理组件的使用
A7 身份识别和身份验证错误
概述
在2017的版本中是叫失效的身份认证。通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥和会话令牌,然后冒充其他用户的身份。
身份认证:通常用于系统登录,形式一般为“用户名+密码”的登录方式,在安全性要求较高的情况下,还有验证码、客户端证书、Ukey等
会话管理:会话管理是身份验证和访问控制的基础,并且存在于所有有状态应用程序中。HTTP利用会话机制来实现身份认证,HTTP身份认证的结果往往是获得一个令牌并放在Cookie中,之后的身份识别只需读取授权令牌,如果授权令牌认证成功,那就不需要再次进行登录认证
攻击方式
攻击者利用网站应用程序中的身份认证缺陷获取高权限并进行攻击应用服务
漏洞原因
应用程序身份认证系统认证缺陷
漏洞影响
盗用账号与身份
页面设计不良,可直接绕过验证页面
允许默认的、弱的或众所周知的密码
使用弱的或失效的验证凭证,忘记密码程序
使用明文、加密或弱散列密码
不正确地使会话ID失效。当用户不活跃的时候,用户会话或认证令牌(特别是单点登录(SSO)令牌)没有正确注销或失效
防护
1、网站登录页面使用加密连接
2、具备超时注销机制
3、支持密码的有效期
4、支持禁用账户
5、不要以纯文本方式传输用户名和密码,对数据流、Cookie进行加密
6、使用强密码
7、使用多因素身份验证,防止自动凭证填充、暴力破解和被盗凭据
8、弱密码检查
9、确认注册、凭据恢复和API路径,通过对所有输出结果使用相同的消息,用以抵御账户枚举攻击
A8 软件和数据完整性故障
概述
在2017 年版本中,是不安全的反序列化, 2021 年版本包含在其中了。
它侧重于假设软件更新、重要数据和 CI/CD 程序的完整性,而无需对其进行验证。该漏洞还包括不安全的反序列化。不安全的反序列化指的是任何应用程序无法对易受攻击的外部或外部对象反序列化。这是因为黑客有能力对后端代码接收到的数据进行操纵。
序列化:把对象转变为字节流,存放在内、文件数据库中。
反序列化:是把字节流转变为对象。
漏洞影响
应用的运行代码以及应用发送的数据可能受到篡改
远程代码执行RCE
常见的漏洞利用:shrio反序列化漏洞、fastjson反序列化漏洞
防护
1、不接受来自不受信任源的序列化对象
2、在应用程序中限制使用序列化对象
3、保 CI/CD 工作流具有所需的分段、访问控制和参数化,以在整个设置和部署操作过程中保护代码完整性
4、未经签名或未加密的编译数据不应发送给不受信任的客户端
A9 安全日志和监控故障
漏洞原因
不足的日志记录和监控,以及事件响应缺失或无效的集成,让攻击者能够进一步攻击系统以及篡改、提取或销毁数据。
未记录可审计性事件
告警和错误事件未能产生或产生不足的和不清晰的日志信息
没有利用应用系统和API的日志信息来监控可疑活动
日志信息仅在本地存储
没有定义合理的告警阈值和制定响应处理流程
对于实时或准实时的攻击,应用程序无法检测、处理和告警
漏洞影响
无法判断安全事件的发生
无法判断和修复漏洞
导致再次被入侵
防护
1、启用监控和告警机制,使可疑活动在可接受的时间内被发现和应对
2、启用异地监控
3、确保所有登录、访问控制失败、输入验证失败能够被记录到日志中去,并保留足够的用户上下文信息,以识别可疑或恶意帐户,并为后期取证预留足够时间
4、确保高额交易有完整性控制的审计信息,以防止篡改或删除
A10 服务器请求伪造(SSRF)
概述
SSRF(Server-Side Request Forgery)服务器端请求伪造,一种由攻击者构造请求,服务器端发起请求的安全漏洞,本质上是属于信息泄露漏洞。SSRF 是在服务器端查询未验证用户提供的 URL 的情况下开发的。这允许攻击者诱使应用程序将伪造请求传输到不希望的位置,即使该位置受到虚拟专用网络 (VPN)、防火墙或网络访问控制列表 (ACL) 的保护。SSRF攻击的目标是从外网无法访问的内部系统(因为它是由服务器端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。
漏洞原因
由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。利用该漏洞由服务器发起恶意请求。通常被利用于对内网的探测和攻击。
常见的SSRF漏洞利用
file协议:能读取当前被攻击机的文件,内网机器文件不能读取(结合目录遍历)
dict协议:泄露安装软件版本信息,查看端口,操作内网Redis服务等。主要用于结合 curl 攻击。
gopher协议:先截获get请求包和post请求包,再构造成符合gopher协议的请求。也可用于反弹 shell。
http/https协议:探测内网主机存活
防护
1、将远程资源访问功能分离到不同的网络中
2、注意 URL 的准确性,防止 DNS 重新映射和“检查时间、使用时间”等攻击
3、限制协议、IP、端口
4、过滤返回的信息
5、设置防火墙和网络访问控制规则,阻止除必需的内部流量外的所有 Web 流量