当前位置: 首页 > news >正文

DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?

DVWA Weak Session IDs High 难度踩坑记录:Cookie 为什么死活看不到?

发布时间: 2026-03-01
分类: Web 安全 / DVWA 实战


前言

在做 DVWA 的 Weak Session IDs(会话 ID 安全性不足)High 难度实验时,发现了一个很奇怪的问题:按照正常流程点击 Generate 按钮,不管是用浏览器的开发者工具、Cookie 编辑插件,还是 HackBar,都看不到 dvwaSession 这个 Cookie。

这不是操作问题,而是一个真实的 Bug,根源涉及到浏览器对 Cookie 规范的实现细节。本文记录完整排查过程,并深入解释背后的原因。


实验环境

  • DVWA(本地 phpStudy 搭建)
  • 访问地址:http://dvwa:8564
  • 难度:High
  • 工具:Burp Suite、浏览器 F12

一、各难度 Session ID 生成方式

在分析问题之前,先了解 DVWA 各难度的实现方式:

难度 生成方式 安全问题
Low 数字递增(1、2、3...) 完全可预测,直接枚举
Medium Unix 时间戳 可根据时间推算
High MD5(递增数字) 看似随机,实则可预测
Impossible 真随机数 + 时间戳 + 盐值 安全

High 难度的核心源码如下:

$_SESSION['last_session_id_high']++;
$cookie_value = md5($_SESSION['last_session_id_high']);
setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false);

逻辑很清晰:每次点击 Generate,将一个递增的数字做 MD5,结果作为 Cookie 写入浏览器。

理论上,访问几次后应该能看到类似这样的 Cookie:

dvwaSession=c4ca4238a0b923820dcc509a6f75849b   (MD5(1))
dvwaSession=c81e728d9d4c2f636f067f89cc14862c   (MD5(2))
dvwaSession=eccbc87e4b5ce2fe28308fd9f2a7baf3   (MD5(3))

但实际上浏览器里根本看不到这个 Cookie。


二、排查过程

步骤 1:确认功能是否正常运行

1772369710220

页面没有报错,看起来一切正常。

打开 F12 → Application → Cookies:
1772369803340
1772369783000

只能看到 PHPSESSIDsecuritydvwaSession 不见了。

步骤 3:换工具确认

分别尝试了:

  • 浏览器自带开发者工具
  • Cookie Editor 插件
  • HackBar

结果一致,全都看不到 dvwaSession

步骤 4:用 Burp Suite 抓包

在 BP 的 HTTP History 里找到 Generate 的请求,查看响应包
1772369898683
响应包里能看到:

Set-Cookie: dvwaSession=d3d9446802a44259755d38e6d163e820; expires=...; Max-Age=3600; path=/vulnerabilities/weak_id/; domain=dvwa:8564

服务器确实发送了 Set-Cookie,但浏览器就是不存!

步骤 5:定位问题

仔细看 Set-Cookie 的内容,发现问题所在:

domain=dvwa:8564

domain 字段里包含了端口号


三、根本原因:Cookie 规范不支持端口号

RFC 6265 的规定

Cookie 的行为由 RFC 6265 规范定义,其中明确指出:

Cookie 的作用域由 domain、path、secure 属性决定,端口号不参与 Cookie 的作用域判断

这意味着 Cookie 的 domain 字段设计上就不支持带端口号,这是一个历史遗留问题——Cookie 规范诞生于网站几乎都使用标准端口(80/443)的年代,端口的区分从未被纳入考虑。

浏览器的行为

当浏览器收到 domain=dvwa:8564 这样的 Set-Cookie 时:

domain 包含端口号
→ 不符合 Cookie 规范
→ 浏览器直接忽略整个 Set-Cookie 指令
→ Cookie 不会被存储

这就是为什么服务器明明发送了 Set-Cookie,浏览器却没有任何响应。

对比同源策略的矛盾

这里有一个有趣的矛盾点:

安全机制 域名 端口 协议
同源策略(SOP) 必须相同 必须相同 必须相同
Cookie domain 必须匹配 完全忽略 不区分

同源策略里端口是隔离的关键因素,但 Cookie 却根本不区分端口。这意味着:

http://dvwa:8080 设置的 Cookie
http://dvwa:9090 同样可以读取

这是 Web 早期设计遗留下来的历史包袱。


四、问题的来源

回到 DVWA 源码:

setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false);

$_SERVER['HTTP_HOST'] 在标准 80/443 端口下只返回域名(如 dvwa),但当使用非标准端口时,它返回的是域名:端口的组合(如 dvwa:8564)。

DVWA 的源码没有考虑到非标准端口的情况,导致在本地搭建环境时(通常使用非标准端口)出现这个问题。


五、修复方案

找到文件:

/DVWA-master/vulnerabilities/weak_id/source/high.php

方案 1:使用 SERVER_NAME

// 修改前
setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false);// 修改后
setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['SERVER_NAME'], false, false);

$_SERVER['SERVER_NAME'] 只返回域名,不带端口。

方案 2:去掉 domain 参数

setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/");

不指定 domain,Cookie 默认作用于当前域名,浏览器能正常处理。

修改保存后重启 Apache,再次点击 Generate,就能正常看到 dvwaSession Cookie 了。


六、High 难度的漏洞分析

修复 Cookie 存储问题后,回到实验本身。High 难度 Session ID 的安全问题在哪?

漏洞核心

Session ID = MD5(1), MD5(2), MD5(3)...

MD5 是确定性算法,种子是可预测的递增整数,所以攻击者只需要:

  1. 观察自己的几个 Session ID
  2. 拿去 MD5 解密,发现规律(解出 1、2、3...)
  3. 枚举生成所有可能的 Session ID

(此处放截图:MD5 解密网站,显示解密结果)

枚举脚本

import hashlibfor i in range(1, 10000):session_id = hashlib.md5(str(i).encode()).hexdigest()print(f"{i} → {session_id}")

用这些 Session ID 去碰撞其他在线用户,就能劫持他们的会话。


七、总结

踩坑经验

这次排查的完整思路:

Cookie 看不到
→ 排除操作问题(换多个工具确认)
→ 用 Burp 抓包确认服务器有没有发送 Set-Cookie
→ 服务器发了但浏览器不存 → 看 Set-Cookie 的具体内容
→ 发现 domain 带了端口号
→ 查 RFC 6265 确认规范不支持端口
→ 定位到源码 $_SERVER['HTTP_HOST'] 的问题
→ 修复

关键工具是 Burp Suite——它能看到原始的 HTTP 响应,让你知道"问题出在服务器还是浏览器"。如果只用 F12,看不到服务器发了什么,排查会走弯路。

安全启示

  1. Cookie 不区分端口是一个容易被忽视的安全盲区,同一域名不同端口的服务会共享 Cookie
  2. MD5(递增数字) 提供的是虚假的安全感,加密算法本身不等于安全,种子的可预测性才是关键
  3. $_SERVER['HTTP_HOST'] 设置 Cookie domain 在非标准端口环境下会出现问题,应使用 $_SERVER['SERVER_NAME'] 或不指定 domain

参考资料

  • RFC 6265: HTTP State Management Mechanism
  • DVWA 官方仓库:https://github.com/digininja/DVWA
  • PHP setcookie 文档:https://www.php.net/manual/zh/function.setcookie.php

本文基于 DVWA 本地实验环境,仅供安全学习使用。

http://www.jsqmd.com/news/429030/

相关文章:

  • 微信小程序分享图片显示自定义内容
  • 国产生产制造品牌如何借力千问AI?从“制造”到“智造”的营销突围 - 品牌2026
  • 看透这个死局,才算活着
  • 当用户习惯转向豆包AI:品牌方该如何布局生成式搜索优化? - 品牌2026
  • 品牌怎么在千问AI“打广告”?解析AI问答场景下的合规曝光路径 - 品牌2026
  • GPCR 稳定细胞系作为工程化药理模型的系统理解
  • 当采购方在豆包问“哪家国产监护仪性价比高”:医疗器械企业如何借力生成式搜索精准获客 - 品牌2026
  • 国产制造品牌获客新路径:如何利用GEO技术在豆包AI搜索中抢占先机 - 品牌2026
  • 医美机构如何在千问AI获客?精准问答营销与信任构建指南 - 品牌2026
  • 高端制造业如何布局千问AI?精准获客与品牌升级实战指南 - 品牌2026
  • 国产品牌如何借力千问AI实现精准曝光?从“被忽视”到“被推荐”的新路径 - 品牌2026
  • 医美机构获客新范式:如何让豆包AI在“变美攻略”中精准推荐你的品牌? - 品牌2026
  • 国产精密仪器品牌如何抢占千问AI推荐位?技术型企业的AI问答曝光策略 - 品牌2026
  • 仪器仪表品牌如何布局千问AI?高技术产品在AI问答场景中的曝光策略 - 品牌2026
  • 在ubuntu22上编译perfbook
  • 当科研采购员在豆包问“国产比表面积仪哪家强”:精密仪器品牌如何借力生成式搜索建立专业影响力 - 品牌2026
  • 慢性病管理的效率革命:提示工程如何通过上下文优化提升患者随访效果?
  • 当工程师在豆包问“高精度压力变送器选哪家”:仪器仪表企业如何通过生成式搜索触达专业用户 - 品牌2026
  • 哪些品牌适合做千问AI推广?高适配行业的特征与选择逻辑 - 品牌2026
  • 医疗器械品牌如何在千问AI突围?精准问答营销新范式 - 品牌2026
  • 当客户在豆包问“哪家医美值得做”:生成式搜索如何重塑行业获客逻辑 - 品牌2026
  • 医疗器械品牌信任构建:如何让豆包AI在“专业选型”中优先推荐你的方案? - 品牌2026
  • 机械行业怎么在千问 AI 上获客?精准问答营销实战指南 - 品牌2026
  • 医美品牌声量突围:如何让豆包AI在“变美攻略”中精准关联你的机构? - 品牌2026
  • 2026口腔执业医师培训机构通过率高的有哪些? - 医考机构品牌测评专家
  • Claude Code一站式部署小白教程
  • 中医执业医师高性价比培训机构怎么选?掌握这四招就可以 - 医考机构品牌测评专家
  • 中医执医考试哪个机构课程好——三家机构横向测评与选课逻辑分析 - 医考机构品牌测评专家
  • 当用户习惯问豆包“哪家医美靠谱”:生成式搜索时代下的获客新路径 - 品牌2026
  • 大厂源码高频注入,全可见注入非库形式,助您轻松实现开发创新