使用Nessus API下载自定义扫描报告时附加字段不生效问题
解决Nessus导出报告字段缺失及PDF空白问题
核心原因
你当前的问题核心是Nessus v6及以上版本的/scans/{id}/export接口要求传入JSON格式的参数,而非你用的x-www-form-urlencoded表单格式,嵌套的reportContents参数在表单格式下无法被正确解析,所以你配置的额外字段不生效,PDF导出也因为缺少章节配置仅生成封面。
具体修改方案
1. CSV导出新增自定义字段修改
调整点:
- 移除请求头里的
Content-Type: application/x-www-form-urlencoded,使用requests的json参数传参,会自动设置正确的JSON请求头 - 嵌套的
reportContents参数按JSON层级构造,布尔值直接传Python的True而非字符串 - 部分Nessus版本需要显式指定
csv_columns列表,罗列出所有需要导出的表头字段
修改后的代码片段:
import time import requests import json # 替换为你的Nessus地址 url = "https://localhost:8834" def download_scan(scan_num): headers = { 'X-ApiKeys': 'accessKey=你的accessKey;secretKey=你的secretKey' } # CSV导出参数配置 data = { "format": "csv", "reportContents": { "vulnerabilitySections": { "exploitable_with": True, "references": True, "synopsis": True, "description": True, "solution": True, "see_also": True, "plugin_output": True } }, # 显式指定所有需要导出的表头,按需添加自定义字段即可 "csv_columns": [ "Plugin ID", "CVE", "CVSS v2.0 Base Score", "Risk", "Host", "Protocol", "Port", "Name", "Synopsis", "Description", "Solution", "See Also", "Plugin Output", "Exploitable With", "References" ] } res = requests.post(url + f'/scans/{scan_num}/export', json=data, verify=False, headers=headers) res.raise_for_status() export = res.json() file_id = export.get('file') # 增加等待间隔避免触发限流,新增超时判断避免死循环 retry_count = 0 max_retry = 60 while retry_count < max_retry: res = requests.get(url + f'/scans/{scan_num}/export/{file_id}/status', verify=False, headers=headers) res.raise_for_status() status = res.json()['status'] if status == 'ready': break retry_count +=1 time.sleep(2) if retry_count >= max_retry: raise Exception("报告导出超时") res = requests.get(url + f'/scans/{scan_num}/export/{file_id}/download', verify=False, headers=headers) res.raise_for_status() attachment = res.content print("Scan downloaded!!!") return attachment
2. PDF导出空白问题修复
PDF导出需要显式指定需要包含的章节、详情级别,否则默认仅生成封面和空目录,参数配置参考:
# PDF导出参数配置,替换上面data部分即可 data = { "format": "pdf", # 详情级别设为full,可选值有 [basic, standard, full] "detail_level": "full", # 指定要包含的报告章节,按需添加即可 "chapters": [ "executive_summary", "vuln_by_host", "vuln_by_plugin", "remediations", "compliance_exec" ], "reportContents": { "vulnerabilitySections": { "exploitable_with": True, "references": True, "synopsis": True, "description": True, "solution": True, "plugin_output": True }, "hostSections": { "host_information": True, "vulnerabilities": True } } }
额外注意事项
- 本地部署的Nessus和Tenable.io的接口参数略有差异,以上配置适配主流的Nessus 6.x~8.x版本
- 导出大扫描任务的PDF时,等待时间会较长,可适当调大最大重试次数
- 部分低版本Nessus不支持
csv_columns参数,仅配置reportContents即可生效
内容的提问来源于stack exchange,提问作者macai
相关产品推荐
相关产品推荐

