1. 项目概述:一次从零到一的CNVD证书实战复盘
拿到一张国家信息安全漏洞共享平台(CNVD)颁发的原创漏洞证书,对于很多刚入行的安全研究员来说,是一个极具里程碑意义的成就。它不仅是对你技术能力的官方认可,更是简历上亮眼的一笔。今天,我就来完整复盘一次我成功提交并获证的中危漏洞挖掘过程,从目标选择、信息收集、漏洞发现、报告编写到最终审核通过,把每个环节的实操细节、踩过的坑和核心技巧都摊开来讲。整个过程没有高深莫测的0day,更多的是对常见漏洞模式的深入理解和系统化的测试思路。如果你正想踏入漏洞挖掘的大门,或者提交了几次SRC报告却石沉大海,那么这篇实战记录或许能给你带来一些新的启发。
2. 前期准备与目标筛选策略
漏洞挖掘不是漫无目的地瞎碰,尤其是针对CNVD这类平台,有效的策略能极大提升成功率。我的核心思路是:避开巨头红海,深耕垂直蓝海。
2.1 为什么选择中小型厂商或特定行业应用?
很多新手一上来就盯着那些知名大厂的应用,竞争异常激烈,且它们的防护体系相对完善,对漏洞的评级也更为严格。我将目标转向了那些业务系统复杂,但安全投入可能相对有限的中小型软件厂商,特别是那些为政府、教育、医疗、企业提供办公OA、业务管理、内容发布系统的公司。这类系统通常存在几个特点:
- 功能繁多,历史包袱重:为了满足客户各种需求,系统模块多,代码迭代周期长,很多早期开发的模块安全性考虑不足。
- 使用广泛,但关注度低:在特定行业内大量部署,但不像互联网应用那样暴露在全民黑客的视线下,安全测试相对不充分。
- 框架已知,便于测试:很多基于ThinkPHP、SpringBoot、Struts2等常见框架开发,存在模式化的漏洞测试点。
我这次的目标,就是一家为众多中小企业提供“智能协同办公平台”的软件公司。通过其官网下载了最新版的试用系统进行本地搭建。
2.2 环境搭建与基础信息收集
在虚拟机中搭建测试环境是必须的,这保证了测试的合法性与可控性。我使用了Windows Server虚拟机,按照官方手册部署了Apache+PHP+MySQL的环境。
部署成功后,第一件事不是急着点按钮,而是进行信息收集:
- 指纹识别:使用浏览器插件Wappalyzer结合手动查看HTTP响应头,确认了后端是ThinkPHP 5.0.x框架。这是一个关键信息,因为该版本存在一些已知的潜在风险点。
- 目录扫描:使用
dirsearch对目标进行扫描,发现了/admin、/upload、/api、/index.php?s=(ThinkPHP的路径)等关键目录。特别注意到了/upload目录似乎可以列出文件。 - 功能点遍历:以普通用户和管理员身份(试用版有默认后台账号)登录,手工遍历了每一个功能模块。重点记录所有涉及文件上传、数据导入导出、内容编辑、用户输入、权限管理的地方,并用表格整理下来。
注意:信息收集阶段一定要细致。我曾因为忽略了一个隐藏在JS文件里的未授权API路径,而错过了一个早期的测试入口。后来养成习惯,会用
Burp Suite代理所有流量,然后查看Site map,经常能发现一些前端页面没有直接链接的接口。
3. 漏洞挖掘过程与思路拆解
我的挖掘思路遵循一个简单的链条:输入点 -> 数据流 -> 危险函数/逻辑 -> 漏洞利用。这次挖到的漏洞是一个“任意文件读取漏洞”,属于CNVD中比较常见且容易获证的类型。
3.1 发现可疑的输入点
在测试“文档管理”模块时,我发现了一个“下载附件”的功能。前端的调用链接看起来是这样的:http://test.target.com/index.php/document/download?file=202405/报告.pdf
这个file参数显然是指向服务器上的一个文件路径。我立刻产生了几个疑问:
- 这个路径是绝对路径还是相对路径?
- 有没有做路径校验或过滤?
- 能否通过目录遍历跳出限制目录?
3.2 测试与验证漏洞
我首先尝试了经典的目录遍历payload:http://test.target.com/index.php/document/download?file=../../../../../../etc/passwd
返回结果是“文件不存在”。这并不一定代表漏洞不存在,可能是过滤了..,也可能是路径拼接方式的问题。于是,我换了一种思路,尝试读取Web目录下的已知文件,比如/index.php。由于ThinkPHP的入口文件统一是index.php,我尝试了:http://test.target.com/index.php/document/download?file=./index.php
这次返回了“下载”提示,但下载下来的文件内容是乱码(因为PHP文件被服务器解析了)。这说明file参数直接参与了文件路径的拼接,并且没有限制文件类型。真正的突破点在于,我回想起ThinkPHP在接收参数时,可能会对../进行过滤,但未必会过滤ThinkPHP特有的路径标识符。
我尝试了利用ThinkPHP的@符号来指定绝对路径(在ThinkPHP的某些文件操作函数中,@开头代表绝对路径):http://test.target.com/index.php/document/download?file=@/etc/passwd
Bingo!服务器返回了Linux系统的/etc/passwd文件内容。漏洞被证实了。为了进一步验证危害,我通过读取/proc/self/environ来获取当前进程的环境变量,进而可能得到数据库连接密码等敏感信息;又通过读取/var/www/html/config/database.php(这是根据常见部署习惯猜测的路径),成功获取了数据库明文配置信息,包含主机、用户名和密码。
3.3 漏洞原理与深度分析
这个漏洞的根源在于开发人员盲目信任了前端传入的文件路径参数,并在后端使用了不安全的文件操作函数(如file_get_contents()或fopen()),且未对输入进行有效的校验和过滤。具体到代码层面,可能是这样的:
// 漏洞代码示例(推测) public function download() { $filename = input('get.file'); // 直接获取用户输入 $filepath = '/upload/' . $filename; // 简单的路径拼接 if (file_exists($filepath)) { header('Content-Type: application/octet-stream'); readfile($filepath); // 危险函数,直接读取文件内容输出 } else { $this->error('文件不存在'); } }开发者的本意是让file参数传递如202405/报告.pdf这样的相对路径。但他们没有做以下任何一项安全措施:
- 白名单校验:校验文件后缀是否在允许范围内(如.pdf, .doc, .jpg)。
- 路径净化:使用
basename()函数去除路径中的目录部分,或者严格限制路径不能包含..、/、\、@等特殊字符。 - 真实路径检查:使用
realpath()函数解析最终路径,并检查该路径是否在以安全目录(如/upload/)为前缀的范围内。
4. 漏洞报告编写与提交实战
挖到漏洞只是第一步,一份清晰、专业、符合规范的漏洞报告,是获得CNVD认可的关键。报告写得好,能极大加快审核速度。
4.1 报告结构与内容要点
我按照CNVD的提交表单,精心准备了以下内容:
- 漏洞标题:力求准确、清晰。我写的是“[厂商名]智能协同办公平台 后台download接口存在任意文件读取漏洞”。明确了厂商、系统、漏洞位置和类型。
- 漏洞类型:下拉选择“输入验证错误”下的“路径遍历”。
- 厂商及产品信息:准确填写从官网获取的厂商全称、产品名称、版本号(在关于页面找到)。
- 漏洞等级:根据漏洞影响,我自评为“中危”。因为需要知道后台路径(本例中后台地址固定)或利用其他漏洞结合,才能未授权访问到此接口。如果存在未授权访问,则可评为高危。
- 漏洞描述:
- 概述:用一两句话说明漏洞是什么,影响什么。
- 细节:详细描述存在漏洞的功能模块(文档管理->下载附件)、触发漏洞的请求参数(
file)、以及未做过滤的情况。 - 原理:简要分析代码层面的不安全操作。
- 漏洞证明(PoC):这是报告的核心,必须可复现。
- 步骤:第一步,登录系统(提供测试账号);第二步,访问特定URL;第三步,展示结果。
- 请求与响应:我提供了完整的HTTP请求包(用Burp Suite复制
Copy as curl command)和服务器返回敏感文件内容的截图。关键部分用红框标出。 - 影响证明:附上了成功读取
/etc/passwd和database.php配置文件内容的截图。
- 修复建议:给出具体、可操作的方案,体现专业性。
- 代码层面:建议对
file参数进行白名单过滤,或使用安全的文件下载函数(如强制从指定安全目录读取)。 - 临时缓解:建议在Web服务器(如Nginx/Apache)配置中,对该接口的
file参数值进行正则匹配过滤,拦截包含..、/、@等字符的请求。
- 代码层面:建议对
- 相关附件:将Burp的历史请求导出为
.xml文件,将截图打包为.zip作为附件上传,方便审核人员复现。
4.2 提交过程中的注意事项与技巧
- 确保可复现:在提交前,我换了一台全新的虚拟机,从头搭建环境,严格按照PoC步骤操作,确保审核人员一定能复现。环境不稳定是导致审核失败的主要原因之一。
- 语言客观严谨:避免使用“垃圾代码”、“低级错误”等情绪化、攻击性词汇。用“存在安全缺陷”、“未进行有效校验”等中性技术语言描述。
- 关注CNVD公告:提交前,去CNVD官网搜索一下目标厂商或产品是否已有类似漏洞收录,避免重复提交。虽然重复也可能获证,但价值大打折扣。
- 耐心等待与查询:提交后,状态会经历“待审核”、“已确认”、“已归档”等。CNVD审核周期不定,短则几周,长则数月。可以定期在“我的漏洞”里查看状态,但不要频繁催问。
5. 漏洞挖掘的通用技巧与思维提升
通过这次实战,我总结了几条对新手尤为重要的通用技巧:
5.1 黑盒测试的“三板斧”
对于黑盒测试,尤其是Web应用,有三个方向永远值得深挖:
- 文件操作:所有上传、下载、导入、导出、包含(
include)、读取文件的地方。测试路径遍历、文件类型绕过、上传漏洞。 - 数据交互:所有向服务器提交数据的地方,特别是JSON/XML格式的输入。测试SQL注入、XSS、XXE、反序列化。
- 权限与身份:所有需要身份验证的接口。测试水平越权(修改他人数据)、垂直越权(普通用户执行管理员操作)、未授权访问(直接访问需登录的接口)。
5.2 学会“猜”和“拼”
信息不全时,需要大胆假设,小心求证。
- 猜路径:根据常见框架的目录结构(如
/WEB-INF/web.xml,/config/config.php)、常见配置文件(application.yml,.env)、常见备份文件后缀(.bak,.swp,.old)去尝试读取。 - 拼参数:一个接口的
id参数可能存在注入,那么同类型的type、category参数呢?一个系统的A模块存在越权,同架构的B模块很可能也存在。这是一种“漏洞模式迁移”的思维。
5.3 工具与手工的结合
不要过度依赖扫描器。扫描器能发现常规漏洞,但逻辑漏洞、需要多步交互的漏洞、新型的绕过手法,主要靠手工。
- Burp Suite是你的主武器:熟练使用Repeater、Intruder、Decoder、Comparer模块。用Intruder对参数进行模糊测试(Fuzzing),用Comparer对比登录前后、权限变更前后的响应差异。
- 浏览器开发者工具是显微镜:仔细查看每一个网络请求和响应,关注Cookie、Token、自定义头部。查看前端JS代码,有时能找到隐藏的API或加密解密逻辑。
- 目录扫描是地图:用
dirsearch、ffuf等工具获取网站结构全貌,但要对结果进行人工研判,区分出有价值的路由。
6. 常见问题与排查实录
在漏洞挖掘和提交过程中,你肯定会遇到各种问题。这里记录几个典型场景:
Q1:漏洞可以复现,但CNVD审核后反馈“无法复现”或“不予收录”,怎么办?A:这是最让人沮丧的情况。首先,冷静下来,从这几个方面自查:
- 环境一致性:你的PoC环境(PHP版本、中间件版本、系统配置)是否和官方环境有细微差异?某些漏洞对版本极其敏感。
- 步骤清晰度:你的报告是否遗漏了某个前置步骤?比如需要先添加一个文档,获得一个特定的ID,然后再进行下载操作。把审核人员当成完全不懂的小白,一步步教他。
- 请求准确性:你提供的请求包是否包含了所有必要的Cookie、Token、Headers?用Burp的
Copy as curl command功能能最大程度保证还原性。 - 漏洞时效性:在你提交期间,厂商是否已经悄悄修复了?提交前和审核期间,可以再测试一次。
如果自查无误,可以尝试在CNVD的反馈渠道礼貌地再次说明情况,并附上更详细的证明,例如录制一个完整的屏幕操作视频(可加速并标注关键点)作为新的附件补充提交。
Q2:挖到的漏洞感觉危害不大,比如只是一个无关紧要的信息泄露,还有必要提交吗?A:有必要,但需要包装。单个小的信息泄露(如服务器路径、中间件版本)可能评级很低。但安全是一个链条,你需要思考:
- 能否组合利用?这个泄露的路径,能否帮助你在后续的文件读取漏洞中精准定位目标?泄露的版本信息,是否对应着某个已知的公开EXP?
- 泄露的信息本身是否敏感?泄露了邮箱前缀、员工姓名,可能用于社会工程学攻击。 在报告时,可以阐述这种“潜在的风险”和“作为攻击链一环”的可能性,提升评审人员对漏洞危害的认知。
Q3:如何高效地寻找适合挖掘的目标?A:除了前面说的避开红海,还有一些方法:
- 关注行业动态:留意哪些行业正在大力推进数字化、上云,这些领域的新系统、新平台往往安全测试不充分。
- 使用网络空间测绘引擎:如
fofa.so,shodan.io。使用特征语法搜索特定产品(如body="智能协同办公平台"或title="OA系统"),可以快速找到互联网上使用了该产品的单位,观察其暴露面。 - 从开源组件入手:很多系统会使用开源编辑器、图表组件、文件处理库。研究这些常用组件的历史漏洞和最新版本,然后去网上寻找哪些系统使用了存在漏洞的旧版本。这是一种“以点破面”的高效方式。
漏洞挖掘是一场耐心、细心和思维能力的综合考验。它没有绝对的公式,但有一套可循的方法论。从这次CNVD证书的获取过程中,我最大的体会是:将基础漏洞原理吃透,配上系统化的测试流程和严谨的报告输出,远比追求炫技的零日漏洞更能带来稳定产出。当你把一个个看似简单的“任意文件读取”、“SQL注入”、“越权访问”挖深、挖透,并能清晰地向外界证明其危害时,认可和证书便是水到渠成的事情。下一步,我计划针对同一类办公系统的“工作流引擎”模块进行深入审计,那里复杂的逻辑处理往往藏着更多的业务逻辑漏洞。