2012-08-31 148 views
1

我目前正在使用PowerShell中的項目。該項目下載NVD數據庫XML,通過單獨的CSV掃描Nexpose掃描結果,並針對每個使用CVE編號標識的漏洞獲取CVSS評分。從XML失敗的字符串比較

看來,將表單(字符串)中的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 

當我分配一個ID CVE爲一個字符串,並試圖從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作爲字符串進行轉換,結果相同。

+0

要麼使用ISE調試和精細什麼$ cveID的價值在於前行,或者乾脆把$ cveID腳本就行了上述$ nvdxml.nvd.entry | ? ...聽起來像$ cveID沒有你期望的價值。 –

+0

我正在使用ISE進行調試,並驗證了$ cveID具有正確的值。我甚至嘗試在即時窗口中設置$ cveID,然後正常執行對XML的查詢並仍然失敗。 – user1639232

+0

沒有CSV文件就很難說出發生了什麼,所以我在這裏猜測一下。看起來您正在比較CSV文件的兩個屬性(即'$ _。「cve-id」'和'$ vid')。你不想比較一個來自CSV和另一個來自XML?此外,基於名稱,它看起來像'$ vid'可能是一個數組('$ vid = $ _。「漏洞CVE ID」')。如果這是真的,那麼它看起來像你試圖比較一個值到一個數組(即'$ _。「cve-id」-eq $ vid')。 – David

回答

0

我會把所有條目在哈希表,然後看看它通過CVE ID:是不是使用cve-id元素,我使用了event元素的id屬性

$entriesByID = @{ } 
$nvdxml.nvd.entry | 
    ForEach-Object { $entriesByID[$_.id] = $_ } 

注。

然後,你可以看看它在哈希表中的每個條目:

$entry = $entriesByID[$vid] 

如果你娶了你原來的做法,您可能正在運行到名字空間的問題。我會嘗試使用SelectNodes而不是PowerShell的虛擬XML對象屬性:

$entry = $nvdxml.SelectSingleNode('/nvd/entry[vuln:cve-id = "$vid"]') 
# or 
$entry = $nvdxml.SelectSingleNode('/nvd/entry[@id = "$vid"]')