跨站脚本攻击
- 1. 定义
- 2. 跨站脚本攻击如何工作
- 3. 跨站脚本攻击类型
- 4. 如何防止跨站脚本攻击
1. 定义
跨站脚本攻击(Cross-site Scripting,通常称为XSS),是一种典型的Web程序漏洞利用攻击,在线论坛、博客、留言板等共享平台是跨站脚本攻击的典型目标。
攻击者利用Web程序对用户输入检查不足的漏洞将可执行恶意脚本注入网站或Web应用,当用户访问网页时触发恶意脚本的执行,从而达到窃取用户个人数据、弹出广告,甚至篡改网页内容等攻击目的。
与其他Web攻击类型不同,跨站脚本攻击是一种客户端代码注入攻击,恶意脚本在前端浏览器或Web应用程序等客户端侧执行,而非在后端服务器或数据库执行,最终受害者是访问用户。
2. 跨站脚本攻击如何工作
跨站脚本攻击的基本原理是攻击者操纵存在漏洞的网站,向用户返回恶意脚本达成攻击目的,主要过程如下:
- 攻击者发现存在漏洞的网站,然后利用漏洞在网页中注入恶意脚本。
凡是对用户输入限制不够严格的网站都可能发生脚本注入。恶意脚本通常是JavaScript ,当然也可以是Java、VBScript、ActiveX、Flash等。
- 当用户访问网站时,恶意脚本被加载到浏览器中并触发执行。
触发恶意脚本执行的方法有很多种,例如,引诱用户点击链接,或当网页加载或用户鼠标停留在网页的特定元素上时自动触发脚本执行。
- 恶意脚本访问浏览器留存的Cookie、会话令牌以及其他敏感信息,甚至可以改写页面内容,从而达成攻击目的。
攻击者通过窃取的用户Cookie就可以冒充用户,执行用户能够执行的操作,窃取用户身份信息、泄露用户文件等。另外攻击者还可以利用跨站脚本传播恶意软件、破坏网页内容、进行网络钓鱼等,实施更具破坏性的攻击。
3. 跨站脚本攻击类型
(1)反射型跨站脚本攻击
反射型跨站脚本攻击是最常见和最简单的攻击形式。所谓反射,是指此种类型的注入脚本必须被包含在发往Web服务器的请求中,然后Web服务器以某种方式反射到用户浏览器执行。也就是注入脚本作为客户端的请求提交给Web服务器,服务器解析后在响应消息中返回脚本由浏览器执行。因此攻击者需要使用钓鱼邮件、弹窗链接以及其他社会工程学方法引诱用户点击链接向Web服务器发出请求。
攻击者往往在合法的URL末尾添加恶意代码构造链接,例如:
https://example.com/index.php?user=<script>恶意代码</script>
用户点击此链接后,因为浏览器信任该网站,将执行恶意脚本代码。
从以上介绍可以看出,这种攻击类型Web服务器端无需存储注入脚本,直接通过HTTP GET或POST请求就可以完成攻击,实施比较简单。但是这种攻击方式需要由每个受害者触发才能发生攻击,往往也称为非持久型跨站脚本攻击。
(2)存储型跨站脚本攻击
存储型跨站脚本攻击也称为持久型跨站脚本攻击,是一种最具破坏性的跨站脚本攻击。注入的脚本永久存储在Web服务器上,如数据库、内存或文件系统中。只要注入脚本代码没有被清理,每次用户访问网页时都将加载恶意脚本。
存储型跨站脚本攻击一般发生在论坛、博客、留言板等允许用户共享内容的网站,如果网站存在漏洞,未严格校验用户输入内容就可能被攻击者利用。攻击者利用发帖、评论、修改个人信息等功能提交恶意脚本代码到Web服务器进行保存,那么只要访问对应网页的用户都会在不知情的情况下读取恶意脚本。
相对于反射型跨站脚本攻击,存储型跨站脚本攻击影响范围更大,危及所有访问者。当然这种攻击方式也更难执行,攻击者需要找到可以利用的漏洞。
(3)基于DOM的跨站脚本攻击
基于DOM(Document Object Model,文档对象模型)的跨站脚本攻击是一种更高级的攻击形式,通过篡改DOM注入恶意脚本。DOM提供对文档结构化的描述,并将HTML页面与脚本、程序语言联系起来,当网页被加载时,浏览器会创建页面的文档对象模型DOM。Web程序的客户端侧JavaScript脚本可以对DOM进行编辑从而动态修改网页内容,也就是从DOM获取数据然后在用户本地执行。在这个过程中,如果数据处理不当,攻击者就可以将恶意脚本注入DOM,然后读取DOM数据时触发攻击。经常被利用的DOM对象包括URL (document.URL)、URL 锚点部分 (location.hash) 和 Referrer (document.referrer)。
基于DOM的跨站脚本攻击与反射型、存储型跨站脚本攻击有很大不同,整个攻击过程均在用户侧浏览器执行,无需Web服务器端进行解析和响应访问请求。这种类型的攻击比较难排查,WAF设备无法获取通信流量,可能难以发现攻击。
4. 如何防止跨站脚本攻击
从Web程序开发角度,需要遵循安全开发原则,采取措施防止跨站脚本攻击:
- 对用户输入进行验证和过滤,验证输入是否符合预期格式,过滤掉一些特殊字符和标签(例如
<script>
)避免注入恶意脚本。 - 对用户输入进行转义,也就是将用户输入呈现给用户之前确保对其进行转义,例如将
“>”
转义为“>”
,这样可以防止接收到的输入中的一些字符被解释为可执行代码,使恶意脚本失效。 - 对Cookie采取安全措施,例如设置
HttpOnly Cookie
属性防止JavaScript读取Cookie,避免用户身份验证令牌和敏感信息被窃取。 - 使用HTTP的响应头CSP(Concent Security Policy,内容安全策略)限制哪些资源可以被加载和执行,例如限制JavaScript的来源,从而防止恶意脚本注入。
- Web程序开发需要遵循OWASP的Cross Site Scripting Prevention Cheat Sheet(跨站脚本攻击预防备忘录),继承已有经验。
- 对Web程序进行渗透测试,加固跨站脚本漏洞。
从访问网站的用户角度,需要有风险意识,避免遭受跨站脚本攻击:
- 在浏览器中设置禁用脚本。
- 避免点击电子邮件、论坛中的不明链接。
- 及时更新软件及操作系统补丁。
- 安装杀毒软件。