本部分,我们将解释什么是跨站脚本,描述各种类型的跨站脚本漏洞的不同点,并阐明如何查找和防止跨站脚本。
什么是跨站脚本 (XSS)
跨站脚本是一种允许攻击者破坏用户与易受攻击的应用程序之间交互的网页安全漏洞。它允许攻击者规避相同的同源策略,该策略旨在将不同的网站彼此隔离。跨站脚本漏洞通常允许攻击者伪装成受害者用户,执行用户可以执行的任何操作以及访问用户的任何数据。如果受害者用户具有在应用程序中的特权访问,那么攻击者可能完全控制应用程序的功能和数据。
跨站脚本是如何工作的
跨站脚本通过操纵易受攻击的站点来工作,以便将恶意的 JavaScript 返回给用户。当恶意代码在受害者的浏览器执行时,攻击者可以完全破坏他们与应用程序的交互。

跨站脚本攻击类型有哪些
跨站脚本主要有以下三种类型:
- 反射型 XSS:恶意脚本来自当前的 HTTP 请求;
- 存储型 XSS:恶意脚本来自站点数据库;
- DOM 型 XSS:漏洞存在于客户端代码而不是服务端代码
反射型 XSS
反射型 XSS 是形式最简单的跨站脚本。当应用程序在 HTTP 请求中接收数据并将该数据以不安全的方式包含在即时响应中时,就会出现这种情况。
这里有一个反射型 XSS 的简单示例:
https://insecure-website.com/status?message=All+is+well.
<p>Status: All is well.</p>
应用程序没有做任何其他的数据处理,因此攻击者很容易构造如下攻击:
https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>
<p>Status: <script>/* Bad stuff here... */</script></p>
如果受害者访问由攻击者构造的 URL,并且该用户与应用程序的会话上下文存在于浏览器中,该恶意脚本将会执行。此时,脚本可以执行用户有权访问的任何操作并检索任何数据。
Read more:
Reflected XSS
Cross-site scripting contexts
Cross-site scripting (XSS) cheat sheet
存储型 XSS
当应用程序从未受信任的输入源接收数据,并以不安全的方式将数据包含在随后的 HTTP 响应中,就会导致存储型 XSS。
有问题的数据可能会通过 HTTP 请求提交给应用程序;例如,对博客帖子的评论,聊天室中的用户昵称或客户订单上的联系方式。其他情况,数据可能来自其他不受信任的来源;例如,显示通过SMTP接收消息的Webmail应用程序,显示社交媒体帖子的营销应用程序或显示来自网络流量的数据包数据的网络监视应用程序。
这是一个存储的XSS漏洞的简单示例。留言板应用程序使用户可以提交消息,并显示给其他用户:
<p>Hello, this is my message!</p>
该应用程序不执行任何其他数据处理,因此攻击者可以轻松发送一条攻击其他用户的消息:
<p><script>/* Bad stuff here... */</script></p>
Read more:
Stored XSS
Cross-site scripting contexts
Cross-site scripting (XSS) cheat sheet
DOM 型 XSS
当应用程序客户端侧包含一些以不安全的方式处理未受信任的输入源的 JavaScript 脚本时,脚本通常以 DOM 的形式返回写入的数据,这样会造成 DOM 型 XSS。
在下面的示例中,应用程序使用一些 JavaScript 来从输入字段读取值并将该值写入 HTML 中的元素:
var search = document.getElementById('search').value;
var results = document.getElementById('results');
results.innerHTML = 'You searched for: ' + search;
如果攻击者可以控制输入字段的值,则他们可以轻松构造一个恶意值,该恶意值导致自己的脚本执行:
You searched for: <img src=1 onerror='/* Bad stuff here... */'>
在典型情况下,输入字段将从 HTTP 请求的一部分(例如 URL 查询字符串参数)填充,从而允许攻击者以与所反映的 XSS 相同的方式使用恶意URL进行攻击。
Read more:DOM-based XSS