尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
网络安全技能大赛加固取证与渗透测试实战复盘
简介《2021年全国职业院校技能大赛网络安全竞赛试题》文档面向职业院校网络安全竞赛选手、指导教师及备赛者以赛题任务梳理服务器、数据库、流量、监控、服务与防火墙等考点适合备赛训练、课堂教学和赛前查漏补缺。压缩包仅含1个docx文件约119KB篇幅紧凑覆盖登录安全加固、数据库加固、流量完整性保护、事件监控、SSH/VSFTPD/IIS服务加固和防火墙策略并延伸至网络安全事件响应、数字取证调查与应用安全模块。文中给出Windows与Linux双平台的操作要求与关键命令如密码长度不少于16位、登录提示语、MySQL普通账户运行与权限收敛、HTTP跳转HTTPS、审核策略开启、SSH端口修改与禁止root登录、禁用445/23端口及限制ICMP等便于对照复现实验步骤。已有959人学习可作为赛题库与训练清单使用。1. 一套赛题拆成两条主线加固能背取证得看赛题拿到手那天我先做的不是开靶机而是把两份模块的任务清单抄在白纸上。A 模块十八个动作B 模块十三个 Flag按「改配置」和「找证据」分成两堆。网络安全技能大赛的题面有个很明显的规律A 模块全是确定性动作路径对、参数对分数就是你的B 模块全是证据链命令谁都会敲难的是判断哪一条输出才是答案。这套题我在两台机器上来回跑了三遍。第一遍照着题面抄第二遍关掉题面凭记忆复现第三遍专门用来记那些「写了但没生效」的坑。下面按这个顺序走加固怎么改、取证怎么找、渗透怎么串以及我翻过的车。新手可以照着命令走一遍熟手可以直接看判断依据那几段。2. 加固类任务从密码策略到防火墙的逐条复现2.1 密码与登录策略两条线四个动作密码长度 16 位这件事Windows 侧最容易net accounts /minpwlen:16一条就完事图形界面里对应的是本地安全策略的账户策略。真正值得说的是 Linux 侧。题面让你改/etc/login.defs的PASS_MIN_LEN照做没错但你要清楚它管的是什么这个字段只影响新建用户时的默认行为真正在改密码时卡长度的是 PAM 模块pam_pwquality。所以改完login.defs最好顺手看一眼/etc/security/pwquality.conf里的minlen不然你会在验证环节发现「明明改了还能设短密码」然后怀疑人生。# 备份再改别直接 sed -i 覆盖原文件 cp /etc/login.defs /etc/login.defs.bak sed -i s/^PASS_MIN_LEN.*/PASS_MIN_LEN\t16/ /etc/login.defs grep -n PASS_MIN_LEN /etc/login.defs # 校验 PAM 侧的密码质量配置确认没有被更小的 minlen 覆盖 grep -E minlen|minclass /etc/security/pwquality.conf上面这段的关键不是 sed是第二段的grep。sed里用了\t是为了对齐你写成空格也不影响功能。跑完拿一个新用户试一下passwd输 8 位密码看它报不报错——这是最笨也最可靠的验证比看配置文件放心得多。登录提示语要动两个地方这点很多人只做一个。Linux 本地登录的/etc/issue和 SSH 远程的Banner是分开的题面写得很清楚/etc/issue加本地欢迎语sshd_config里加Banner /etc/ssh/banner并在 ssh 目录下建文件写内容。判断依据是/etc/issue由 getty 打印你 SSH 进来看到的是 sshd 打印的 Banner两者不走同一条路径。Windows 侧对应的是安全选项里的「交互式登录试图登录的用户的消息标题/文本」注册表位置在LegalNoticeCaption和LegalNoticeText。# 本地登录提示 echo For authorized users only /etc/issue # SSH 远程登录提示 echo For authorized users only /etc/ssh/banner chmod 644 /etc/ssh/banner sed -i s|^#Banner.*|Banner /etc/ssh/banner| /etc/ssh/sshd_config grep -n ^Banner /etc/ssh/sshd_configchmod 644容易被忽略sshd 是以 root 启动后降权读取文件的权限太开或者属主不对都可能读不到表现就是登录进来什么提示都没有而sshd_config看着完全正确。改完systemctl restart sshd然后从另一台机器ssh过去亲眼确认一遍。会话超时要算乘法这是最典型的失分点。ClientAliveInterval是探测间隔ClientAliveCountMax是允许无响应的次数实际断开时间是两者相乘。要小于等于 5 分钟可以写300配0也可以写60配5。我一般用300 0因为0表示客户端一旦无响应就直接断语义干净。RDP 侧在「远程桌面会话主机设置」里改会话空闲限制或者直接进RDP-Tcp属性看会话那一页。用户user1只允许上班时间登录命令是net user user1 /time:M-F,9:00-18:00。M-F表示周一到周五时间用 24 小时制整条命令里不能有多余空格尤其是逗号后面。验证方式是net user user1看「允许的登录时间」那一行是否变成了你要的区间。「只允许管理员账号从网络访问本机」这条坑在优先级。组策略里有「从网络访问此计算机」和「拒绝从网络访问此计算机」两条后者优先级更高。你在允许列表里只留 Administrators看着很对但只要拒绝列表里挂着普通用户组效果是一样的——不过判分机器往往只看允许列表的成员。稳妥做法是允许列表只留 Administrators拒绝列表清空。2.2 数据库加固五步里有两步最容易写错以普通用户跑 mysqld改的是my.cnf的[mysqld]段不是[client]也不是文件末尾随便加一行。段写错了配置压根不生效你还是用 root 在跑数据库。删除默认库这一步drop database test;只是删了库mysql.db表里可能还留着test%的授权记录严格一点的判分会查。顺手清掉更稳。改管理员用户名这条题面给的是update user set userSuperRoot where userroot;。注意版本差异MySQL 5.7 之后用户表里密码字段从password改成了authentication_string8.0 里直接没有PASSWORD()函数。所以按题面写会报语法错得看版本走。-- 5.6 及更早字段名是 password函数是 PASSWORD() UPDATE mysql.user SET password MD5(Pssw0rd1!) WHERE user user1; -- 5.7字段名换成 authentication_string但仍兼容 PASSWORD 函数 UPDATE mysql.user SET authentication_string PASSWORD(Pssw0rd1!) WHERE user user1; -- 8.0没有 PASSWORD()要显式指定插件才能得到 32 位 MD5 串 ALTER USER user1localhost IDENTIFIED WITH mysql_native_password BY Pssw0rd1!; -- 三条路都别忘了这句否则改了不生效 FLUSH PRIVILEGES;判断依据很直接select version();先看一眼。8.0 默认是caching_sha2_password你不显式指定插件存进去的就不是题面要的 MD5 串select出来一看长度不对立刻就知道。改名那条同样有版本坑mysql.user表里的root通常不止一条localhost、127.0.0.1、::1各一条where userroot会把它们全改成SuperRoot这通常是对的但改完必须用新名字登录验证一次别改完就往下走。授权那条grant select,insert,delete,update on testdb.* to user1localhost;两个细节一引号。赛题文档里的引号经常是复制粘贴时变成全角粘进客户端直接报 1064肉眼还看不出来二MySQL 8 不允许对不存在的用户直接 grant得先create user。2.3 服务加固与防火墙端口、超时、白名单SSH 改端口到 2222改完sshd_config只是第一步。开着 SELinux 的机器sshd 绑不上非标准端口报的是权限错误。得先semanage port -a -t ssh_port_t -p tcp 2222或者临时setenforce 0验证是不是它在拦。防火墙也要放行两个动作缺一不可。PermitRootLogin no改的时候注意把行首的#去掉注释没去等于没改。VSFTPD 这块要重点说因为题面给的参考配置和你真正要的答案不一致。任务要求「无任何操作的超时时间为 5 分钟」而参考注释里idle_session_timeout600是 10 分钟。抄下去就丢分。四个超时参数的含义得拎清参数作用5 分钟对应的值connect_timeout主动模式下建立数据连接的等待时长按题意保留默认即可accept_timeout被动模式下建立数据连接的等待时长按题意保留默认即可data_connection_timeout数据连接空闲多久后断开300idle_session_timeout控制连接无命令操作的超时300「无任何操作」对应的是最后一个idle_session_timeout。改完重启 vsftpd用 ftp 客户端连上去发呆五分钟看它断不断这比读配置快。IIS 日志那条格式选 W3C字段只勾日期、时间、客户端 IP、用户名、方法五项多勾一个都可能被判错。最大并发连接数在站点「高级设置」里填 1000。防火墙部分是题量最大的一块也是最容易乱序的。# Windows禁 445 和 23方向必须写 in netsh advfirewall firewall add rule nameblock-smb-445 dirin actionblock protocolTCP localport445 netsh advfirewall firewall add rule nameblock-telnet-23 dirin actionblock protocolTCP localport23 # Linux禁 23 iptables -A INPUT -p tcp --dport 23 -j DROP # 禁 ping 的三种写法任选一种 echo 0 /proc/sys/net/ipv4/icmp_echo_ignore_all # 临时 echo net.ipv4.icmp_echo_ignore_all1 /etc/sysctl.conf sysctl -p # 永久 iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP # 走防火墙 # 只允许 172.16.1.1 连 SSH先放行再拒绝顺序不能反 iptables -A INPUT -s 172.16.1.1 -p tcp --dport 2222 -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -j DROP最后那段顺序是命门。iptables 规则是自上而下匹配先 DROP 后 ACCEPT 的话白名单永远匹配不到。另外端口别照抄 22——上一节刚把 SSH 改成了 2222防火墙还守着 22结果就是谁都连不上包括你自己。改完iptables-save /etc/sysconfig/iptables落盘否则重启一次全白干。HTTP 强制跳 HTTPS 是在 IIS 里装 URL 重写模块加一条匹配.*的入站规则条件写{HTTPS}等于OFF动作重定向到https://{HTTP_HOST}/{R:1}状态码 301。证书的 CN 要和访问用的域名对得上题面里给的那个域名绑站点时别写错一个字符。3. 内存取证与流量分析证据链断在细节上3.1 内存镜像的第一步先定 profile 再谈其他拿到内存镜像的第一件事永远是imageinfo不是直接上netscan。profile 猜错后面所有插件输出的都是垃圾。# Volatility 2 的起手式 vol.py -f server1.raw imageinfo # 确认 profile 后提取网络连接和主机名 vol.py -f server1.raw --profileWin7SP1x64 netscan vol.py -f server1.raw --profileWin7SP1x64 printkey \ -K ControlSet001\Control\ComputerName\ComputerNameimageinfo会给出建议 profile 列表取第一个一般就对。netscan输出里重点看ESTABLISHED状态的连接ForeignAddr加上ForeignPort就是题目要的ip:端口格式。主机名那条走注册表键printkey出来的ComputerName值就是。浏览器搜索关键词这条比较绕因为内存里没有现成的「搜索历史」表。常见思路是两条一是strings全量导出后按搜索引擎域名附近的关键词去搜二是用对应的浏览器历史插件从内存里的 SQLite 缓存中恢复。# 思路一导出全部字符串围绕搜索引擎域名找上下文 strings -el server1.raw strings_utf16.txt grep -i -A2 -B2 search?q strings_utf16.txt | head -50-el是导出 UTF-16 小端编码的字符串Windows 内部大量使用宽字符不加这个参数你会漏掉几乎全部浏览器相关内容。-A2 -B2是打印匹配行的上下文URL 经常被拆成碎片存储光看一行不够。输出会很长head先看前几十条找到规律再缩小范围。3.2 hashdump 与六位密码的破解从内存里取用户 hash 是标准动作hashdump插件直接吐 SAM 里的 NTLM 串。拿到之后是纯离线的活跟靶机没关系了。# 导出内存中的用户 hash vol.py -f server1.raw --profileWin7SP1x64 hashdump # 六位纯数字用掩码攻击最快 hashcat -m 1000 -a 3 hash.txt ?d?d?d?d?d?d # 六位不限字符用全字符集注意 ?a 是大写敏感的全集 hashcat -m 1000 -a 3 hash.txt ?a?a?a?a?a?a-m 1000指的是 NTLM 哈希类型这个编号记不住可以hashcat --example-hashes | grep -i ntlm查。-a 3是掩码模式。题面说密码是 6 位但没说字符集先用?d跑纯数字几十秒出不来再换?a——全字符集六位的空间是 95 的六次方量级差得非常远别一上来就怼。这里有个容易忽略的点hashdump输出的格式是用户名:rid:lmhash:nthash:::中间是六个冒号不是三个。喂给 hashcat 之前把整行原样保留别手动切 nthash切错了工具不报错只是永远跑不出来。3.3 挖矿进程与注册服务从连接到进程再到服务找矿池地址的路径是固定的连接 → 进程 → 命令行或内存。netscan里挑出不认识的外网连接记住对应的 PID然后pslist或者cmdline追下去。# 看进程列表找可疑的高 CPU 占用项或陌生名字 vol.py -f server1.raw --profileWin7SP1x64 pslist # 看进程的完整命令行矿池地址常常直接写在参数里 vol.py -f server1.raw --profileWin7SP1x64 cmdline -p PIDcmdline是效率最高的一步。很多挖矿程序启动参数里直接带着stratumtcp://ip:port一行就出答案根本不用去 dump 进程内存。命令行里没有的才需要memdump -p PID -D ./然后strings去找。注册服务这条走svcscan# 列出内存中所有服务重点看 BinaryPath 指向临时目录或用户目录的 vol.py -f server1.raw --profileWin7SP1x64 svcscan | grep -i -B2 -A6 Temp判断依据是BinaryPath。正常服务的可执行文件在System32或Program Files下指向\Temp\、\Users\Public\、\AppData\的基本可以确定是后门注册的服务。svcscan输出字段多-A6是为了把ServiceName、DisplayName、BinaryPath一起带出来只看一行容易把显示名当服务名填错。3.4 流量分析五个问题对应五组过滤器Wireshark 做 FTP 取证其实就五个问题每个问题对应一到两个过滤器理清映射关系比死记命令有用得多。找账号密码过滤器打ftp看USER和PASS两条请求。注意PASS是明文传的这就是 FTP 协议本身的问题也是这道题的出题点。找登录成功的时间看服务端回的230 Login successful那条报文的时间戳就是答案别拿USER那一帧的时间。找登录后第一条命令过滤器换成ftp.request.command找到230之后第一条request.command即可。找下载的文件名看RETR命令的参数。找文件内容要么ftp-data过滤后 Follow TCP Stream要么File → Export Objects → FTP-DATA直接导出。# 命令行等价操作适合批量处理或者写进脚本 tshark -r capture.pcapng -Y ftp.request.command -T fields -e frame.time -e ftp.request.command tshark -r capture.pcapng -Y ftp.response.code 230 -T fields -e frame.time-Y是显示过滤器语法和 Wireshark 界面里完全一致会写界面就会写命令。-T fields -e指定只输出感兴趣的字段比-V全量详细输出好读太多尤其是要在一堆帧里找特定值的时候。导出文件内容那一步有个坑ftp-data流里下载的不一定是纯文本可能是压缩包。先file一下看类型是压缩包就解开再看别拿乱码去提交 Flag。4. 渗透测试Nmap 到 MSF 的完整作业链4.1 扫描输出-oX不只是存个文件题面问「以 xml 格式向指定文件输出信息必须要使用的参数」答案是-oX。这个参数的意义不只是留档它是后面 MSF 能db_import的前提——MSF 只认 XML 格式的扫描结果你存成普通文本导入那一步就断了。# -sV 探版本-oX 输出 XML-oN 同时存一份人能读的 nmap -sV -oX /root/scan.xml -oN /root/scan.txt 192.168.1.10 # 确认 XML 结构完整根节点必须是 nmaprun head -3 /root/scan.xml-sV是版本探测不做这一步扫描结果里就没有服务版本MSF 匹配模块时会少一大截线索。-oN是给眼睛看的-oX是给机器吃的两个一起出最省事。head那一步是自检XML 里根节点是nmaprun才算合格。4.2 MSF 数据库初始化和导入是两个动作很多人卡在db_import报错原因往往是数据库根本没起来。msfdb init是初始化之后进msfconsole还要db_status确认已连接。# 第一步初始化数据库 msfdb init # 第二步进控制台确认连接状态 msfconsole -q msf6 db_status msf6 db_import /root/scan.xml msf6 hostshosts就是题面问的「查看导入数据要用的命令」。db_import成功时会打印导入了多少主机、多少服务没打印就是没成功。hosts输出里应该能看到靶机 IP 和开放端口看不到就回去查db_status。判断依据很简单hosts是查主机表services是查服务表vulns是查漏洞表三个命令对应三种视角。题面问「查看导入的数据」主机级别用hosts就够。4.3 CVE 模块检索与回显判读search cve-2019-0708这条回显里会带一行Disclosure Date把日期按YYYY-MM-DD格式填进去就行。搜索时大小写和连字符都不影响cve-2019-0708、CVE-2019-0708结果一样但写成cve20190708就搜不到了。调用检测模块这一步题面要的是「回显结果中最后一个单词」。这属于典型的「以你机器的实际输出为准」的题网上流传的答案不一定对得上你的环境。# 进模块 msf6 use auxiliary/scanner/rdp/cve_2019_0708_bluekeep # 看需要配哪些参数RHOSTS 是必填 msf6 show options # 配目标、跑检测 msf6 set RHOSTS 192.168.1.10 msf6 run跑完的输出通常是一句结论性的话末尾单词落在vulnerable或者patched一类词上。别背答案跑完看清楚再填。熟手的做法是把整行回显复制下来从后往前数字符避免中间有标点被漏掉。5. 避坑清单五条我真实翻过的车5.1 加固侧写了但没生效的三处现象SSH 端口改成 2222sshd_config里明明白白重启服务却起不来。原因SELinux 不允许 sshd 绑定非标准端口日志里报的是权限拒绝但systemctl status只给你一行红字。解决semanage port -a -t ssh_port_t -p tcp 2222放开端口标签或者临时setenforce 0确认是不是它在拦。确认完记得开回去赛后环境还要用。现象VSFTPD 超时配了测的时候五分钟没断。原因抄的是题面参考注释里的idle_session_timeout600那是 10 分钟。解决idle_session_timeout300。这条我建议每次改完都用grep -n timeout /etc/vsftpd/vsftpd.conf把四个参数一起打出来对一遍光看一个容易漏。现象iptables 白名单配完自己也连不上了。原因要么规则顺序反了DROP 在前要么端口写的是 22 而 SSH 已经改成了 2222要么-A追加导致新规则排在旧的 DROP 后面。解决用-I INPUT 1插到链首而不是-A追加配置前先iptables -L -n --line-numbers看清楚现有规则配完iptables-save落盘。5.2 取证侧证据链断在细节上的两处现象hashdump出来的 hash 喂给 hashcat跑了两小时没结果。原因手动从整行里切了 nthash切的时候少截或多截了字符hashcat 不校验长度只是默默跑一个错的串。解决一行原样保存让 hashcat 自己解析。真跑不出来先hashcat --identify确认格式被正确识别。现象流量分析里 FTP 登录时间填了USER那条的时间判分不对。原因USER是客户端提交用户名的时间登录成功是服务端回230的时间两者可能差几秒题目问的是「登录」成功。解决过滤器写ftp.response.code 230取那帧时间戳精确到秒。6. 收在最后改完必验的六项比多改十项更值这套题我最大的体会是分数不在你改了多少项而在你能证明多少项真的生效了。A 模块十八个动作哪怕全改完只要有三处是「写了没生效」判分照样扣。所以最后一章不讲新知识讲一套我赛后固定下来的验证动作六项每项不超过半分钟。检查项验证命令看什么密码策略net accounts/grep PASS_MIN_LEN /etc/login.defs最小值是否为 16SSH 加固ssh -p 2222 -o PreferredAuthenticationspassword userhost端口通、root 被拒、有 Banner服务超时grep -n timeout /etc/vsftpd/vsftpd.conf四个值重点看 300防火墙iptables -L INPUT -n --line-numbers顺序ACCEPT 在 DROP 之前审计策略auditpol /get /category:*登录、特权、策略、进程四项状态数据库select user,host,plugin from mysql.user;用户名新版、插件类型# 一条命令把 Linux 侧的关键项打出来赛后复盘或者赛前热身都能用 for f in /etc/login.defs /etc/ssh/sshd_config /etc/vsftpd/vsftpd.conf; do echo $f grep -nE PASS_MIN_LEN|^Port|^PermitRootLogin|^Banner|^ClientAlive|^anonymous_enable|timeout $f done iptables -L INPUT -n --line-numbers这段脚本没什么技巧就是把散落在三个文件里的关键行一次性拉出来。真正有用的是它逼你每次都看一遍——人眼扫一行配置比翻三个文件快得多也比事后拍脑袋可靠得多。回过头看我翻得最狠的一次车不在技术点上。那次我把PermitRootLogin no改了、重启了、验证了 root 登不上自我感觉非常好结果题目问的是「禁止 root 用户远程登录」而我在sshd_config里同时留着PasswordAuthentication yes判分脚本判的是整条策略的严格程度。从那以后我每次改配置都强制走一遍「改—重启—换机验证—回头看题面原文」这四步尤其是最后一步。赛题的字眼都很抠差一个词你的答案就不在采分点上。把这套流程固化下来之后A 模块我再没在「写了没生效」上丢过分。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

网络安全赛题加固题避坑:参数生效与取证流量分析

网络安全赛题加固题避坑:参数生效与取证流量分析

简介:《2021年全国职业院校技能大赛网络安全竞赛试题》面向职业院校网络安全竞赛选手、指导教师及备赛人员,围绕服务器与Web服务的安全加固、数据库权限管理、流量完整性保护、事件监控和防火墙策略等实战考点组织内容,适合赛前系统梳理与查漏…

📅 2026/10/30 8:35:49
S1切换数据转发验证:用TEID与End Marker检查点定位业务中断

S1切换数据转发验证:用TEID与End Marker检查点定位业务中断

简介:围绕S1数据转发测试的docx小结,面向移动通信核心网、无线侧测试工程师及LTE切换学习者,聚焦切换过程中用户面数据连续性验证这一关键问题。内容从数据流向入手,梳理切换前SGW经源eNodeB至终端、切换中经SGW回传再转目标eNode…

📅 2026/10/30 8:35:49
Pikachu靶场暴力破解与XSS通关配置复盘

Pikachu靶场暴力破解与XSS通关配置复盘

简介:pikachu靶场全通关教程是一份面向网络安全渗透初学者的PDF学习资料,围绕Pikachu靶场常见关卡整理通关思路与练习心得,适合刚接触Web安全、需要按模块巩固实验操作的学习者。压缩包内共1个PDF文件,大小16.9MB,内容…

📅 2026/10/30 8:35:49
MORE NEWS

更多资讯

📰

Java Swing+JDBC+MySQL毕业设计选题系统:事务控制与避坑指南

简介:这份资源是Java SwingJDBCMySQL实现的毕业设计选题管理系统完整项目包,面向计算机相关专业学生、Java桌面开发初学者及需要课程设计或毕设参考的开发者,帮助解决选题分配流程信息化的问题。系统覆盖学生选题、教师命题、管理员审核等环节…

📰

Node.js与React构建AI Agents框架:paperclip环境搭建与编排实践

1. 从"paperclip"这个名字说起:它到底想解决什么问题第一次看到"paperclip"这个项目名,我脑子里蹦出来的其实是那个经典的"回形针"思想实验——一个不断自我进化、最终把整个世界都变成回形针的AI。用这个名字给一个基于N…

📰

DeepSeek-V4-GGUF量化食谱大公开:从Q2_K到IQ2_XXS的参数优化策略

DeepSeek-V4-GGUF量化食谱大公开:从Q2_K到IQ2_XXS的参数优化策略 DeepSeek-V4-GGUF是针对DS4推理引擎优化的量化模型集合,提供从Q2_K到IQ2_XXS等多种参数优化策略,帮助用户在不同硬件配置下实现高效的文本生成能力。本文将详细解析这些量化方…

📰

Scuttlebutt: 基于社交网络的数据同步协议

Scuttlebutt: 基于社交网络的数据同步协议 Scuttlebutt 是一种基于社交网络的数据同步协议,旨在解决分布式系统中的数据同步问题。该项目最初由 Dominic Tarr 开发,并在 GitCode 上开源。 什么是 Scuttlebutt? Scuttlebutt 是一个轻量级的、去…

📰

adb logcat 命令使用

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

📰

国内环境快速搭建ESP-IDF开发框架:基于Gitee镜像的完整指南

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

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬