去年在甲方做渗透测试时,我每天至少要查几十个CVE编号。每次都要在浏览器里反复切换NVD、Exploit-DB、SecurityFocus这些网站,复制粘贴到手抽筋。更崩溃的是不同平台的数据格式不统一,整理报告时还得手动对齐漏洞名称、CVSS评分和影响范围。当时就想:要是能有个工具把这些信息聚合起来,一键生成标准格式的报告该多好?
这就是我开发CVE检索工具的初衷——一个能同时查询多个漏洞数据库,自动标准化输出结果,并支持报告导出的效率工具。经过三个月的迭代,现在这个工具已经能实现:
实测下来,原先需要20分钟的手动查询工作,现在30秒就能搞定。下面分享从技术选型到功能实现的完整过程,特别会重点讲解多源数据聚合时的那些坑。
整个系统采用微服务架构,主要分为四个模块:
mermaid复制graph TD
A[前端] -->|REST API| B[API Gateway]
B --> C[查询服务]
B --> D[缓存服务]
C --> E[第三方API适配器]
(注:实际开发中移除了mermaid图表,改用文字说明)
前端选择微信小程序+Web双端适配方案,主要考虑:
后端技术栈:
目前集成的数据源及对应处理方式:
| 数据源 | 认证方式 | 限流策略 | 数据清洗难点 |
|---|---|---|---|
| NVD官方API | API Key | 5次/秒 | JSON嵌套层级过深 |
| Vulners | OAuth2.0 | 1000次/天 | 字段命名不统一 |
| CVE Details | 无 | 需模拟浏览器访问 | 反爬虫机制 |
| Exploit-DB | Basic Auth | 未公开 | HTML非结构化数据 |
特别说明:CVE Details没有开放API,需要通过以下方式模拟合法请求:
python复制headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36',
'Accept-Language': 'en-US,en;q=0.5',
'Referer': 'https://www.cvedetails.com/'
}
核心挑战在于不同平台的字段映射。例如"漏洞名称"这个字段:
cve.description.description_data[0].valuebulletinFamilyvulnerability_name解决方案是建立统一的数据模型:
python复制class StandardVulnerability:
def __init__(self):
self.cve_id = "" # CVE-2023-1234
self.title = "" # 标准化后的漏洞名称
self.cvss_v3 = 0.0 # 最高版本分数
self.affected_products = [] # 影响产品列表
self.references = [] # 参考链接
数据聚合流程:
为避免频繁查询第三方API,设计三级缓存:
缓存更新策略:
python复制def get_cve(cve_id):
# 优先查Redis
if result := redis.get(cve_id):
return result
# 其次查本地数据库
if result := sqlite.query(cve_id):
redis.setex(cve_id, 3600, result)
return result
# 最后查第三方API
result = fetch_from_api(cve_id)
sqlite.insert(result)
redis.setex(cve_id, 3600, result)
return result
现象:同一个CVE在不同平台评分不一致
案例:CVE-2021-44228(Log4j)
处理方案:
CVE Details会检测以下特征:
我们的应对措施:
python复制def get_random_delay():
return random.uniform(0.5, 3.0)
def get_random_ua():
ua_list = load_ua_file('user_agents.txt')
return random.choice(ua_list)
由于涉及大量漏洞数据查询,特别需要注意:
输入过滤:
^CVE-\d{4}-\d{4,}$权限控制:
日志审计:
python复制# CVE ID验证示例
def is_valid_cve_id(cve_id):
pattern = r'^CVE-\d{4}-\d{4,}$'
return re.match(pattern, cve_id) is not None
经过半年生产环境运行,总结出这些最佳实践:
查询优化:
/api/batch端点(最高支持50个CVE/请求)X-RateLimit-Remaining响应头报告模板技巧:
{{ cvss_score }}等占位符移动端适配:
这个工具目前已在Github开源,对于企业用户我们还提供私有化部署方案,特别适合:
最后分享一个实用技巧:在查询结果页面长按CVSS分数,可以快速查看该评分对应的攻击复杂度、影响范围等明细参数。这个隐藏功能是我们给专业审计人员留的快捷入口。