CNVD证书实战复盘:从任意文件读取漏洞挖掘到报告提交全流程

发布时间:2026/7/2 22:14:46

CNVD证书实战复盘:从任意文件读取漏洞挖掘到报告提交全流程 1. 项目概述一次从零到一的CNVD证书实战复盘拿到一张国家信息安全漏洞共享平台CNVD颁发的原创漏洞证书对于很多刚入行的安全研究员来说是一个极具里程碑意义的成就。它不仅是对你技术能力的官方认可更是简历上亮眼的一笔。今天我就来完整复盘一次我成功提交并获证的中危漏洞挖掘过程从目标选择、信息收集、漏洞发现、报告编写到最终审核通过把每个环节的实操细节、踩过的坑和核心技巧都摊开来讲。整个过程没有高深莫测的0day更多的是对常见漏洞模式的深入理解和系统化的测试思路。如果你正想踏入漏洞挖掘的大门或者提交了几次SRC报告却石沉大海那么这篇实战记录或许能给你带来一些新的启发。2. 前期准备与目标筛选策略漏洞挖掘不是漫无目的地瞎碰尤其是针对CNVD这类平台有效的策略能极大提升成功率。我的核心思路是避开巨头红海深耕垂直蓝海。2.1 为什么选择中小型厂商或特定行业应用很多新手一上来就盯着那些知名大厂的应用竞争异常激烈且它们的防护体系相对完善对漏洞的评级也更为严格。我将目标转向了那些业务系统复杂但安全投入可能相对有限的中小型软件厂商特别是那些为政府、教育、医疗、企业提供办公OA、业务管理、内容发布系统的公司。这类系统通常存在几个特点功能繁多历史包袱重为了满足客户各种需求系统模块多代码迭代周期长很多早期开发的模块安全性考虑不足。使用广泛但关注度低在特定行业内大量部署但不像互联网应用那样暴露在全民黑客的视线下安全测试相对不充分。框架已知便于测试很多基于ThinkPHP、SpringBoot、Struts2等常见框架开发存在模式化的漏洞测试点。我这次的目标就是一家为众多中小企业提供“智能协同办公平台”的软件公司。通过其官网下载了最新版的试用系统进行本地搭建。2.2 环境搭建与基础信息收集在虚拟机中搭建测试环境是必须的这保证了测试的合法性与可控性。我使用了Windows Server虚拟机按照官方手册部署了ApachePHPMySQL的环境。部署成功后第一件事不是急着点按钮而是进行信息收集指纹识别使用浏览器插件Wappalyzer结合手动查看HTTP响应头确认了后端是ThinkPHP 5.0.x框架。这是一个关键信息因为该版本存在一些已知的潜在风险点。目录扫描使用dirsearch对目标进行扫描发现了/admin、/upload、/api、/index.php?sThinkPHP的路径等关键目录。特别注意到了/upload目录似乎可以列出文件。功能点遍历以普通用户和管理员身份试用版有默认后台账号登录手工遍历了每一个功能模块。重点记录所有涉及文件上传、数据导入导出、内容编辑、用户输入、权限管理的地方并用表格整理下来。注意信息收集阶段一定要细致。我曾因为忽略了一个隐藏在JS文件里的未授权API路径而错过了一个早期的测试入口。后来养成习惯会用Burp Suite代理所有流量然后查看Site map经常能发现一些前端页面没有直接链接的接口。3. 漏洞挖掘过程与思路拆解我的挖掘思路遵循一个简单的链条输入点 - 数据流 - 危险函数/逻辑 - 漏洞利用。这次挖到的漏洞是一个“任意文件读取漏洞”属于CNVD中比较常见且容易获证的类型。3.1 发现可疑的输入点在测试“文档管理”模块时我发现了一个“下载附件”的功能。前端的调用链接看起来是这样的http://test.target.com/index.php/document/download?file202405/报告.pdf这个file参数显然是指向服务器上的一个文件路径。我立刻产生了几个疑问这个路径是绝对路径还是相对路径有没有做路径校验或过滤能否通过目录遍历跳出限制目录3.2 测试与验证漏洞我首先尝试了经典的目录遍历payloadhttp://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/passwdBingo服务器返回了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.soshodan.io。使用特征语法搜索特定产品如body智能协同办公平台或titleOA系统可以快速找到互联网上使用了该产品的单位观察其暴露面。从开源组件入手很多系统会使用开源编辑器、图表组件、文件处理库。研究这些常用组件的历史漏洞和最新版本然后去网上寻找哪些系统使用了存在漏洞的旧版本。这是一种“以点破面”的高效方式。漏洞挖掘是一场耐心、细心和思维能力的综合考验。它没有绝对的公式但有一套可循的方法论。从这次CNVD证书的获取过程中我最大的体会是将基础漏洞原理吃透配上系统化的测试流程和严谨的报告输出远比追求炫技的零日漏洞更能带来稳定产出。当你把一个个看似简单的“任意文件读取”、“SQL注入”、“越权访问”挖深、挖透并能清晰地向外界证明其危害时认可和证书便是水到渠成的事情。下一步我计划针对同一类办公系统的“工作流引擎”模块进行深入审计那里复杂的逻辑处理往往藏着更多的业务逻辑漏洞。

相关新闻