You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:18:03