SQL示例-漏洞覆盖率

这些示例查询可以让您了解Security Console有多少漏洞覆盖率,以及最近添加了哪些漏洞。

所有的漏洞

安全控制台定义的漏洞是维度的,可以位于dim_vulnerability维度中。此维度公开了安全控制台覆盖的漏洞的公共属性。要获得所有漏洞的列表,可以对这个维度执行一个简单的查询:

          
sql
1
选择nexpose_id标题proofAsText描述作为描述date_publishedcvss_vector
2
severity_score严重程度pci_severity_scorepci_statusriskscore::数字0作为risk_score
3.
cvss_score::数字2作为cvss_score利用malware_kits
4
dim_vulnerability
5
订单通过标题ASC

上面的查询投射维度、格式和别名中可用的几个列,以使输出清晰。proofAsText函数将描述栏中的HTML标记剥离为纯文本格式。内置的round函数用于将risk_score和cvss_score列四舍五入到两位精度。一个简单的ORDER BY表达式按标题的字母顺序升序对结果进行排序。

最近出版的漏洞

要细化返回哪些漏洞,可以添加WHERE子句,该子句只返回最近两周发布的漏洞。要设置日期比较的范围,可以使用间隔数据类型。指PostgreSQL日期/时间类型有关使用自定义日期间隔的更多信息。

          
sql
1
选择nexpose_id标题proofAsText描述作为描述date_publishedcvss_vector
2
severity_score严重程度pci_severity_scorepci_statusriskscore::数字0作为risk_score
3.
cvss_score::数字2作为cvss_score利用malware_kits
4
dim_vulnerability
5
在哪里现在-date_published<时间间隔2周的
6
订单通过标题ASC

最近发布的Microsoft漏洞

该查询可以进一步定制,以包括对漏洞类型的过滤。dim_vulnerity_category维度提供漏洞及其类别之间的关联。这个查询返回最近发布的在microsoft相关类别中定义的漏洞:

          
sql
1
选择nexpose_id标题proofAsText描述作为描述date_publishedcvss_vector
2
severity_score严重程度pci_severity_scorepci_statusriskscore::数字0作为risk_score
3.
cvss_score::数字2作为cvss_score利用malware_kits
4
dim_vulnerability
5
在哪里现在-date_published<时间间隔2周的vulnerability_id
6
选择截然不同的vulnerability_id
7
dim_vulnerability_category
8
在哪里较低的category_name就像“微软% %”
9
10
订单通过标题ASC

由于dim_vulnerability_category维度包含所有类别关联,子选择只返回与术语“microsoft”(大小写不敏感)匹配的漏洞的不同标识符。子选择技术是避免返回重复行的理想方法,如果dim_vulnerability维度自然地与dim_vulnerability_category维度结合在一起,则可能返回重复行。

最近发布了严重的Microsoft漏洞

通过使用安全控制台的严重性描述,可以进一步缩小漏洞的搜索范围:

          
sql
1
选择nexpose_id标题proofAsText描述作为描述date_publishedcvss_vector
2
severity_score严重程度pci_severity_scorepci_statusriskscore::数字0作为risk_score
3.
cvss_score::数字2作为cvss_score利用malware_kits
4
dim_vulnerability
5
在哪里现在-date_published<时间间隔2周的严重程度“关键”vulnerability_id
6
选择截然不同的vulnerability_id
7
dim_vulnerability_category
8
在哪里较低的category_name就像“微软% %”
9
10
订单通过标题ASC

最近发布了带有cve的Microsoft漏洞

漏洞和cve之间的关系在dim_vulnerability_reference维度中存储为“引用”。这是一个一对多的维度,这意味着如果一个漏洞有多个引用,那么它将在这个表中有多个记录。因此,在SQL中有几种方法提取该数据:(1)子选择(2)用GROUP BY表达式JOIN,或(3)with表达式。您选择的方法是一种设计偏好。在这两种情况下,我们都会将多个引用折叠到一个列中,这意味着我们必须执行分组聚合。聚合函数array_aggarray_to_string函数对于执行此反规格化时格式化输出非常有用。让我们看看所有这些选项:

使用子选择

          
sql
1
选择nexpose_id标题proofAsText描述作为描述date_publishedcvss_vector
2
severity_score严重程度pci_severity_scorepci_statusriskscore::数字0作为risk_score
3.
cvss_score::数字2作为cvss_score利用malware_kits
4
选择array_to_stringarray_agg参考”、“dim_vulnerability_reference在哪里“CVE”vulnerability_iddvvulnerability_id作为cf
5
dim_vulnerability dv
6
在哪里现在-date_published<时间间隔2周的vulnerability_id
7
选择截然不同的vulnerability_id
8
dim_vulnerability_category
9
在哪里较低的category_name就像“微软% %”
10
11
订单通过标题ASC
12

在这种方法中,使用子选择来查找来自dim_vulnerability_reference维度中具有匹配源名称“CVE”的所有引用。为了比较dim_vulnerability维度中的vulnerity_id,需要使用一个名为“dv”的别名来避免歧义。由于每个漏洞都有多个潜在的CVE引用,因此需要将它们压缩为一个输出字符串。这是通过使用array_agg聚合函数实现的。它接受单个值并将它们放入一个数组中。但是,输出中将使用方括号格式化数组,因此在CSV格式中不是很清晰。为了使输出更加美观,可以使用array_to_string函数将该数组解析为带有自定义分隔符的字符串。在本例中,使用逗号作为分隔符,数组中的字段被平铺成字符串。

使用一个连接

          
sql
1
选择nexpose_id标题proofAsText描述作为描述date_publishedcvss_vector
2
severity_score严重程度pci_severity_scorepci_statusriskscore::数字0作为risk_score
3.
cvss_score::数字2作为cvss_score利用malware_kitsvcfcf
4
dim_vulnerability dv
5
加入
6
选择vulnerability_idarray_to_stringarray_agg参考”、“作为cf
7
dim_vulnerability_reference
8
在哪里“CVE”
9
集团通过vulnerability_id
10
作为vcf使用vulnerability_id
11
在哪里现在-date_published<时间间隔2周的vulnerability_id
12
选择截然不同的vulnerability_id
13
dim_vulnerability_category
14
在哪里较低的category_name就像“微软% %”
15
16
订单通过标题ASC

在这种方法中,嵌套JOIN执行搜索,为每个漏洞找到所有cve(使用上面描述的相同聚合技术)。然后,将得到的数据自然地连接起来,取出cve。

使用WITH表达式

          
sql
1
2
vulnerability_cves作为
3.
选择vulnerability_idarray_to_stringarray_agg参考”、“作为cf
4
dim_vulnerability_reference
5
在哪里“CVE”
6
集团通过vulnerability_id
7
8
选择nexpose_id标题proofAsText描述作为描述date_publishedcvss_vector
9
severity_score严重程度pci_severity_scorepci_statusriskscore::数字0作为risk_score
10
cvss_score::数字2作为cvss_score利用malware_kitsvcfcf
11
dim_vulnerability dv
12
加入vulnerability_cves vcf使用vulnerability_id
13
在哪里现在-date_published<时间间隔2周的vulnerability_id
14
选择截然不同的vulnerability_id
15
dim_vulnerability_category
16
在哪里较低的category_name就像“微软% %”
17
18
订单通过标题ASC

在这个方法中,我们利用PostgresSQL与表达式,或更正式地称为公共表表达式。该技术很简单,并在SQL查询导出示例篇文章。vulnerable _cves表达式首先执行搜索,以找到每个漏洞的所有CVEs(使用上面描述的相同聚合技术)。然后,通过vulnerable _id将此输出自然地与dim_vulnerability维度连接起来,以拉出cves列。正如您可以自己测试的那样,输出与前两种方法相同。与JOIN方法相比,您将看到一些显著的相似之处,但许多SQL开发人员会声称这种方法更具可读性。

最近KBs发表了《严重的微软漏洞》

请尝试为cve扩展上面的示例,以便自己提取Microsoft KB引用。

如您所见,定制查询以检索感兴趣的漏洞非常简单,并且可以根据您的需要进行定制。尝试查看以名称“dim_vulnerity_”开头的其他维度,以查看可供过滤的其他元数据。