首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Session 安全攻擊面全解析:劫持、固定、注入與防禦實戰

     編輯:PHP 相關知識

PHP Session 安全攻擊面全解析:劫持、固定、注入與防禦實戰

Session 是 PHP 有狀態應用的核心機制,但也是攻擊重點。本文系統分析 Session 劫持、固定、注入、檔案存取等攻擊向量,提供完整防禦配置與代碼最佳實踐。

攻擊向量一:Session 劫持

手法

  • 網路竊聽:HTTP 明文傳輸 Session ID (Cookie)
  • XSS 竊取:document.cookie 讀取 PHPSESSID
  • 中間人攻擊:公共 Wi-Fi、ARP 欺騙攔截

防禦

; php.ini
session.cookie_httponly = 1    ; 禁止 JS 存取 Cookie
session.cookie_secure = 1      ; 僅 HTTPS 傳輸 (必須全站 HTTPS)
session.use_only_cookies = 1   ; 禁用 URL 傳遞 Session ID
  • 全站強制 HTTPS (HSTS)
  • 敏感操作二次驗證 (重新輸入密碼、2FA)

攻擊向量二:Session 固定攻擊

原理

攻擊者預先取得有效 Session ID (如 PHPSESSID=abc123),誘導受害者使用此 ID 登入 (連結含 ?PHPSESSID=abc123),受害者登入後 Session 綁定用戶身分,攻擊者同樣 ID 即獲得權限。

防禦

; php.ini
session.use_strict_mode = 1    ; 拒絕未初始化的 Session ID (PHP 5.5+)

攻擊向量三:Session 變數注入 / 覆蓋

原理

register_globals=On 時,$_GET['username'] 可覆蓋 $_SESSION['username']。即使關閉,若代碼邏輯先檢查 $username 再註冊 Session,攻擊者可在註冊前注入。

防禦

  • register_globals = Off
  • 明確使用 $_SESSION['var'],不依賴全域變數
  • Session 變數命名加前綴:$_SESSION['app_user_id']

攻擊向量四:共享主機 Session 檔案存取

原理

預設 session.save_path = /tmp,所有用戶 Session 檔案同目錄,權限通常 600 但屬於同一用戶 (如 www-data),其他虛擬主機用戶可讀寫:

  • 讀取敏感 Session 資料 (用戶 ID、權限、購物車)
  • 寫入惡意 Session 檔案,配合包含漏洞執行代碼
  • 猜測 Session ID 範圍進行暴力枚舉

防禦

; php.ini 或 PHP-FPM pool 設定
session.save_path = /var/lib/php/sessions_隔離目錄
; 目錄權限 700,擁有者為該站點執行用戶
  • 使用 Redis/Memcached 儲存 Session (原子操作、天然隔離、高效能)
  • session.save_handler = redis、session.save_path = "tcp://127.0.0.1:6379"

攻擊向量五:Session 反序列化注入

原理

PHP Session 預設使用 php_serialize (PHP 5.5.4+) 或 php 處理器序列化。若應用有 unserialize() 用戶輸入 (如反序列化 Gadget Chain),攻擊者可構造惡意 Session 資料觸發 RCE。

防禦

  • 禁用 unserialize() 處理用戶輸入,改用 JSON
  • session.serialize_handler = php_serialize (更安全)
  • 升級 PHP 版本修補已知 Gadget Chain

Session 安全配置總表 (生產環境)

; php.ini
session.save_handler = redis                 ; 推薦 Redis
session.save_path = "tcp://127.0.0.1:6379?auth=password&database=1"
session.name = MYAPPSESSID                   ; 自定義 Cookie 名稱,避免預設名稱被針對
session.cookie_lifetime = 0                  ; 瀏覽器關閉失效
session.cookie_path = /                      ; 整站有效
session.cookie_domain = .example.com         ; 子域共享 (可選)
session.cookie_httponly = 1
session.cookie_secure = 1                    ; 僅 HTTPS
session.cookie_samesite = Strict             ; 防 CSRF (PHP 7.3+)
session.use_strict_mode = 1
session.use_only_cookies = 1
session.gc_probability = 1
session.gc_divisor = 1000                    ; 0.1% 機率 GC
session.gc_maxlifetime = 1440                ; 24 分鐘廢棄
session.serialize_handler = php_serialize
session.sid_length = 32                      ; Session ID 長度 (PHP 7.1+)
session.sid_bits_per_character = 5           ; 熵值

Redis Session 儲存優勢

特性檔案Redis
共享主機隔離差優 (Key 前綴隔離)
多伺服器叢集需 NFS/共享儲存原生支援
效能磁碟 I/O 瓶頸記憶體級,微秒延遲
原子操作難以保證支援 Lua 腳本原子化
TTL 自動過期需 GC 機率清理原生 TTL 精確過期

Session 安全審計清單

  • [ ] 全站 HTTPS + cookie_secure=1 + HSTS
  • [ ] cookie_httponly=1 + cookie_samesite=Strict
  • [ ] 登入/權限提升後 session_regenerate_id(true)
  • [ ] use_strict_mode=1 防固定攻擊
  • [ ] Session 儲存隔離 (Redis/私有目錄)
  • [ ] 敏感資料不存 Session (存資料庫,Session 只存 ID)
  • [ ] 登出時 session_destroy() + 刪除 Cookie
  • [ ] 定期輪換 Session 加密金鑰 (若使用加密儲存)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved