简介
OWASP Top 10
是排名前十的漏洞,需要在日常开发和管理时注意防范。- 目前最新的是
2017
年版的,随着时代的更新,漏洞也会不断变化。
这里只介绍
OWASP Top 10
不代表其他漏洞不重要,本文是对其的一个理解和记录。
A1:注入
介绍
- 将不受信任的数据作为命令或查询的一部分发送到解析器,会产生诸如
SQL
注入、NoSQL
注入、OS
注入和LDAP
注入的注入缺陷。 - 攻击者的恶意数据可以诱使解析器在没有授权的情况下执行非预期命令或访问数据。
攻击点
- 用户提供的数据没有经过应用程序的验证、过滤或净化。
- 攻击者构造注入语句时会涉及某些特殊的字符(比如
'
、<
)或者单词(比如select
、script
)。
- 攻击者构造注入语句时会涉及某些特殊的字符(比如
- 动态查询语句或非参数化的调用,在没有上下文感知转义的情况下被用于解释器。
- 动态查询语句就是构造查询语句大体后,需要查询的部分空缺等待。
- 非参数化的调用即不使用参数占位的方法。
- 如果没有上下文感知,直接拼接则可能构成危险语句。
- 在
ORM
搜索参数中使用了恶意数据,这样搜索就获得包含敏感或未授权的语句。
ORM
(Object Relational Mapping
)对象关系映射可以将用户的查询作为参数传入后再把对象转化为查询语句。
- 恶意数据直接被使用或连接,诸如
SQL
语句或命令在动态查询语句、命令或存储过程中包含结构和恶意数据。
常见场景
- 常见的注入包括:
SQL
注入、OS
命令、ORM
、LDAP
和表达式语言(EL
)或OGNL
注入。 - 在代码审计之后,需要对所有参数、字段、头、
cookie
、JSON
和XML
数据输入的彻底的DAST
扫描。
LDAP
可以看作一个的数据库(实则是个在线目录访问协议),它以树状结构存储信息。
EL
表达式是JSP
访问模型对象的方式,格式为${}
。
OGNL
是对象图导航语言,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。注入例子
DAST
动态应用程序安全测试,检查系统对潜在漏洞测试的请求和响应(黑盒)。
攻击情景
Java
String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'";
PHP
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
HQL
Query HQLQuery= session.createQuery("FROM accountsWHERE custID='" + request.getParameter("id") + "'");
防御手段
- 将数据与命令语句、查询语句分隔开来。
- 使用安全的
API
,或提供参数化界面的接口,或迁移到ORM
或实体框架。
参数化后,存储过程仍然可以引发
SQL
注入。
- 设置输入的白名单,对特殊字符进行转义过滤。
- 查询中使用
LIMIT
和其他SQL
控件,防止大量泄漏数据。 - 使用预编译,不需要对注入内容进行解析,仅作为输入串填充。
A2:失效的身份认证
介绍
- 错误地使用身份认证和会话管理功能。
- 攻击者能够获取会话令牌、破译密码或密钥,达到冒充其他用户的目的。
攻击点
- 允许凭证填充,攻击者可借此获得有效用户名和密码的列表。
- 凭证填充是自动注入不合规的用户名和密码对,以获取对用户账户的访问权限。
- 属于暴力破解的子集。
- 允许暴力破解或其他自动攻击。
- 暴力枚举出奇迹。
- 允许弱密码。
- 很容易猜到或者常用的密码。
- 在忘记密码功能中,使用基于知识的答案作为验证方式。
- 使用明文、加密或弱散列密码(追溯到
A3:敏感数据泄漏
)。 - 缺少或失效的身份验证。
- 暴露
URL
中的会话ID
。- 将
sessionID
作为参数加入到URL
中。
- 将
- 成功登陆后不更新会话
ID
。- 使用固定的
sessionID
,容易被破解。
- 使用固定的
- 用户不活跃时,没有将用户会话或令牌注销。
攻击情景
凭证填充
- 攻击者从网站漏洞或密码转储网站获取溢出的用户名和密码。
- 攻击者使用帐户检查器针对许多网站(例如,社交媒体网站或在线市场)测试被盗的凭据。
身份验证攻击
- 仅使用密码作为唯一验证因素,攻击者可通过枚举密码暴力破解。
- 单一的身份验证容易破解,使用多因素验证可加大破解难度。
会话超时攻击
- 应用在会话超时后,不对过期的会话进行注销。
- 用户在会话结束后也不选择注销会话。
- 攻击者利用会话残存时间,冒充用户使用该会话。
防御手段
- 使用多因素身份验证。
- 不发送或者部署默认的凭证(尤其是管理员)。
- 不使用弱密码。
- 密码中不能包含常见的信息,比如电话、生日等。
- 确认注册、凭据恢复和
API
路径,对输出结果使用相同的消息,以抵御枚举攻击。 - 限制登录失败的次数,对自动化攻击进行防御。
- 保护会话
ID
。- 不能显示的出现。
- 会话超时后及时注销。
A3:敏感数据泄漏
介绍
- 部分
Web
应用程序和API
在数据传输和存储过程中无法保护敏感数据。 - 攻击者可以窃取或修改未加密的数据,以实施犯罪行为。
A4:XML外部实体
介绍
XML
处理器配置错误
A5:失效的访问控制
介绍
- 未对通过身份认证的用户实施恰当的访问控制。
- 攻击者可以利用这些缺点访问未经授权的功能或数据。
A6:安全配置错误
介绍
- 通常是由于不安全的默认配置、不完整的临时配置、开源云存储、错误的
HTTP
标头配置以及敏感信息的详细错误信息所造成的。
A7:跨站脚本(XSS)
介绍
- 新网页包含不受信任的、未经恰当验证或转义的数据或者使用可以创建
HTML
或JavaScript
的浏览器API
更新现有的网页时,就会出现XSS
缺陷。 - 攻击者可以利用
XSS
漏洞劫持用户会话、破坏网站或重定向到恶意站点。
A8:不安全的反序列化
介绍
- 不安全的反序列化会导致远程代码执行。
- 即使远程代码没有运行,攻击者也可以利用反序列化漏洞进行攻击。