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 保护生效
- 访问
http://localhost/vuln.php。 - 打开开发者工具 (F12) -> Storage -> Cookies。
- 确认
SecretSessionID的HttpOnly属性已勾选。此时,在控制台输入document.cookie将无法看到该值。
截图参考 :浏览器中 Cookie 的
HttpOnly状态。
步骤 2:确认 phpinfo() 信息泄露
- 访问
http://localhost/info.php。 - 搜索
HTTP_COOKIE字段。 - 发现风险 :由于服务器会打印完整的 HTTP 请求头,受保护的
SecretSessionID明文显示在 HTML 页面中。
步骤 3:构造并注入攻击 Payload
由于 document.cookie 被封锁,攻击者利用 JavaScript 发起异步请求来读取 info.php 的响应内容,并从中提取 Cookie。
攻击 Payload 逻辑:
- 使用
fetch()访问同域下的/info.php。 - 获取响应的文本内容。
- 使用正则表达式匹配
SecretSessionID后的字符串。 - 将提取到的值通过弹窗或外传展示。
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:执行攻击与结果验证
- 将构造好的链接粘贴至浏览器访问。
- 预期结果:页面执行注入的脚本,并弹出包含受保护 Cookie 的警告框。
截图参考 :成功绕过 HttpOnly 提取到的 Cookie 弹窗。
4. 结论与风险总结
- 高危风险 :此漏洞允许攻击者完全接管用户会话,即便开启了
HttpOnly防御。 - 防御失效 :原本用于防止 XSS 窃取 Cookie 的安全标志,在
phpinfo()的"协助"下彻底失效。
比喻理解 : 设置 HttpOnly 标志就像给房子安装了防盗门 ,让小偷没法直接拿到钥匙;但公开暴露 phpinfo.php 就像在门旁的告示牌上贴了一张钥匙的详细蓝图。攻击者通过 XSS 潜入院子后,只需照着蓝图"复刻"一把,依然能打开你的防盗门。


