Skip to content

Commit 8f1d141

Browse files
committed
update invicti parser to use FirstSeenDate
1 parent 367d9f8 commit 8f1d141

3 files changed

Lines changed: 31 additions & 24 deletions

File tree

dojo/tools/netsparker/parser.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,25 @@
1010
from dojo.tools.locations import LocationData
1111

1212

13+
def _parse_date(date_str):
14+
"""Parse a Netsparker/Invicti date string into a date object."""
15+
if not date_str:
16+
return None
17+
try:
18+
if "UTC" in date_str:
19+
return datetime.datetime.strptime(
20+
date_str.split(" ")[0], "%d/%m/%Y",
21+
).date()
22+
return datetime.datetime.strptime(
23+
date_str, "%d/%m/%Y %H:%M %p",
24+
).date()
25+
except ValueError:
26+
try:
27+
return date_parser.parse(date_str).date()
28+
except (ValueError, date_parser.ParserError):
29+
return None
30+
31+
1332
class NetsparkerParser:
1433
def get_scan_types(self):
1534
return ["Netsparker Scan"]
@@ -27,20 +46,7 @@ def get_findings(self, filename, test):
2746
except Exception:
2847
data = json.loads(tree)
2948
dupes = {}
30-
try:
31-
if "UTC" in data["Generated"]:
32-
scan_date = datetime.datetime.strptime(
33-
data["Generated"].split(" ")[0], "%d/%m/%Y",
34-
).date()
35-
else:
36-
scan_date = datetime.datetime.strptime(
37-
data["Generated"], "%d/%m/%Y %H:%M %p",
38-
).date()
39-
except ValueError:
40-
try:
41-
scan_date = date_parser.parse(data["Generated"])
42-
except date_parser.ParserError:
43-
scan_date = None
49+
scan_date = _parse_date(data.get("Generated"))
4450

4551
for item in data["Vulnerabilities"]:
4652
title = item["Name"]
@@ -62,6 +68,7 @@ def get_findings(self, filename, test):
6268
dupe_key = title
6369
request = item["HttpRequest"].get("Content", None)
6470
response = item["HttpResponse"].get("Content", None)
71+
finding_date = _parse_date(item.get("FirstSeenDate")) or scan_date
6572

6673
finding = Finding(
6774
title=title,
@@ -70,7 +77,7 @@ def get_findings(self, filename, test):
7077
severity=sev.title(),
7178
mitigation=mitigation,
7279
impact=impact,
73-
date=scan_date,
80+
date=finding_date,
7481
references=references,
7582
cwe=cwe,
7683
static_finding=True,

unittests/tools/test_invicti_parser.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def test_parse_file_with_one_finding(self):
1616
finding = findings[0]
1717
self.assertEqual("Medium", finding.severity)
1818
self.assertEqual(16, finding.cwe)
19-
self.assertEqual("25/06/2021", finding.date.strftime("%d/%m/%Y"))
19+
self.assertEqual("16/06/2021", finding.date.strftime("%d/%m/%Y"))
2020
self.assertIsNotNone(finding.description)
2121
self.assertGreater(len(finding.description), 0)
2222
self.assertEqual("CVSS:3.0/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:N/A:N/E:H/RL:O/RC:C", finding.cvssv3)
@@ -34,7 +34,7 @@ def test_parse_file_with_multiple_finding(self):
3434
finding = findings[0]
3535
self.assertEqual("Medium", finding.severity)
3636
self.assertEqual(16, finding.cwe)
37-
self.assertEqual("25/06/2021", finding.date.strftime("%d/%m/%Y"))
37+
self.assertEqual("16/06/2021", finding.date.strftime("%d/%m/%Y"))
3838
self.assertIsNotNone(finding.description)
3939
self.assertGreater(len(finding.description), 0)
4040
self.assertEqual("CVSS:3.0/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:N/A:N/E:H/RL:O/RC:C", finding.cvssv3)
@@ -46,7 +46,7 @@ def test_parse_file_with_multiple_finding(self):
4646
finding = findings[1]
4747
self.assertEqual("Critical", finding.severity)
4848
self.assertEqual(89, finding.cwe)
49-
self.assertEqual("25/06/2021", finding.date.strftime("%d/%m/%Y"))
49+
self.assertEqual("16/06/2021", finding.date.strftime("%d/%m/%Y"))
5050
self.assertIsNotNone(finding.description)
5151
self.assertGreater(len(finding.description), 0)
5252
self.assertEqual("CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H", finding.cvssv3)
@@ -58,7 +58,7 @@ def test_parse_file_with_multiple_finding(self):
5858
finding = findings[2]
5959
self.assertEqual("Medium", finding.severity)
6060
self.assertEqual(205, finding.cwe)
61-
self.assertEqual("25/06/2021", finding.date.strftime("%d/%m/%Y"))
61+
self.assertEqual("15/06/2021", finding.date.strftime("%d/%m/%Y"))
6262
self.assertIsNotNone(finding.description)
6363
self.assertGreater(len(finding.description), 0)
6464
self.assertEqual("CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N/E:H/RL:O/RC:C", finding.cvssv3)

unittests/tools/test_netsparker_parser.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def test_parse_file_with_one_finding(self):
1616
finding = findings[0]
1717
self.assertEqual("Medium", finding.severity)
1818
self.assertEqual(16, finding.cwe)
19-
self.assertEqual("25/06/2021", finding.date.strftime("%d/%m/%Y"))
19+
self.assertEqual("16/06/2021", finding.date.strftime("%d/%m/%Y"))
2020
self.assertIsNotNone(finding.description)
2121
self.assertGreater(len(finding.description), 0)
2222
self.assertEqual("CVSS:3.0/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:N/A:N/E:H/RL:O/RC:C", finding.cvssv3)
@@ -34,7 +34,7 @@ def test_parse_file_with_multiple_finding(self):
3434
finding = findings[0]
3535
self.assertEqual("Medium", finding.severity)
3636
self.assertEqual(16, finding.cwe)
37-
self.assertEqual("25/06/2021", finding.date.strftime("%d/%m/%Y"))
37+
self.assertEqual("16/06/2021", finding.date.strftime("%d/%m/%Y"))
3838
self.assertIsNotNone(finding.description)
3939
self.assertGreater(len(finding.description), 0)
4040
self.assertEqual("CVSS:3.0/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:N/A:N/E:H/RL:O/RC:C", finding.cvssv3)
@@ -46,7 +46,7 @@ def test_parse_file_with_multiple_finding(self):
4646
finding = findings[1]
4747
self.assertEqual("Critical", finding.severity)
4848
self.assertEqual(89, finding.cwe)
49-
self.assertEqual("25/06/2021", finding.date.strftime("%d/%m/%Y"))
49+
self.assertEqual("16/06/2021", finding.date.strftime("%d/%m/%Y"))
5050
self.assertIsNotNone(finding.description)
5151
self.assertGreater(len(finding.description), 0)
5252
self.assertEqual("CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H", finding.cvssv3)
@@ -58,7 +58,7 @@ def test_parse_file_with_multiple_finding(self):
5858
finding = findings[2]
5959
self.assertEqual("Medium", finding.severity)
6060
self.assertEqual(205, finding.cwe)
61-
self.assertEqual("25/06/2021", finding.date.strftime("%d/%m/%Y"))
61+
self.assertEqual("15/06/2021", finding.date.strftime("%d/%m/%Y"))
6262
self.assertIsNotNone(finding.description)
6363
self.assertGreater(len(finding.description), 0)
6464
self.assertEqual("CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N/E:H/RL:O/RC:C", finding.cvssv3)
@@ -100,4 +100,4 @@ def test_parse_file_issue_11020(self):
100100
finding = findings[0]
101101
self.assertEqual("Low", finding.severity)
102102
self.assertEqual(205, finding.cwe)
103-
self.assertEqual("08/10/2024", finding.date.strftime("%d/%m/%Y"))
103+
self.assertEqual("23/07/2024", finding.date.strftime("%d/%m/%Y"))

0 commit comments

Comments
 (0)