0x00 前言
0x01 注入
1.1 威胁代理
考虑任何能够向系统发送不信任数据的人,包括外部用户,内部用户和管理员
1.2 攻击向量
攻击者利用有针对性的解释器语法发送简单的、基于文本的攻击,几乎任何数据源都能成为注入载体,包括内部来源
1.3 安全漏洞
注入漏洞发生在应用程序将不可信的数据发送到解释器时,注入漏洞十分普遍,尤其是在遗留代码中,通常能在 SQL
查询语句、LDAP
查询语句、Xpath
查询语句、OS
命令、XML
解析器、SMTP
头、程序参数中找到,注入漏洞很容易通过审查代码发现,但是不容易在测试中发现,扫描器和模糊测试工具可以帮助攻击者找到这些漏洞
1.4 技术影响
注入能导致数据丢失或数据破坏、缺乏可审计性或是拒绝服务,注入漏洞有时甚至能导致完全主机接管
1.5 业务影响
考虑受影响的数据和运行解释器的平台的商业价值。所有的数据都有可能被偷窃,篡改和删除,会严重损坏企业的声誉。
1.6 漏洞检测
- 用户提供的数据没有经过应用程序的验证、过滤或净化。
- 动态查询语句或非参数化的调用,在没有上下文感知转义的情况下被用于解释器。
- 在ORM搜索参数中使用了恶意数据,这样搜索就获得包含敏感或未授权的数据。
- 恶意数据直接被使用或链接注入SQL语句或命令在动态查询语句,命令或者存储过程中包含结构和恶意数据。
一些常见的注入,包括:SQL、OS命令、ORM、LDAP和表达式(EL)或OGNL注入。所有的解释器的概念都是相同的。代码审计是最有效的检测应用程序的注入风险方法之一,然后就是对所有参数、字段、头、cookie、JSON和XML数据输入的彻底DAST扫描。组织可以将SAST和DAST工具添加到CI/CD过程中,以便于在生产部署之前对现有或检查的代码进行注入问题的预警。
1.7 漏洞防护
防止注入漏洞需要将数据与命令语句、查询语句分隔开
最佳选择是使用安全的API ,安全避免使用解释器,或提供参数化界面的接口,或迁移到ORM或实体框架。
注意:当参数化是,存储过程仍然可以引入SQL注入,如果PL/SQL或T-SQL将查询和数据连接在一起,或者执行带有立即执行的exec()恶意数据。
使用正确的或“白名单”的方法,来恰当规范化输入验证的方法,可以有助于防止注入攻击。但是这不是一个完整的防御,因为许多应用程序在输入中需要特殊字符,例如文本区域或者移动应用程序的API。
对于任何剩余的动态查询,可以使用该解释器的特定转义语法转义特殊字符。OWASP的JAVA encoder和类似的库提供了这样的转义教程。
注意:SQL结构,比如:表名,列名等无法转义,因此用户提供的结构名是非常危险的。这是编写软件中的一个常见问题。
在查询中使用LIMIT和其他SQL控件,以防止在SQL注入是大量地泄露记录。
1.8 攻击案例
1.8.1 场景1
应用程序在SQL语句的构造中使用了不可信的数据。
1 | String query = "SELECT * FROM accounts WHERE |
1.8.2 场景2
1 | Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'"); |
同样的,框架应用的盲目信任,仍然可能导致查询语句的漏洞。(例如:Hibernate查询语言(HQL))
在这两个案例中,攻击者在浏览器中将“id”参数的值修改成:’
or’1’=’1
例如:
http://example.com/app/accountView?id=' or ‘1’=’1
这样查询语句的意义就变成了从accounts表中返回所有的记录。
更危险的攻击可能导致数据被篡改甚至是存储过程被调用。
0x02 失效的身份认证
2.1 威胁来源
攻击者可以获得数百万的有效用户名和密码组合,包括证书填充、默认的管理账户列表、自动的暴力破解和字典攻击工具,以及高级的GPU破解工具。会话管理攻击会容易被理解,尤其是没有过期的会话秘钥。
2.2 安全弱点
大多数身份和访问管理系统的设计和实现,普遍存在身份认证失效问题。会话管理是身份验证和访问控制的基础,并且存在于所有有状态应用程序中。
攻击者可以使用指南手册来检测失效的身份验证,但是通常会关注密码转储、字典攻击,或者在类似于钓鱼或者社会工程攻击之后,发现失效的身份认证。
2.3 漏洞影响
攻击者需要访问几个账户,或者需要一个管理员账户就可以破坏我们的系统。根据应用程序领域的不同,可能会导致放任洗钱、社会安全欺诈以及用户身份盗窃、泄露法律高度保护的敏感信息等。
2.4 漏洞检测
确认用户身份、身份验证和会话管理非常重要,这些措施可用于将恶意的未经身份验证的攻击者于授权用户进行分离。
- 允许凭证填充,这使得攻击者获得有效用户名和密码列表。
- 允许暴力破解或者其他自动攻击
- 允许默认的,弱的或者众所周知的密码,即弱口令
- 使用弱的或失效的验证凭证,忘记密码程序,列如“基于知识的答案”,是不安全的。
- 使用明文、加密或弱散列密码
- 缺少或失效的多因素身份验证
- 暴露URL中的会话ID(例如URL重写)
- 在成功登录后不会更新会话ID
- 不正确地是会话ID失效。当用户不活跃的时候,用户会话或认证令牌(特别是单点登录SSO令牌)没有正确注销或失效。
2.5 漏洞防护
- 在可能的情况下,实现多因素身份验证,以防止自欧东、凭证填充、暴力破解和被盗凭据在利用攻击
- 不要使用发送或部署默认的凭证,特别是管理员用户
- 执行弱密码检查,比如使用常用的TOP1000密码字典来进行密码检查。
- 设置密码规则,比如密码长度,负载型和循环策略等。
- 确认注册、凭据回复和API路径,通过对所有输入结果使用相同的消息,用以抵御账户枚举攻击。
- 限制或逐渐延迟失败的登录尝试。记录所有失败信息并在凭据填充、暴力破解或其他攻击被检测是提醒管理员。
- 使用服务器安全的内置会话管理器,在登录后生成高度复杂的新随机会话ID,会话ID不能再URL中,可以安全地存储和当登出闲置、绝对超时后使其失效。如随机token
2.6 攻击案例
场景1
应用程序不限制身份验证尝试,攻击者可利用密码字典进行装库攻击。
场景2
应用会话超时设置不正确,用户使用公共计算机访问应用程序,yoghurt直接挂你吧浏览器选项卡就离开,而不是选择注销,攻击者一个小时候使用同一浏览器浏览网页,而当前用户状态仍然是经过身份验证的。
0x03 敏感信息泄露
0x04 XML外部实体(XXE)
0x05 失效的访问控制
0x06 安全配置错误
0x07 跨站脚本(XSS)
0x08 不安全的反序列化
0x09 使用含有已知漏洞的组件
0x10 不足的日志记录和监控
0x11参考链接
https://github.com/PyxYuYu/MyBlog/issues/85
《OWASP TOP10中文手册》
###