OWASP Top 10 (一)
PyxYuYu opened this issue · 0 comments
PyxYuYu commented
Each time you love, love as deeply as if it were forever.
0x01 OWASP Top 10
- 注入
- 威胁代理:考虑任何能够向系统发送不信任数据的人,包括外部用户,内部用户和管理员
- 攻击向量:攻击者利用有针对性的解释器语法发送简单的、基于文本的攻击,几乎任何数据源都能成为注入载体,包括内部来源
- 安全漏洞:注入漏洞发生在应用程序将不可信的数据发送到解释器时,注入漏洞十分普遍,尤其是在遗留代码中,通常能在
SQL
查询语句、LDAP
查询语句、Xpath
查询语句、OS
命令、XML
解析器、SMTP
头、程序参数中找到,注入漏洞很容易通过审查代码发现,但是不容易在测试中发现,扫描器和模糊测试工具可以帮助攻击者找到这些漏洞 - 技术影响:注入能导致数据丢失或数据破坏、缺乏可审计性或是拒绝服务,注入漏洞有时甚至能导致完全主机接管
- 漏洞检测
- 确认所有解释器的使用都可以明确地将不可信数据从命令语句或查询语句中区分出来,对于
SQL
调用,这就意味着在所有准备语句(prepared statements
)和存储过程(stored procedures
)中使用绑定变量(bind variables
),并避免使用动态查询语句 - 检查应用程序是否安全使用解释器的最快最有效的方式是代码审计,代码分析工具可以帮助分析者找到使用解释器的代码并追踪应用的数据流,渗透测试者通过创建攻击的方法来确认这些漏洞
- 利用扫描器来帮助确认一些可利用的注入漏洞是否存在,然而,扫描器并非总能达到解释器,所以不容易检测一个攻击是否成功
- 确认所有解释器的使用都可以明确地将不可信数据从命令语句或查询语句中区分出来,对于
- 漏洞防护
- 将不可信的数据从命令及查询中区分开
- 最佳的选择是使用安全的
API
,完全避免使用解释器或提供参数化界面的API
,但要注意有些参数化的API
,比如存储过程(stored procedures
),如果使用不当,仍然可以引起注入漏洞 - 如果没法使用一个参数化的
API
,那么应该使用解释器具体的escape
语法来避免特殊字符 - 使用正面的或白名单的具有恰当的规范化的输入验证方法同样可以防止注入攻击,但由于很多应用在输入中需要特殊字符,这一方法不是完整的防护方法
- 最佳的选择是使用安全的
- 将不可信的数据从命令及查询中区分开
- 失效的身份认证和会话管理
- 威胁代理:任何匿名的外部攻击者和拥有帐号的用户都可能视图盗取其他用户帐号,同样也会有内部人员为了掩饰他们的行为而这么做
- 攻击向量:攻击者使用认证或会话管理功能中的泄漏或漏洞(比如暴露的账户、密码或会话ID)来假冒用户
- 安全漏洞:开发者通常会建立自定义的认证和会话管理方案,但要正确实现这些方案却很难,结果这些自定义的方案往往在如下方面存在漏洞:退出、密码管理、超时、记住我、秘密问题、账户更新等等
- 技术影响:这些漏洞可能导致部分甚至全部账户遭受攻击,一旦成功,攻击者能执行受害用户的任何操作,因此特权账户是常见的攻击对象
- 漏洞检测
- 以下情况可能产生漏洞
- 用户身份验证凭证没有使用哈希或加密保护
- 认证凭证可以猜测,或者能通过薄弱的账户管理功能(例如账户创建、密码修改、密码恢复、弱会话ID)重写
- 会话ID暴露在
URL
中 - 会话ID容易受到会话固定(
session fixation
)的攻击 - 会话ID没有超时限制,或者用户会话或身份验证令牌特别是单点登录令牌在用户注销时没有失效
- 成功注册后,会话ID没有轮转
- 密码、会话ID和其他认证凭据使用未加密连接传输
- 漏洞防护
- 对企业最主要的建议是让开发人员使用如下资源
- 一套单一的强大的认证和会话管理控制系统,这套控制系统应满足:
OWASP
的应用程序安验证标准- 具有简单的开发界面
- 同样需要避免跨站漏洞,这一漏洞也可用于盗窃用户会话ID
- 一套单一的强大的认证和会话管理控制系统,这套控制系统应满足:
- 对企业最主要的建议是让开发人员使用如下资源
- 跨站脚本(
XSS
)- 威胁代理:任何能够发送不可信数据到系统的人,包括外部用户、内部用户和管理员
- 攻击向量:攻击者利用浏览器中的解释器发送基于文本的攻击脚本,几乎所有数据源都能成为攻击媒介,包括内部数据源,比如数据库中的数据
- 安全漏洞:
XSS
是最普遍的Web
应用安全漏洞,当应用程序发送给浏览器的页面中包含用户提供的数据,而这些数据没有经过适当的验证或转义(escape
),就会导致跨站脚本漏洞,有三种已知的跨站漏洞类型:- 存储式
- 反射式
- 基于
DOM
的XSS
- 技术影响:攻击者能在受害者的浏览器中执行脚本以劫持用户会话、破坏网站、插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器等
- 漏洞检测
- 自动化工具能够自动找到一些跨站脚本漏洞,然而,每一个应用程序使用不同的方式生成输出页面,并且使用不同的浏览器端解释器,例如
JavaScript
,ActiveX
,Flash
和Silverlight
,这使得自动检测变得很困难,因此需要同时采用人工代码审计和手动渗透测试
- 自动化工具能够自动找到一些跨站脚本漏洞,然而,每一个应用程序使用不同的方式生成输出页面,并且使用不同的浏览器端解释器,例如
- 漏洞防护
- 防止
XSS
需要将不可信数据与动态的浏览器内容区分开,需要确保发送给浏览器的所有用户提供的输入都经过了恰当的转义(escape
),或者在这些内容被显示在页面之前已经验证它们通过输入验证都是安全的,输出内容也经过恰当的转义或验证- 最好的方法是根据数据将要置于的
HTML
上下文(包括主体、属性、JavaScript
、CSS
或URL
)对所有的不可信数据进行恰当的转义(escape
) - 使用正面的或白名单的,具有恰当的规范化和解码功能的输入验证方法同样有助于防止跨站脚本,但由于很多应用程序在输入中需要特殊字符,这一方法不是完整的防护方法,这种验证方法需要尽可能地解码任何编码输入,同时在接受输入之前需要充分验证数据的长度、字符、格式和任何商务规则
- 最好的方法是根据数据将要置于的
- 防止
- 不安全的直接对象引用
- 威胁代理:考虑系统的用户类型,对于某些系统数据类型,是否有的用户只具有部分访问权限
- 攻击向量:作为授权的系统用户,攻击者只需要修改指向一个系统对象的直接引用参数值,让其指向另一个无权访问的对象
- 安全漏洞:当生成
Web
页面时,应用程序经常使用对象的实名或关键字,而应用程序并不会每次都验证用户是否具有权限访问该目标对象,这就导致了不安全的直接对象引用漏洞,测试者可以轻易操作参数值以检测该漏洞,代码分析能很快显示应用程序是否进行了适当的权限验证 - 技术影响:这种漏洞能破坏通过该参数应用的所有数据,除非对象引用是不可预知的,否则攻击者很容易访问该类型的所有数据
- 漏洞检测
- 验证应用程序所有的对象引用是否具有适当的防御能力
- 对于被保护的资源的直接引用,应用程序是否未能验证用户有权限访问他们所请求的具体资源
- 如果该引用是间接引用,那么应用程序是否未能保证,该间接引用只能映射到授权给当前用户访问的直接引用的值
- 验证应用程序所有的对象引用是否具有适当的防御能力
- 漏洞防护
- 要防止不安全的直接对象引用,需要选择一个适当的方法来保护每一个用户可访问的对象(如对象号码、文件名)
- 使用基于用户或者会话的间接对象引用,这样能防止攻击者直接攻击未授权资源
- 检查访问,任何来自不可信源的直接对象引用都必须通过访问控制检测,确保该用户对请求的对象有访问权限
- 要防止不安全的直接对象引用,需要选择一个适当的方法来保护每一个用户可访问的对象(如对象号码、文件名)
- 安全配置错误
- 威胁代理:考虑外部的匿名攻击者和拥有自己账户的内部用户都可能会视图破坏系统,另外考虑想要掩饰他们的攻击行为的内部攻击者
- 攻击向量:攻击者访问默认账户、未使用的网页、未安装补丁的漏洞、未被保护的文件和目录等,以获得对系统未授权的访问或了解
- 安全漏洞:安全配置错误可以发生在一个应用程序堆栈的任何层面,包括平台、
Web
服务器、应用服务器、数据库、框架和自定义代码,开发人员和系统管理员需共同努力,以确保整个堆栈的正确配置,自动扫描器可用于检测未安装的补丁、错误的配置、默认账户的使用、不必要的服务等 - 技术影响:攻击者可以访问一些未授权的系统数据或功能,有时可导致系统的完全攻破
- 漏洞检测
- 检测应用程序是否对整个程序堆栈实施了恰当的安全加固措施
- 是否有软件没有及时更新,这包括操作系统、
Web
/应用服务器、数据库管理系统、应用程序和其他所有的代码库文件 - 是否使用或安装了不必要的功能(例如 端口、服务、网页、账户、权限)
- 默认账户的密码是否仍然可用或没有更改
- 你的错误处理设置是否防止堆栈跟踪和其他含有大量信息的错误消息被泄漏
* 你的开发框架(比如:Struts
、Spring
、ASP.NET
)和库文件中的安全设置是否理解正确并配置恰当
- 是否有软件没有及时更新,这包括操作系统、
- 检测应用程序是否对整个程序堆栈实施了恰当的安全加固措施
- 漏洞防护
- 一个可以快速且易于部署在另一个锁定环境的看重复的加固过程,开发、质量保证和生产环境都应该配置相同(每个环境中使用不同密码)
- 一个能及时了解并部署每个已部署环境的所有最新软件更新和补丁的过程
- 一个能在组件之间提供有效的分离和安全性的强大应用程序架构
- 实施漏洞扫描和经常进行审计以帮助检测将来可能的错误配置或没有安装的补丁