DVWA靶场——Weak Session IDs(弱会话)

📅 2026/7/18 13:42:25
DVWA靶场——Weak Session IDs(弱会话)
Weak Session IDs弱会话用户访问服务器的时候一般服务器都会分配一个身份证 session id 给用户用于标识。用户拿到 session id 后就会保存到 cookies 上之后只要拿着 cookies 再访问服务器服务器就知道你是谁了。但是 session id 过于简单就会容易被人伪造。根本都不需要知道用户的密码就能访问用户服务器的内容了。在开始攻击之前需要了解以下概念1.Cookie 存储在浏览器中的键值对数据每次请求会自动携带2.PHPSESSID PHP默认的会话ID名称由服务器自动生成3.dvwaSession 本模块自定义的Cookie名称用于演示弱会话ID的生成4.Cookie劫持 攻击者获取他人的Cookie后使用该Cookie冒充他人身份low我们首先进入Weak Session IDs模块点击Generate按钮打开开发者工具观察到生成的Session ID值是1连续点击Session ID增加1——1→2→3→4...由此我们推断ID生成是有规律的源码分析?php $html ; if ($_SERVER[REQUEST_METHOD] POST) { if (!isset ($_SESSION[last_session_id])) { $_SESSION[last_session_id] 0; } //服务器每次生成的session_id加1给客户端 $_SESSION[last_session_id]; $cookie_value $_SESSION[last_session_id]; setcookie(dvwaSession, $cookie_value); } ?Session ID的生成逻辑是从0开始每次加1——这是一个完全可预测的序列。攻击者只需要知道当前用户的Session ID就能轻松推算出下一个或前一个用户的ID。接下来我们尝试利用这个漏洞实现具体的攻击我们首先通过某种方式如XSS、网络嗅探获取了某个用户的dvwaSession值然后使用该值冒充该用户。这里我们需要用到火狐浏览器的hackbar插件。打开火狐浏览器找到右上角的扩展管理搜索下载hackbar并启用然后我们来到DVWA靶场的登录界面可以看到我是没有登陆过的。F12打开开发者工具进入hackbar输入我们需要访问的网页手动设置Cookie dvwaSession4外加已登录用户的PHPSESSIDPHPSESSID 是登录门票攻击全程必须携带当前浏览器的原值不能替换、不能删除dvwaSession 是漏洞靶标只修改这一段数字实现登录绕过然后访问DVWA的任意页面。由于服务器只检查dvwaSession的值来识别用户攻击者无需密码即可直接登录目标用户的账户可以看到登陆成功了Medium点击Generate按钮这看起来session是一串随机的10位数字再多点击几次呢发现好像都是后面三位数在改变似乎没有思路了我们先看看源代码源码分析?php $html ; if ($_SERVER[REQUEST_METHOD] POST) { $cookie_value time(); //返回当前时间的 Unix 时间戳并格式化为日期 time() 函数返回自 Unix 纪元January 1 1970 00:00:00 GMT起的当前时间的秒数 setcookie(dvwaSession, $cookie_value); } ?这个级别使用当前时间戳作为Session ID。虽然时间戳看起来是一个随机的数字但它的生成逻辑是完全确定的——攻击者只需要知道Session ID生成的大致时间范围就可以精确推算出该ID的值。这里解释一个概念时间戳Timestamp在计算机和DVWA这个靶场里特指Unix 时间戳Unix Timestamp。用最通俗的话说时间戳就是“从 1970年1月1日 0点0分0秒格林威治时间开始到现在这一刻总共走过的秒数两个特点它是全球唯一的参考点全世界所有的电脑只要时间校准准确在同一个时刻调用time()得到的数字是完全一样的。它是“秒级”递增的虽然它不是每次都 1因为你不一定每秒都点击但它严格遵循时间线性增长。这一秒是 A下一秒绝对是 A1。因此我们只要知道其他用户大概在什么时间生成了Session ID就可以推算出该用户的Session ID时间戳转换工具如https://tool.lu/timestamp/例如如果攻击者知道管理员在2026-08-08 12:00:00登录了系统那么管理员的Session ID大约为1786161600对应的时间戳。我们使用推算出的时间戳作为Cookie值即可冒充管理员没毛成功登录进来了HighSession ID显示为一个字符串我们还是多点击几次generate看看是否有规律这样似乎看不出任何规律不妨先看看源代码源码分析?php $html ; if ($_SERVER[REQUEST_METHOD] POST) { if (!isset ($_SESSION[last_session_id_high])) { $_SESSION[last_session_id_high] 0; } $_SESSION[last_session_id_high]; $cookie_value md5($_SESSION[last_session_id_high]); //setcookie(name,value,expire,path,domain,secure,httponly) 参数 描述 name 必需。规定cookie的名称。 value 必需。规定cookie的值。 expire 可选。规定cookie的有效期。 path 可选。规定cookie的服务器路径。 domain 可选。规定cookie的域名。 secure 可选。规定是否通过安全的HTTPS连接来传输cookie。 httponly 可选。规定是否Cookie仅可通过HTTP协议访问。 setcookie(dvwaSession, $cookie_value, time()3600, /vulnerabilities/weak_id/, $_SERVER[HTTP_HOST], false, false); } ?好了一目了然使用了MD5哈希算法。这是一个自增数字每次 POST 请求都 1我们把刚刚拿到的加密后的session拿去解密看看MD5破解网站https://www.cmd5.com/请求次数Session IDMD5 值第1次1c4ca4238a0b923820dcc509a6f75849b第2次2c81e728d9d4c2f636f067f89cc14862c第3次3eccbc87e4b5ce2fe28308fd9f2a7baf3我逐渐开始理解一切虽然session变成了我们不认识的样子但我们针对这个漏洞的流程大体不变获取当前 Cookie 值知道他的加密方式用 MD5 字典/彩虹表反查或直接枚举 1-1000得到当前数字后1预测下一个 Cookie伪造下一个用户的会话只要cookie可以被我们预测实施攻击就很简单这也是这关叫做Weak Session ID弱会话ID的原因Impossible?php $html ; if ($_SERVER[REQUEST_METHOD] POST) { //随机数时间戳固定字符串Impossible再进行sha1运算 $cookie_value sha1(mt_rand() . time() . Impossible); setcookie(dvwaSession, $cookie_value, time()3600, /vulnerabilities/weak_id/, $_SERVER[HTTP_HOST], true, true); } ?$cookie_value采用随机数时间戳固定字符串Impossible再进行sha1运算完全不能猜测到dvwaSession的值。Session ID 必须满足不可预测→ 使用random_bytes()或/dev/urandom足够长→ ≥ 128 位32字节十六进制 256位仅通过 Cookie 传输→ 禁止 URL 传递加密传输→ Secure 标志 HTTPS防窃取→ HttpOnly 标志防 CSRF→ SameSite 标志服务端强校验→ 绑定用户、IP可选、过期时间定期更换→ 登录、权限变更时重新生成