课堂笔记-8月22日
课堂笔记-8月22日:WordPress 漏洞调试与 batch 双层绕过,及秋招就业要点
来源:
8_22/录音.txt| 日期:2026-08-22 | 主题:Web 安全实操考核思路、WordPress 环境搭建与源码级调试(参数校验、数据清洗、batch 双层绕过)、学习闭环方法与秋招简历/证书建议
〇、今日主线
今天没有讲全新的大块理论,核心是动手实操 + 源码级调试。老师(欣老师)围绕 WordPress 环境从零搭建、断点调试到漏洞利用链路,完整走了一遍 WordPress REST API 的请求处理流程:参数校验 → 数据清洗 → SQL 拼接 → 查询执行,并重点拆解了 WordPress 6.9.0 新增的 batch 功能如何用"双层错位"绕过请求方法限制。同时,老师反复强调学习闭环(及时复盘卡点、避免知识雪球)、三层 Web 安全考核思路,以及简历差异化和秋招节奏。课堂还带大家配好了宝塔/Xdebug 调试环境,解决了 RCE 调试超时问题。
一、学习闭环与卡点管理(方法论重点)
老师发现不少同学存在学习闭环缺失:上课听讲认真,但课后不复习、不实践,知识停留在"听过"层面,遇到难点不解决就继续往前学,形成知识漏洞累积效应——像滚雪球一样,前面没搞懂的小问题拖累后续,最终造成多处知识卡点。
- 危险心态一:课程简单时,忽略之前的卡点继续学。
- 危险心态二:遇到难度大的内容,干脆放弃实践,变成被动听讲("听而不做")。
老师的原则:知识像盖楼,每一层没砌稳就往上盖,整栋楼都会摇摇欲坠。因此采用渐进式教学——每讲完一个知识点立即安排练习,大多数同学掌握后才继续新课;但如果前后知识点关联度低(例如框架漏洞 vs 反序列化基础),可以灵活推进。
"上二休一"的真实用途:休息日不是用来玩的,而是用来消化前两天积累的内容;如果休息日什么都不做,知识照样滚雪球。
配套手段:由于课后练习量不足,老师决定恢复不定期测试来督促学习(本次课堂练习不算正式测试)。
一句话:及时解决卡点比赶进度更重要——"地基有洞的危楼"必塌。
二、实操考核设计与三层 Web 安全测试思路
老师打算用实操任务代替纯答疑来摸清每个人的真实水平(有些同学有问题但不会主动提问,实操能暴露出来)。
- 布置了三个不同难度的任务,对应 30 / 50 / 80 分,其中 30 分和 50 分的任务必须跟着文档完整复现。
- 要求不仅要复现结果,还要能解释"为什么这样做"和"为什么不那样做"——像面对面试官一样。面试通常不要求现场调试,但一定会考漏洞原理:漏洞产生的原因、为什么某些方法不可行、如何绕过限制,能讲清楚才算真正掌握。
三层考核思路(Web 安全测试):
| 层 | 考察内容 | 要点 |
|---|---|---|
| 第一层 | 基础注入漏洞直接利用 | 为什么不能直接提交盲注?会遇到哪些防御机制(如 WAF 过滤)?如何绕过? |
| 第二层 | 文件包含漏洞利用 | 裸文件包含 prc / md 等特殊文件的操作,需要特定环境条件 |
| 第三层 | 自由发挥 | 展示最擅长的漏洞类型,如 Web 共享绕过(20 多种样本)或 宝塔 Nginx 特定漏洞,深度复现 + 讲清原理 |
练习入口:可从文件包含漏洞和 WordPress 漏洞复现中任选一个开始(第一个固定为 WordPress,后面两个可自由选择)。
三、环境搭建:宝塔、Windows 与 Linux 分工
环境搭建可以灵活选择:既可用现成的宝塔面板,也可以手动搭建 nginx 等环境,两种都行。
- 原则:以 Linux 为主、Windows 为辅。实际工作中服务器大多跑 Linux,渗透目标环境也多基于 Linux;Windows 的优势在于版本切换方便(PHP 可快速切 5.6 / 7.3 / 8.2),适合复现某些特定漏洞,更多是辅助调试和快速验证。
- 宝塔面板访问异常:先怀疑代理设置,关闭代理再试(老师演示中关代理后访问立即恢复正常)。
debug宝塔很简单,点装即可;正常安装环境下会稍微麻烦,上课已演示。
数据库规范:临时测试可用 root 账户,但正式环境应当避免使用 root 权限,规范操作是使用 create database 命令创建数据库。
关于缺少基础知识:很多同学缺的其实是 CSA(云安全联盟)基础,与当前课程关联不大;不必死记命令,实操中可借助 AI 工具随时回忆,关键是理解知识脉络。
四、WordPress 环境安装与 REST API 调试链路
1. 本地安装步骤
- 本地环境无需域名,直接通过 IP 或 localhost 访问即可。
- 流程:选择语言(如简体中文)→ 填任意易记的用户名和密码(演示用弱密码仅作示例)→ 点击安装 → 用刚设置的凭据登录后台。
- 版本提示:系统检测到当前运行的 6.9.4 存在漏洞,建议升级到 7.1(老师选择暂不处理);最新版 6.6.4 适配 PHP 8.0(老师习惯用 PHP 7.3,差异影响不大)。WordPress 与 PHP 版本兼容问题不用太担心,最新版本都会做好适配。
- 登录后默认有示例文章 "Hello World",可编辑或删除。
- 注意:实际使用避免 "123" 这类弱密码,且建议及时更新版本修复漏洞。
2. 参数校验是调试的起点
搭建完平台后,调试第一步是检查参数传递:
- 参数值过小(演示 0.15)会异常,改大(2)能正常运行 2 秒。
- 参数类型错误(如传字符串
"abc")会直接返回 400 错误("无效参数")。 - 关键点:参数有效性验证发生在实际查询之前——传入非整型参数时,请求根本不会进入查询环节,在参数清洗阶段就被拦截。参数没写对,就等于没有这个参数。
3. 断点调试流程
- 建议在代码 300-400 行附近设断点;若看到其他系统的断点标记,全部移除后重新设置单个断点更清晰。
- 进入断点后会创建 request api server 处理接口请求;走到 root 路径时确认其指向的是哪个接口(tti / api),跳转错误就重新调试或打问号检查。
- 执行路径混乱时,回退到上一步仔细检查,再从指定行继续跟进;保持耐心,一步步验证执行路径。
4. REST API 请求处理链路
处理请求时先实例化 Rest Request 类(专门处理后端 API 请求),随后:
- 添加必要数据:用户信息、参数、header 中的 cookie、语言设置、编码等。
- 预处理完成后进入 dispatch 阶段(真正的后端处理环节)。
- 系统匹配请求到对应控制器(如 RequestPostController),确定由哪个方法处理。
- 验证控制器/方法是否可调用,进入参数清洗:检查 POST 字段是否符合预期、格式校验(尤其检查元素是否为数组类型)。
- 通过
get attribute方法获取对象所有属性(对应文章可传递的参数),K-V 配对对应着rest_root与wp/vr/posts等参数关系,以及 exclude、select 语句的映射。
五、WordPress batch 功能与"双层错位"绕过(今日核心)
1. batch 功能是什么
batch(批次/批量)是 WordPress 6.9.0 之后新增的功能,允许一次性提交多个 API 接口请求,避免多次单独调用 API,核心价值是提升效率。
2. 为什么需要嵌套/双层结构
老师反复追问"为什么需要两个错位而不是一个"。根本原因是请求方法限制:
- 用 batch v1 访问时,必须使用 POST / PUT / PATCH / DELETE 方法;
- 而时间盲注参数是通过 GET 传递的,两者冲突——代码 135 行处明确规定,直接用 GET 会直接返回 400 错误。
- 解决方案:套两层请求——第一层用 POST 通过校验,第二层把实际请求放在 body 参数里。外层限制请求方法,内层 body 参数没有该限制,这种分层设计巧妙地绕过了限制。
这是由 WP REST Server 设定的规则,接收 batch 参数时必须严格按规范处理。看似简单的错位背后存在系统层面约束,这正是需要双重错位的原因——技术方案的选择往往受底层框架规则制约。
3. 双重错位设计与循环错位
- 代码中需故意设置两次错位:第一次用 post 处理 category,第二次才真正触发目标操作。
- 双重错位的作用:绕过初始输入验证;但若处理不当会导致安全漏洞。
- 根本原因:在
$request的循环过程中,error 被加入某个数组但未同步到另一个数组,造成请求处理链断裂——既是技术难点,也是面试常见考点。 - 循环错位现象:处理第三个请求时,match 列表里添加了新元素,导致 request 与 match 的索引对应关系被打乱,batch 处理器错误地处理了 posts 请求。
4. batch 请求的执行流程
- batchRequestV1 回调函数是核心,它通过 restRequest 对提交的参数做限制(POST / DELETE 等 HTTP 方法)。
- 系统先对 batch 参数做初始化验证,参数不匹配直接返回 400。
- 调试中第一个请求解析报错,被封装成 WP_Error 类并返回 false;第二个 posts 请求携带三个子元素参数,顺利通过验证。
- 单条请求(single request)只要 body 里参数完整,参数验证基本能通过;重点关注报错环节(如 path 解析失败)。
六、参数校验、数据清洗与 SQL 查询链路
1. 参数验证机制
- 原始字符串参数先按空格和逗号分割,再对每个元素做数字验证(switch 语句判断参数类型,如 string → integer),采用循环验证机制逐元素检查。
- 当
is_number检测到非数字输入时,触发 error 报错并封装错误信息返回页面展示。 - 断点可清晰追踪:验证失败 → 进入错误处理 → 退回清洗函数 → 呈现错误结果。
2. 数据清洗的绕过
- 关键发现:清洗函数并不在直观位置(如 dispatch 派发处),而是隐藏在代码 834 行附近(实际可能 1700 行左右)——复杂系统中功能实现可能分散在不同位置,可用快捷键 Ctrl+Alt+H 搜索定位。
- 程序会判断数据类型是否为数组来决定是否执行清洗:不是数组就直接拼接处理。
- category 参数的特殊性:当传入的 value 不在预设的 category 列表中时,程序会
continue跳过当前循环,最终return true结束校验——相当于给参数校验"放水"。 - 参数传递路径差异导致执行流程分叉:传给 category 时,args 属性中缺少
also_exclude参数,程序直接continue跳过后续处理;传给 post 时参数完整,会继续走到数据清洗环节。 - 绕过链路:category 有默认值(1 和 10),导致程序走入 get_col 函数而非 get_results 函数;由于 category 字段没有清洗函数,数据以字符串形式进入 where 条件拼接。数据清洗失败(返回 true 但实际未处理)→ 参数保留原始值 → 绕过过滤进入正常处理流程。
3. SQL 查询拼接与执行
- 请求最终进入 query 方法,在 2409 行附近完成 SQL 语句拼接(该行号可能略有出入,实际拼接逻辑在 query3 中)。
- 拼接好的 query 传入解析模块判断是否为数组类型;category 字段无清洗函数,数据以字符串直接进 where 条件拼接。
- 最终拼接完成的 query 在 get_col 方法中执行(注意与 get_results 的路径差异,调试时需单步跟进 get results 来展开查询语句)。
- 调试确认:所有字段都进入了清洗流程,category 携带的 12 个属性能正确触发 continue 跳过非目标字段;Windows 环境下所有断点都能被命中,之前同学反馈的"字段未进入"问题实际已解决。
七、调试与排错实战(老师强调的坑)
1. 宝塔 PHP 扩展 / Xdebug 配置(大坑)
- 在软件商店的 PHP 设置中安装扩展后,必须点击重启按钮使配置生效,否则扩展相当于没装。
- 安装 Xdebug 插件时,如果是 3.x 版本,必须手动在 php.ini 文件底部添加两行特定配置。系统虽然自动添加了 .so 文件路径,但缺少这两行关键配置会导致断点调试功能完全失效(像装了显卡没装驱动)。
- 通用原则:Windows 的 dll / Linux 的 .so 文件,安装后都需要在配置文件中添加指定语句,且每次修改配置文件后都必须重启才生效;Windows 与 Linux 原理相同。
2. 调试超时中断(RCE 超时问题)
调试 WordPress 时遇到 RCE 超时,主要原因是调试步骤过长。解决办法是修改几个关键超时参数:
| 参数 | 位置 | 默认 | 修改后 | 说明 |
|---|---|---|---|---|
max_execute_time |
PHP 配置 | 300 | 0(无限制) | 脚本执行时间上限 |
read_timeout |
Nginx 配置 | 60 | 600 | 读超时 |
send_timeout |
Nginx 配置 | 60 | 600 | 写超时 |
- 未修改
request_timeout(配置文件中不存在该参数项)。 - 即使超时也不影响调试:只要 nginx 和 php 配置保持断点状态,实际调试就不会中断(python 脚本超时后仍能继续调试佐证了这一点)。
- 补充技巧:VS Code 调试会把压缩后的对话内容保存在本地 JSON 文件中,超出上下文后仍可检索历史记录找之前的解决方案。
3. 调试通用要点
- 变量名必须与实际用户匹配:如 "admin" 要改成自己创建的真实用户名,否则查询失败。
- 时间参数调整:演示中将休眠时间从 0.5 秒改为 2 秒,确保触发后续判断逻辑(ASCII 码 36 > 32)。
- 删除无关冗余代码,运行前双重检查易错点——看似正确的代码常因微小偏差失效。
- 每个断点都要有明确目的:比如在 REST API 处打断点,要清楚是为了捕获什么信息、解决什么问题,"有意识的调试"比盲目下断点更有效。
- 善用 IDE 快捷键快速定位:Ctrl+P 快速定位文件/接口,Ctrl+Alt+H 搜索函数实现。
- 代理设置可能是网络访问异常的元凶:优先关代理测试基础连接,再用抓包工具(如 Wireshark)分析实际请求、提取有效数据包。
- 调试的价值在于快速定位问题(如变量取值为空、400 报错原因),细致阅读文档 + 善用调试工具是程序员核心技能——工作三四年的程序员不会用调试工具找问题的大有人在。
- 关于绕过验证的调试思路:修改请求方式(如 GET 改 POST)和调整请求参数(如 IP 地址),本地环境很容易复现。
八、知识沉淀:博客、英语与心态
- 建立技术博客:记录每个漏洞的详细利用过程,写博客本身就是二次学习。可用阿里云服务器或免费平台搭建;持续更新的博客是求职加分项——HR 会通过博客内容评估学习态度和技术成长。
- 及时总结、反复复习:调试漏洞的经验不记录下来,10 天后会忘掉很多细节;单次练习远远不够,需要定期回顾。
- 规范命名:用
cleanData表示数据清洗、hasValidate判断参数有效性,见名知意大幅提升可读性。命名习惯背后是英语能力——在编程领域英语不是加分项而是必需品,能直接获取国外最新技术资料,避免翻译带来的信息失真。 - 解决问题的文档要持续积累:遇到问题就补进去,形成自己的知识库。
- 信心与心态:要相信自己一定能解决遇到的漏洞——我们是在学习别人已经发现并整理好的信息。老师分享经历:在网易考拉海购工作时,曾花 27 天解决一个支付接入问题(正常可能只需 10 分钟)——解决问题往往需要时间和毅力,而不是能力问题。不能自我否定:渗透测试中只要版本匹配,漏洞就一定能利用,区别只是投入的时间长短。
附:行动清单
- 在宝塔/nginx 上完成 WordPress 本地搭建(无需域名,IP/localhost 访问),并配好 Xdebug——务必确认 php.ini 底部两行 Xdebug 3.x 配置 + 修改配置后重启 PHP,否则断点调试全部失效。
- 完成 30 分、50 分文档任务,选做 80 分任务;按"三层考核"标准自检:不仅复现,还能讲清为什么这样做 / 为什么不那样做 / 如何绕过防御。
- 动手过一遍 WordPress REST API 调试链路:参数校验 → 数据清洗 → SQL 拼接 → get_col 查询,重点理解 category 默认值导致的清洗绕过和 batch 双层错位(第一层 POST 过校验、第二层把 GET 盲注参数放 body)。
- 按表格调整 PHP/Nginx 超时参数(
max_execute_time=0、read_timeout/send_timeout=600),解决 RCE 调试超时中断问题。 - 针对没掌握的知识点及时补卡点(复习文件包含漏洞 / WordPress 路由混淆与盲注),练习内容从文件包含漏洞和 WordPress 漏洞复现中任选开始。
- 建立一个技术博客并记录漏洞复现笔记,同时积累"解决问题文档",为秋招简历提供差异化素材。
附:简历与就业要点
- 简历只写真正掌握的技术:简历同质化严重是投了简历没面试的核心原因。HR 浏览每份简历可能只有几秒钟,若内容与其他人 99% 雷同,投再多也没用。关键是展示别人没有的独特经历或项目,简历上的项目/复现漏洞至少有 80% 完成度。
- 关于 WordPress 漏洞研究:路由混淆和盲注是核心知识点,能理解这两点就足够;如果连这些都没搞明白,建议直接放弃这个漏洞,不要写不熟悉的内容。
- 面试双要素:技能掌握程度 + 运气。运气不是被动等待,可通过积极心理暗示(如常对自己说"我一定能做到")提升成功概率。
- 展示技巧:面试/简历中整体理解比完美细节更重要——先建立知识骨架再填充细节。能流畅讲述知识脉络的能力,比死记硬背零散知识点更有价值。
- AI 辅助:简历可借助 AI 工具辅助撰写,但必须结合人工判断调整,不能完全依赖工具。
- 深信服 P 级证书:目前还有考位,性价比不错(可咨询周静老师)。证书的作用:① 就业门槛;② 证明学习能力与态度(中级考试需真才实学);③ 部分深信服合作企业相关岗位认可。但证书本质是锦上添花,不是雪中送炭——两人水平相近时有证书占优,对手太强则光靠证书难翻盘。像英语四六级、名校毕业证这类硬通货能直接证明实力。
- 秋招节奏:课程启动较晚,秋招时间紧迫——9 月中下旬多数岗位已进入笔试/面试阶段,盲目追赶进度效果有限;真正适合应届生的岗位机会集中在 9 月下旬才会大量释放,要把握好节奏。
浙公网安备 33010602011771号