通过代码审计可以知道本题的核心在于把cookie的值进行反序列化然后判断cookie反序列化后的值是不是从url中get到的username和password的值并且判断该user是否为vip只有都满足时才会执行$user-vipOneKeyGetFlag(); 并返回flag我们可以url中输入?usernamexxxxxxpasswordxxxxxx然后来传递cookie值使其满足条件我们先按f12打开开发者工具点击存储并添加一个cookie我们将名称改为user然后我们该对cookie的值也进行修改可以在本地写一段 PHP 代码来生成恶意的序列化字符串?phpclassctfShowUser{public$usernameadmin;// 自定义用户名public$passwordadmin;// 自定义密码public$isViptrue;// 强行修改为 true}$anewctfShowUser();echoserialize($a);// 输出结果类似于O:11:ctfShowUser:3:{s:8:username;s:5:admin;s:8:password;s:5:admin;s:5:isVip;b:1;}?我们这里可以使用在线工具来进行构造当我们想修改cookie的值是会出现错误这是因为生成的 PHP 序列化字符串中包含了一些特殊符号比如双引号 、分号 ;、花括号 {} 等。有些浏览器或开发者工具插件在直接通过表格双击修改 Cookie 值时会因为 RFC 规范或安全策略限制不允许输入这些未经处理的字符从而导致写入失败。既然通过可视化界面的“双击修改”被拦截了我们可以使用以下两种更底层、更高效的方式将 Payload 塞进去在控制台用 JavaScript 写入并进行 URL 编码直接在表格里改容易因为特殊字符报错我们可以让浏览器把这一串字符先编码URL Encode再存入。浏览器对编码后的安全字符是绝对不会拦截的。在当前题目页面打开 F12把选项卡从“存储/Application”切换到 “控制台” (Console)输入document.cookie “user” encodeURIComponent(‘O:11:“ctfShowUser”:3:{s:8:“username”;s:6:“xxxxxx”;s:8:“password”;s:6:“xxxxxx”;s:5:“isVip”;b:1;}’);此时我们再次查看cookie时值就已经被修改 好了此时再次按下回车键flag就出来了