我目前正在 PowerShell 中开发一个项目。该项目下载 NVD 数据库 XML,通过单独的 CSV 循环获取来自 Nexpose 的扫描结果,并为每个用 CVE 编号标识的漏洞提取 CVSS 分数。
似乎将工作表中的 CVE 编号(字符串)与 XML 中的 CVE 编号(也是一个字符串)匹配完全失败了。我正在使用的代码如下:
clear
[xml]$nvdxml = (New-Object system.Net.WebClient).DownloadString("http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-recent.xml")
$nsmgr = New-Object System.XML.XmlNamespaceManager($nvdxml.NameTable)
$nsmgr.AddNamespace('xsi','http://www.w3.org/2001/XMLSchema-instance')
$nsmgr.AddNamespace('vuln','http://scap.nist.gov/schema/vulnerability/0.4')
$nsmgr.AddNamespace('cvss','http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-recent.xml')
$nsmgr.AddNamespace('df','http://scap.nist.gov/schema/feed/vulnerability/2.0')
$nvdxml.SelectNodes('//vuln:product',$nsmgr) | out-null
$nvdxml.SelectNodes('//vuln:vulnerable-configuration',$nsmgr) | out-null
$nvdxml.SelectNodes('//vuln:vulnerable-software-list',$nsmgr) | out-null
$nvdxml.SelectNodes('//default:nvd',$nsmgr) | out-null
$nvdxml.SelectNodes('//default:entry',$nsmgr) | out-null
$x = import-csv "test-report.csv"
$items = @()
$x | where {$_."Vulnerability Test Result Code" -like "v*"} | %{
$item = @{}
$vid = $_."Vulnerability CVE IDs"
$entry = ""
$item["Vname"] = $_."Vulnerability Title"
$item["VNode"] = $_."Asset IP Address"
$item['VID'] = $vid
$entry = $nvdxml.nvd.entry | where { $_."cve-id" -eq $vid }
$item['Score'] = $entry.cvss.base_metrics.score
$items += $item
}
$items
$items 数组包含一个具有 CVE ID 的漏洞,但字符串比较完全失败。当我查询对象的类型时,我得到
You cannot call a method on a null-valued expression.
At line:25 char:19
+ $entry.GetType <<<< ()
+ CategoryInfo : InvalidOperation: (GetType:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
当我将 CVE ID 分配给字符串并尝试从 XML 中获取该字符串的相关漏洞时,比较没有返回结果;然而,当我用相同 ID 的引号字符串替换变量时,查询返回正确的结果。所以,这会失败
$cveID = "CVE-2003-1567"
$nvdxml.nvd.entry | where { $_."cve-id" -eq $cveID }
但是,这很好用
$nvdxml.nvd.entry | where { $_."cve-id" -eq "CVE-2003-1567" }
有任何想法吗?我尝试将 $_."cve-id" 和 $cveID 显式转换为 String ,结果相同。