面向医学信息系统的XSS攻击与防御
2022-11-16马远伟李炜玥陈俊名李帅
马远伟 李炜玥 陈俊名 李帅
(工业和信息化部电子第五研究所 广东省广州市 510370)
随着信息技术和人工智能技术的迅速发展,以及国家号召信息化转型,以电子病历系统为代表的医学行业信息系统逐步并入互联网,为医学行业的信息传输和管理提供更加现代、科学、规范、便捷的服务,如:医生工作站系统、互联网医疗系统、挂号小程序、在线报告和预约系统、护理信息系统、检验信息系统、放射信息系统、医疗影像存储与传输系统以及电子病历系统[6]等。信息系统和应用在给用户带来方便同时,也隐藏着诸多安全隐患,相较典型的就是XSS 攻击。开放式Web 应用程序安全项目(OWASP)组织在2007 年、2010 年和2013 年发布的三版十大Web 安全漏洞报告中,XSS 漏洞稳居前三[7],直到2017 年发布的版本才有所下降。XSS 攻击除去影响应用服务本身外,更直接危害到访问应用服务的用户。本文从保证网站运行安全角度对XSS 攻击原理及其利用场景进行分析,并提出从外部环境防御、输入过滤、输出编码三个方面协同切断XSS 攻击利用链的防御手段。
1 XSS漏洞简介
跨站脚本(Cross Site Scripting,XSS)指攻击者向Web页面插入恶意HTML(HyperText Markup Langauge)代码,当用户浏览该页面时,嵌入到Web 中的HTML 代码会被执行,从而达到攻击者的特殊目的[1]。此类漏洞是指在Web应用中,因缺少对客户端数据的正确验证,导致向其他客户端提供错误执行代码的漏洞[2]。漏洞的本质是攻击者利用用户输入输出内容过滤不足或网站过滤机制缺陷,将恶意HTML 代码和动态脚本代码嵌入到缺陷的网页中。当服务器响应用户请求的被植入了攻击代码的网页时,浏览器经过解析这些响应内容,响应中注入的恶意代码就会被浏览器执行,从而达到攻击并控制用户浏览器的目的。从攻击技术角度,XSS 针对的是bs(browser/server)架构中的浏览器端;从漏洞角度,XSS 漏洞利用的触发点在浏览器,无论是原始输入,还是由服务器输出的内容,其内部包含的脚本(内置或引用)内容都会被浏览器解析并执行。
2 XSS漏洞分类及原理分析
XSS 漏洞的表现形式各种各样,依据漏洞的攻击手法可将XSS 漏洞划分为:反射型(Reflected)、存储型(Stored)以及DOM 型(DOM)。
2.1 反射型XSS
反射型XSS 也称参数型跨站脚本攻击,是在医学信息系统中最常见且使用最广泛的跨站脚本攻击。反射型XSS需要攻击者将恶意的攻击脚本植入URL 链接的请求中,当用户访问了包含恶意参数值的URL,便会触发XSS 攻击。反射型XSS 攻击载荷不会写入医学信息系统的数据库或文件系统中,因此需要黑客通过特定手段(如电子邮件)诱使受害者访问包含了攻击载荷的链接。当受害者点击相应链接时,攻击者植入的脚本代码就会在受害者主机的浏览器或WEBVIEW 上执行。最为常见的包含攻击载荷的攻击链接如以下URL:http://www.test.com/search.php?key=”>。攻击场景体现为在用户的浏览器内发起一个内容为“XSS”的警告框。反射型XSS 漏洞攻击流程如图1 所示。
图1:反射型XSS 攻击流程
2.2 存储型XSS
存储型XSS(持久性跨站脚本)比反射型XSS 威胁性更大,可影响到医学信息系统服务器的自身安全,在特殊场景下可造成远程代码执行同等效果。此类型XSS 不需要用户点击特定的URL,攻击者只需事先将恶意脚本代码上传或存储到服务器中,受害者一旦浏览包含此恶意代码的页面,攻击代码就会自动在他们的浏览器上执行。因攻击代码固化到了服务器上,容易被网络管理员发现,其隐蔽性不如反射型XSS。
如攻击者在表单或上传的html 文件中编写一段攻击型代码“’”/><’””并提交,此攻击代码会被存储到服务器的数据库中,当其他用户取出数据显示时,用户的浏览器将会执行这些攻击性代码。攻击流程如图2 所示。
图2:存储型XSS 攻击流程
2.3 DOM型XSS
从攻击方式上来说DOM 型XSS 既属于反射型XSS 也属于存储型XSS,属于漏洞利用的方向之一。因为形成的原因比较特别,其特征主要为通过修改了页面的DOM 节点从而形成XSS[8],有了区分于反射和存储直接攻击的间接性漏洞触发点,故单独划分出来称为DOM 型XSS。编写网页时,经常会用到各种DOM 对象,如document.referer、document.write 等。DOM 型XSS 攻击的输出点就位于DOM 对象上,当用户能够通过交互修改浏览器页面中DOM 对象并显示在浏览器上时,就可能存在这种漏洞。
DOM 型XSS 的攻击代码不需要服务器解析响应,触发XSS 靠的是浏览器端的DOM 解析[9]。攻击流程如图3 所示。
图3:DOM 型XSS 攻击流程
3 XSS漏洞利用场景研究
随着越来越多的企业和医疗机构加入到医疗信息化的建设浪潮中,数据的经济价值驱使不法分子铤而走险,医疗信息安全问题逐渐凸显。由于医疗行业等机构的特殊性,一旦医疗信息系统数据被泄露,将会给国家和公民的信息安全带来严重威胁。
在进行XSS 漏洞测试时,安全人员通常会使用一些无害的攻击向量(如“alert(1)”)来证明漏洞的存在,并未真实反映出漏洞的危害性。事实上,攻击者可以基于XSS 漏洞进行Cookie 窃取攻击、点击劫持攻击、跨域请求伪造、网络钓鱼攻击、窃取搜索历史、客户端信息刺探等众多攻击行为。
XSS 漏洞产生的危害与具体的业务场景密切相关。业务场景的差异,使得可能产生的安全问题和造成的危害也不尽相同。漏洞的危害程度主要取决于当前场景的触发点、触发方式、影响面以及危害对象。测试工程师能够客观评估前两者,但往往很难描述具体场景危害定义,无法正确评估漏洞的危害。本文基于DVWA 平台搭建了一个统一的医学信息系统漏洞靶场平台和攻击载荷平台,当受害者触发漏洞页面的hook 链接http://evil_server/hook.js 时,攻击者会基于攻击场景和攻击目的向受害者主机发送不同的攻击载荷,攻击载荷在受害者主机被执行后将攻击结果返回给攻击者。本文涉及的不同场景下XSS 利用流程如图4 所示。
图4:不同场景下XSS 利用流程
3.1 通用场景
3.1.1 网站Cookie 获取
HTTP 作为无状态协议,会话的状态保存一直是个难题,虽然TOKEN 的验证方式逐渐流行,但当下Web 系统识别用户身份和保存会话状态的主要机制依旧是Cookie。服务器将用户ID、身份信息、访问次数等信息保存在会话中,生成Cookie 作为标识并发送到客户端持久化存储,以便应用服务能够在多个会话之间区分不同身份的用户,实现身份区分、会话状态确认等应用场景。Cookie 技术的出现大大加强了用户体验度和方便性,但也带来一些安全风险。由于Cookie 保存在客户端,所以随时可能被盗取或滥用,如果医学信息系统的Cookie 中包含身份认证等个人敏感信息[3],那么攻击者就可以通过窃取Cookie 从而欺骗服务器,伪装成受害者的账户。
由于患者预约信息、检查检验信息、就诊信息、医学数据等信息涉及公民隐私、医患关系、医院运作和发展等多因素,此类数据敏感度相对较高,一旦被攻击者获取将会给国家和社会的稳定和发展带来严重影响。如图4 所示。
若攻击者通过特定手法(如电子邮件、手机短信)诱使医学信息系统工作人员去访问一个包含恶意代码的URL,链接一旦被点击,URL 中包含的恶意代码会直接在受害者的浏览器中执行[10]。
例如Cookie 获取语句http://evil_server/xss‐scri
pts?id=123;location.href="http://jump_server/cookie.php?cookie="%2bdocument.cookie 在受害者浏览器执行后,将会自动拼接当前网站内受害者的Cookie 信息,跳转到攻击者服务器。当攻击者获取到信息系统的Cookie 信息后,可基于该Cookie 信息与医学信息系统建立会话,以受害者身份访问系统应用,最终达成伪装受害者与服务器通信的目的。
针对攻击脚本较小的XSS 攻击场景如Cookie 获取,攻击者既可以将包含漏洞页面和传送Cookie 攻击代码植入统一URL 中;也可以在漏洞页面插入hook 链接(如//evil_server/attack.js),当用户触发hook 链接时,攻击者再装载相应的攻击载荷发送给受害者。
3.1.2 网页挂马
网页挂马是攻击者在正常页面中(通常是网站的主页)插入一段文件下载代码,在受害者打开该页面时,直接下载或诱导受害者下载并运行木马程序,进而实控制受害者主机的目的[4]。
许多情况下,攻击者可以在受害者不知道的情况下发起。为使攻击请求看起来不那么可疑,攻击者会通过Flash 更新、ActiveX 安装进行伪装。攻击者经常使用各种方法对攻击的恶意部分进行编码,即使细心的用户也难以察觉。
图5 为医学信息系统漏洞靶场平台存在存储型XSS 漏洞的代码片段,除对用户输入的message 和name 参数进行特殊字符添加反斜杠进行转义外,未采取其他额外过滤方式,并在最后将用户输入的内容插入到数据库中。
图5:漏洞代码片段
攻击者可以在漏洞页面插入网页木马并指向木马托管服务器。如平台用户打开该页面,则会弹出Flash 更新伪装页面(如图6),无论受害者是否点击确认按钮都会触发网页木马下载。工作人员在粗心大意之下,可能会将此作为正常的更新程序打开,进而导致设备被攻陷。本场景中的远程木马服务器就是前文提到的医学信息系统攻击载荷平台。
图6:Flash 更新伪装
3.2 定制化利用场景
3.2.1 定制钓鱼页面
医学信息系统中存在的诸多安全风险一旦被攻击者利用,轻则泄露基本信息,严重可导致服务器沦陷,更为严重则是网页被植入恶意代码,使整个医学信息系统干系人受到侵害。除Cookie 获取、网站挂马等利用场景外,攻击者还可能利用XSS 漏洞进行登录页面伪造或二次密码验证伪造进行钓鱼攻击。此种场景是依托于官方正规网站,比常见的钓鱼手段更加隐蔽和难以识别。
本节以二次密码验证伪造为例分析定制化钓鱼攻击,当用户访问攻击者在漏洞页面插入的hook 链接时,攻击载荷平台会返给用户伪造的二次密码验证页面代码,经用户浏览器渲染后弹出,并实时将用户输入的账号和密码信息回传到攻击者服务器,进而完成账号窃取。以图5 漏洞代码为例,定制二次密码验证伪造页面,收集该网站用户的用户名和密码信息。
用户访问此页面时,除伪造的弹框,无论是域名还是页面内容信息,都来自于网站官网,伪造的页面可信度极高。
为欺骗用户并逃避检测,定制钓鱼页面场景不断朝着真实化发展,包含医学信息系统用户和开发人员在内的XSS攻击受害者,不会意识到自己正在受到攻击,因为通常情况下无法分辨服务器返回页面是否遭到了XSS 攻击的篡改。
3.2.2 屏幕截图
随着信息化技术的进步,前端技术的支持面越来越广泛。这些技术同样可以用于黑客攻击,攻击者可以利用html5 的canvas 绘画技术进行攻击,对医学信息系统用户浏览的当前页面进行屏幕截屏,取得类似于远程控制木马的查看对方屏幕功能。此种攻击方式可绕过HTTP‐Only 防护,丰富攻击者收集可用以进一步入侵系统的敏感信息或窃取当前用户身份信息等目的。
首先远程引入html2canvas.js 插件,基于该插件把抓取到的屏幕图片代码传输和接收。攻击过程中受害者主机提交表单数据给攻击者,攻击者收到受害者屏幕截图URL 数据流后即可解码查看相应的图片内容。
3.2.3 键盘监听
由于使用者安全意识的逐步增强,会对医学信息系统的关键目录进行二次密码验证,并对用户输入内容采取加密传输的方式进行防护。在这种特定情况下,即使攻击者通过XSS 或其他漏洞进入到信息系统后台,在无法破解加密算法的场景下,使用爆破的攻击方式也无法获取到关键目录的访问密码。因此基于XSS 漏洞进行键盘监听,抓取管理员输入的二级密码成为可行的攻击方案。
键盘监听的原理主要是通过受害者访问已经被插入XSS代码的页面,触发JS 脚本,通过利用键盘事件记录受害者在当前医学信息系统的键盘操作并传输到攻击者的接收网站。当受害者在二次密码验证页面输入账号信息时,攻击者即可同步在服务端监听获取到受害者的键盘记录。
3.2.4 内网刺探
AJAX 是一种独立于Web 服务器的Web 浏览器技术,可以在不刷新整个网页的情况下,采用浏览器与Web 服务器之间异步数据传输的方式,向服务器请求并更新少量信息。自AJAX 技术的出现,基于此技术的Web 应用井喷式的发展,而此技术不仅方便了开发者和用户,同时对于攻击者而言,这也相当于扩展了一个攻击面。由于AJAX 发起的请求基于当前浏览器,攻击者则可由用户端浏览器代理,通过AJAX刺探主机内网环境或者外部网站发起AJAX 请求来探测目的地址的存活资源以及内容。
设想这样一种场景:受害者A 是医学信息系统工作人员,受害者A 的主机可以基于浏览器访问该单位的内网资源和互联网开放资源;受害者A 登录医学信息系统后,又去浏览被攻击者插入XSS 代码的网站B。那么当受害者A 访问网站B 中插入XSS 代码的网站时,攻击脚本能够在不刷新整个网页的情况下嗅探受害者A 主机所在局域网的内网资源,并将嗅探结果传回攻击服务器以反馈给攻击者。
3.3 特殊场景
前几节构建的攻击场景为常规攻击场景,危害具有一定的局限性,无法完全体现XSS 漏洞的威胁程度。由于XSS漏洞的攻击目标通常为用户,缺乏直接攻击服务器的手段,医学信息系统运营者在考虑运营成本的情况下信息系统安全方面投入较少,不幸的是这将会置用户于严重风险中。在本场景内设计如下条件:受害者正在使用老旧的Windows 版微信(Windows 版微信<=3.2.1.141)或Google Chrome 浏览器(Google Chrome<=89.0.4389.114,开启‐‐no‐sandbox 无沙盒模式)访问被攻击者以XSS 漏洞形式植入攻击代码的医学信息系统,当受害者访问漏洞页面后,加载漏洞CNVD‐2021‐27989 针对Chrome 的远程代码执行攻击代码,绕过浏览器的安全机制,并在受害者电脑上执行任意代码。
当医学信息系统工作人员在微信内点击URL 链接时系统会调用微信内置浏览器(chrome 内核,并开启了‐‐no‐sandbox 参数)。针对chrome 漏洞的利用代码成功执行后,shellcode 会启动远控进程,使攻击者能够执行任意远程代码,如图7 所示。
图7:微信RCE 场景
此场景中,受害者仅是使用了未及时更新的浏览器访问网站,在全程无感的情况下被攻击者控制。假设医生工作站系统、互联网医疗系统、挂号小程序、在线报告和预约系统、护理信息系统、检验信息系统、放射信息系统、医疗影像存储与传输系统以及电子病历系统[6]等此类影响重大的医学信息系统存在XSS 漏洞,而因医学行业的特殊性,访问此类系统的用户可能来自于各行各业,且涉及大量的生物识别信息甚至是工作的身份信息,攻击者一旦通过此漏洞植入了攻击页面,便可导致访问此医学信息系统的用户电脑均被攻击者控制,带来难以估量的危害。在大量的局域网服务中,因为业务应用开发较早,通常会对用户使用的浏览器进行限制,甚至推荐使用老旧浏览器(如IE6),故本场景在内网环境中较为常见。
4 XSS漏洞攻击防御
XSS 漏洞是众多医学信息系统漏洞中一种危害极大且影响极为广泛的漏洞[5]。攻击者通过混淆、伪造代码等手段来躲避防护系统的检测,将代码植入信息系统应用的页面,从而达到攻击用户的目的[5]。一旦系统遭受到XSS 攻击可能导致如用户数据被盗、帐户接管以及非法访问医学信息系统重要数据等致命威胁。几十年来,XSS 攻击变得越来越普通,因此检测XSS 漏洞有更大的挑战性。
针对XSS 漏洞的检测和防御,建议从服务器与客户端两方协同开展检测防御工作,可以从外部环境防御、输入过滤、输出编码三个方面协同切断XSS 攻击利用链。
(1)外部环境防御:使用具备防护功能的浏览器,使用安全的服务端配置项。
(2)输入过滤:对用户提交的数据进行有效性验证,仅接受符合我们期望格式和长度的内容提交,配合替换、移除、编码等措施过滤其他无关数据保障输入过滤防护效果。如:常见的敏感字符(如[]()`<>’”)、特殊的HTML 标签(script)、DOM 事件的标签。
(3)输出编码,当需要将一个字符串输出到Web网页时,严格禁止“事件”,并对危险标签进行过滤。为确保输出内容的完整性和正确性,可以对字符串中不确定的XSS 特殊字符(如< > &’”等)进行编码(HTML Encode)防护。
就当前互联网环境来说,基于输入的过滤比基于输出的过滤要好做很多,因为基于输入的过滤还能够同时起到过滤“SQL 注入”的目的,在不是特别有需要的情况下,可以结合外部环境防御和基于输入或者基于输出的过滤器进行XSS攻击防御。
5 总结
信息化时代,云计算、大数据、人工智能等新一代信息技术的发展和应用逐渐走向成熟,在带给企业全新发展机遇的同时,也对企业的信息化建设提出了极大的挑战。XSS 攻击对于医学信息系统的威胁不容小觑,其不仅可能导致重要医学数据的泄漏,还可能造成服务器瘫痪[11]。为更加有效防范XSS 攻击,本文就XSS 漏洞进行XSS 漏洞分类和原理分析,基于DVWA 开源框架构建了包含XSS 漏洞的医学信息系统漏洞靶场平台和攻击载荷平台,通过模拟XSS 漏洞在“通用场景”、“定制化场景”和“特殊场景”三个方面进行场景搭建和攻击研究,深入浅出的说明XSS 漏洞威胁的引发的严重后果,并从服务器与客户端协同检测和防御的角度,提出从外部环境防御、输入过滤和输出编码三方面协同切断XSS 攻击利用链。
一直以来工业界和学术界对XSS 检测和缓解方面进行了大量的实践和研究,本文提出了一些有效的XSS 攻击防御技术,学术界也提出使用监督学习、无监督学习、强化学习、深度学习和元启发式算法检测XSS 攻击的方法。相关技术人员必须认识到,XSS 攻击方式多种多样,必须在充分理解XSS 攻击机制的前提下,结合不同运行环境、场景,采用不同的防御方式提升防御效果。