6876h9/ctf-power-cookie

GitHub: 6876h9/ctf-power-cookie

一份 picoCTF Web Exploitation 题目的详细解题报告,演示了通过篡改浏览器 Cookie 中的 isAdmin 字段实现越权获取管理员权限的完整过程。

Stars: 0 | Forks: 0

# Power Cookie — picoCTF Web Exploitation 解题报告 | 字段 | 详情 | |-------------|----------------------------------| | 平台 | picoCTF / CyLabs | | 类别 | Web Exploitation | | 难度 | Medium | | 得分 | 200 | | 作者 | LT 'syreal' Jones | | Flag | `picoCTF{gr4d3_A_c00k13_65fd1e1a}` | ## 题目描述 **提供的提示:** *你知道如何修改 cookie 吗?* ## 漏洞类别 **通过 Cookie 篡改实现的不安全客户端授权** 应用程序使用客户端控制的 cookie(`isAdmin`)执行授权检查。由于该 cookie 存储在浏览器中且没有任何完整性保护(没有签名,没有针对通过 DevTools 修改的 `HttpOnly` 强制执行),攻击者可以通过将其值设置为 `1` 来轻易地提升权限。 ## 解题步骤 ### 步骤 1 — 访问应用程序 打开提供的实例 URL 会显示一个标题为 **Online Gradebook** 的极简网页,上面只有一个 "Continue as guest" 按钮。 ![着陆页](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/600cf4f666173525.png) ### 步骤 2 — 点击 "Continue as guest" 点击该按钮会向 `/check.php` 发出一个请求。服务器检测到访客状态并返回: ![访客被拒绝](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/c8c6ef63b9173531.png) 此时相关的问题是:服务器是如何知道该会话是访客的?答案就在于第一次请求所设置的 cookie 中。 ### 步骤 3 — 检查 Cookie 打开 **DevTools → Application → Cookies**(或任何浏览器中的等效功能)。点击按钮后,应用程序设置了一个名为 `isAdmin` 的 cookie,其值为 `0`。 ![DevTools cookie 面板](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/86877848e2173537.png) ![Cookie 值详情](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/f0ce3f9dd2173543.png) 其逻辑非常透明:`isAdmin=0` → false → 访客。没有服务器端的 session token,没有 HMAC,也没有签名。整个访问控制决策都委托给了浏览器中的一个普通整数。 ### 步骤 4 — 修改 Cookie 在 DevTools cookie 编辑器中双击值字段,将 `0` 更改为 `1`。目前还无需重新加载。 通过浏览器控制台也可以实现相同的结果: ``` document.cookie = "isAdmin=1; path=/"; ``` 或者直接使用 `curl`: ``` curl -s --cookie "isAdmin=1" http://:/check.php ``` ### 步骤 5 — 触发检查 导航到 `/check.php`(如果已经在该页面则刷新)。服务器现在读取到 `isAdmin=1`,将该会话视为管理员,并渲染出 flag。 ![check.php URL](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/0c3d8c89f5173548.png) ![Flag 输出](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/207bc8de85173553.png) ## Flag ``` picoCTF{gr4d3_A_c00k13_65fd1e1a} ``` ## 根本原因分析 服务器直接读取 `isAdmin` cookie 的值,并在没有任何服务器端验证的情况下基于此做出授权决策。Cookie 是由浏览器控制的;用户可以随意修改它们。修复方法是使用签名的 session token(例如,映射到数据库中角色的服务器端 session ID)在服务器上强制执行授权,而不是信任客户端提供的值。 **安全模式(伪代码):** ``` // Wrong — trusts client input if ($_COOKIE['isAdmin'] == 1) { show_flag(); } // Correct — validates against server-side session session_start(); if (isset($_SESSION['role']) && $_SESSION['role'] === 'admin') { show_flag(); } ``` ## 使用的工具 - Browser DevTools (Application → Cookies) - `curl`(可选,用于脚本验证) *解题报告由 [6876h9](https://github.com/6876h9)*
标签:Cookie伪造, Cookie篡改, CTF题解, CyLabs, DevTools, Medium难度, picoCTF, Web安全, Web渗透, Web漏洞利用, Writeup, 不安全的直接对象引用, 协议分析, 客户端授权绕过, 提权, 权限提升, 浏览器开发人员工具, 网络安全, 蓝队分析, 解题思路, 访问控制缺陷, 越权漏洞, 隐私保护