Vulnerability Report

Vulnerability Report Template Generator Pro

🛡️ Vulnerability Report Template Generator Pro Edition

Total Findings
0
Critical
0
High
0
Medium
0
Low / Info
0

Engagement & Report Metadata

Vulnerability Inventory

Live Structured Report Preview

Export & Reporting Options

Download your fully formatted report across multiple professional formats or print directly to PDF.

Changes saved successfully!
', steps: '1. Inject malicious payload into search parameter.\n2. Send crafted URL to victim.', remediation: 'Apply context-aware HTML entity encoding and establish a strict Content Security Policy (CSP).', references: 'https://owasp.org/www-community/attacks/xss/ | CWE-79', cwe: 'CWE-79', owasp: 'A03:2021 Injection', evidence: 'Payload execution confirmed in modern browsers.' } ];// Load from localStorage if present try { const savedState = localStorage.getItem('vrt_pro_state_data'); if (savedState) { const parsed = JSON.parse(savedState); if (parsed.meta) { metaInputIds.forEach(id => { if (parsed.meta[id] !== undefined) { const el = document.getElementById(id); if (el) el.value = parsed.meta[id]; } }); } if (Array.isArray(parsed.vulns)) { vulnerabilities = parsed.vulns; } if (parsed.theme === 'light') { container.classList.add('vrt-light-mode'); } } } catch (e) { console.error('Error loading state', e); }function saveStateToStorage() { try { const meta = {}; metaInputIds.forEach(id => { const el = document.getElementById(id); if (el) meta[id] = el.value; }); const state = { meta: meta, vulns: vulnerabilities, theme: container.classList.contains('vrt-light-mode') ? 'light' : 'dark' }; localStorage.setItem('vrt_pro_state_data', JSON.stringify(state)); } catch (e) { console.error('Error saving state', e); } }// Theme Toggle if (themeToggleBtn) { themeToggleBtn.addEventListener('click', function() { container.classList.toggle('vrt-light-mode'); saveStateToStorage(); }); }// Tabs functionality const tabBtns = container.querySelectorAll('.vrt-tab-btn'); tabBtns.forEach(btn => { btn.addEventListener('click', function() { tabBtns.forEach(b => b.classList.remove('active')); container.querySelectorAll('.vrt-tab-content').forEach(c => c.classList.remove('active')); this.classList.add('active'); const targetId = 'tab-' + this.getAttribute('data-tab'); const targetTab = document.getElementById(targetId); if (targetTab) targetTab.classList.add('active'); if (this.getAttribute('data-tab') === 'preview') { generateReportPreview(); } }); });// Auto CVSS Severity Calculator Mapper function calculateSeverityFromCVSS(scoreVal) { const score = parseFloat(scoreVal); if (isNaN(score)) return 'Medium'; if (score >= 9.0) return 'Critical'; if (score >= 7.0) return 'High'; if (score >= 4.0) return 'Medium'; if (score >= 0.1) return 'Low'; return 'Informational'; }// Render Vulnerability Management Form function renderVulnForm() { if (!vulnListContainer) return; vulnListContainer.innerHTML = ''; const searchTerm = searchVulnInput ? searchVulnInput.value.toLowerCase() : ''; let filteredVulns = vulnerabilities.map((v, idx) => ({ v, originalIndex: idx })).filter(item => { if (!searchTerm) return true; return (item.v.name && item.v.name.toLowerCase().includes(searchTerm)) || (item.v.id && item.v.id.toLowerCase().includes(searchTerm)) || (item.v.category && item.v.category.toLowerCase().includes(searchTerm)) || (item.v.component && item.v.component.toLowerCase().includes(searchTerm)); });// Sorting if (sortVulnSelect) { const sortVal = sortVulnSelect.value; const sevWeight = { Critical: 5, High: 4, Medium: 3, Low: 2, Informational: 1 }; if (sortVal === 'severity-desc') { filteredVulns.sort((a, b) => (sevWeight[b.v.severity] || 0) - (sevWeight[a.v.severity] || 0)); } else if (sortVal === 'cvss-desc') { filteredVulns.sort((a, b) => (parseFloat(b.v.cvss) || 0) - (parseFloat(a.v.cvss) || 0)); } }let counts = { Critical: 0, High: 0, Medium: 0, Low: 0, Informational: 0 }; vulnerabilities.forEach(vuln => { if (counts[vuln.severity] !== undefined) counts[vuln.severity]++; else counts.Medium++; });if (mTotal) mTotal.textContent = vulnerabilities.length; if (mCritical) mCritical.textContent = counts.Critical; if (mHigh) mHigh.textContent = counts.High; if (mMedium) mMedium.textContent = counts.Medium; if (mLow) mLow.textContent = counts.Low + counts.Informational;if (filteredVulns.length === 0) { vulnListContainer.innerHTML = '
No vulnerabilities found matching your search.
'; return; }filteredVulns.forEach(item => { const vuln = item.v; const index = item.originalIndex;const card = document.createElement('div'); card.className = 'vrt-vuln-card'; card.innerHTML = `

Finding #${index + 1}: ${escapeHtml(vuln.name)}

`; vulnListContainer.appendChild(card); }); }// Event listener on vuln container for live updates if (vulnListContainer) { vulnListContainer.addEventListener('input', function(e) { const target = e.target; const idx = parseInt(target.getAttribute('data-index'), 10); if (isNaN(idx) || !vulnerabilities[idx]) return;if (target.classList.contains('v-name')) vulnerabilities[idx].name = target.value; else if (target.classList.contains('v-id')) vulnerabilities[idx].id = target.value; else if (target.classList.contains('v-cat')) vulnerabilities[idx].category = target.value; else if (target.classList.contains('v-cvss')) { vulnerabilities[idx].cvss = target.value; const mappedSev = calculateSeverityFromCVSS(target.value); vulnerabilities[idx].severity = mappedSev; const cardEl = target.closest('.vrt-vuln-card'); if (cardEl) { const sevSelect = cardEl.querySelector('.v-sev'); if (sevSelect) sevSelect.value = mappedSev; } } else if (target.classList.contains('v-sev')) vulnerabilities[idx].severity = target.value; else if (target.classList.contains('v-vector')) vulnerabilities[idx].vector = target.value; else if (target.classList.contains('v-url')) vulnerabilities[idx].url = target.value; else if (target.classList.contains('v-component')) vulnerabilities[idx].component = target.value; else if (target.classList.contains('v-cwe')) vulnerabilities[idx].cwe = target.value; else if (target.classList.contains('v-desc')) vulnerabilities[idx].description = target.value; else if (target.classList.contains('v-impact')) vulnerabilities[idx].impact = target.value; else if (target.classList.contains('v-risk')) vulnerabilities[idx].riskExplanation = target.value; else if (target.classList.contains('v-poc')) vulnerabilities[idx].poc = target.value; else if (target.classList.contains('v-steps')) vulnerabilities[idx].steps = target.value; else if (target.classList.contains('v-remed')) vulnerabilities[idx].remediation = target.value; else if (target.classList.contains('v-refs')) vulnerabilities[idx].references = target.value; else if (target.classList.contains('v-evidence')) vulnerabilities[idx].evidence = target.value;saveStateToStorage(); });vulnListContainer.addEventListener('click', function(e) { const target = e.target; const idx = parseInt(target.getAttribute('data-index'), 10); if (isNaN(idx)) return;if (target.classList.contains('vrt-del-vuln')) { vulnerabilities.splice(idx, 1); renderVulnForm(); saveStateToStorage(); showToast('Finding deleted.'); } else if (target.classList.contains('vrt-dup-vuln')) { const clone = JSON.parse(JSON.stringify(vulnerabilities[idx])); clone.id = clone.id + '-COPY'; clone.name = clone.name + ' (Copy)'; vulnerabilities.splice(idx + 1, 0, clone); renderVulnForm(); saveStateToStorage(); showToast('Finding duplicated.'); } }); }if (addVulnBtn) { addVulnBtn.addEventListener('click', function() { const newIdNum = vulnerabilities.length + 1; vulnerabilities.push({ name: 'New Vulnerability Finding', id: 'VRT-' + String(newIdNum).padStart(3, '0'), category: 'Web Application', severity: 'Medium', cvss: '5.3', vector: 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N', url: 'https://example.com/endpoint', component: 'Input Form Component', description: 'Detailed description of the discovered security weakness.', impact: 'Potential exposure or operational impact.', riskExplanation: 'Risk reasoning description.', poc: 'Example request or command.', steps: '1. Step one\n2. Step two', remediation: 'Recommended security patch or code fix.', references: 'https://owasp.org', cwe: 'CWE-20', owasp: 'A01:2021 Broken Access Control', evidence: 'Log sample or screenshot note.' }); renderVulnForm(); saveStateToStorage(); showToast('New finding added.'); }); }if (clearAllVulnsBtn) { clearAllVulnsBtn.addEventListener('click', function() { if (confirm('Are you sure you want to clear all vulnerabilities?')) { vulnerabilities = []; renderVulnForm(); saveStateToStorage(); showToast('All findings cleared.'); } }); }if (resetStorageBtn) { resetStorageBtn.addEventListener('click', function() { if (confirm('Reset all saved data and restore defaults?')) { localStorage.removeItem('vrt_pro_state_data'); location.reload(); } }); }if (searchVulnInput) { searchVulnInput.addEventListener('input', () => renderVulnForm()); } if (sortVulnSelect) { sortVulnSelect.addEventListener('change', () => renderVulnForm()); }metaInputIds.forEach(id => { const el = document.getElementById(id); if (el) { el.addEventListener('input', saveStateToStorage); } });// Live Report Preview Generator function generateReportPreview() { if (!previewBox) return;const getVal = (id) => { const el = document.getElementById(id); return el ? el.value : ''; };const title = getVal('vrt-report-title'); const project = getVal('vrt-project-name'); const client = getVal('vrt-client-name'); const company = getVal('vrt-company-name'); const tester = getVal('vrt-tester-name'); const assessmentType = getVal('vrt-assessment-type'); const date = getVal('vrt-report-date'); const version = getVal('vrt-report-version'); const confidentiality = getVal('vrt-confidentiality');let counts = { Critical: 0, High: 0, Medium: 0, Low: 0, Informational: 0 }; vulnerabilities.forEach(v => { if (counts[v.severity] !== undefined) counts[v.severity]++; else counts.Medium++; });let html = `
${escapeHtml(confidentiality)}

${escapeHtml(title)}

Project: ${escapeHtml(project)}
Client: ${escapeHtml(client)}
Audited By: ${escapeHtml(company)} (${escapeHtml(tester)})
Assessment Date: ${escapeHtml(date)} | Version: ${escapeHtml(version)}

1. Executive Summary

During ${escapeHtml(date)}, ${escapeHtml(company)} conducted an intensive security assessment of ${escapeHtml(project)} commissioned by ${escapeHtml(client)}. The engagement utilized professional penetration testing methodologies to identify exploitable vulnerabilities and evaluate overall security posture.

A total of ${vulnerabilities.length} findings were discovered across the assessment scope, requiring prompt remediation to protect system assets and data integrity.

2. Risk Rating Summary

SeverityCountDescription
Critical${counts.Critical}Immediate exploitation possible leading to full system compromise.
High${counts.High}Severe vulnerabilities requiring urgent remediation.
Medium${counts.Medium}Moderate impact flaws exploitable under specific conditions.
Low / Info${counts.Low + counts.Informational}Minor security improvements or informational observations.

3. Vulnerability Summary Table

`;if (vulnerabilities.length === 0) { html += ``; } else { vulnerabilities.forEach(v => { let badgeClass = 'vrt-badge-low'; if (v.severity === 'Critical') badgeClass = 'vrt-badge-critical'; else if (v.severity === 'High') badgeClass = 'vrt-badge-high'; else if (v.severity === 'Medium') badgeClass = 'vrt-badge-medium'; else if (v.severity === 'Informational') badgeClass = 'vrt-badge-info';html += ` `; }); }html += `
IDVulnerability NameCategorySeverityCVSS
No vulnerabilities recorded.
${escapeHtml(v.id)}${escapeHtml(v.name)}${escapeHtml(v.category)}${escapeHtml(v.severity)}${escapeHtml(v.cvss)}

4. Detailed Findings

`;if (vulnerabilities.length === 0) { html += `

No detailed findings available.

`; } else { vulnerabilities.forEach((v, idx) => { let badgeClass = 'vrt-badge-low'; if (v.severity === 'Critical') badgeClass = 'vrt-badge-critical'; else if (v.severity === 'High') badgeClass = 'vrt-badge-high'; else if (v.severity === 'Medium') badgeClass = 'vrt-badge-medium'; else if (v.severity === 'Informational') badgeClass = 'vrt-badge-info';html += `

${escapeHtml(v.id)} - ${escapeHtml(v.name)} ${escapeHtml(v.severity)} (CVSS: ${escapeHtml(v.cvss)})

Category: ${escapeHtml(v.category)} Component: ${escapeHtml(v.component)} URL: ${escapeHtml(v.url)}

Description:
${escapeHtml(v.description)}

Business Impact:
${escapeHtml(v.impact)}

${v.steps ? `

Steps To Reproduce:

${escapeHtml(v.steps)}

` : ''} ${v.poc ? `

Proof of Concept:

${escapeHtml(v.poc)}

` : ''}

Remediation:
${escapeHtml(v.remediation)}

${v.references ? `

References:
${escapeHtml(v.references)}

` : ''}
`; }); }previewBox.innerHTML = html; }// Export Systems const exportMdBtn = document.getElementById('vrt-export-md'); const exportHtmlBtn = document.getElementById('vrt-export-html'); const exportJsonBtn = document.getElementById('vrt-export-json'); const exportCsvBtn = document.getElementById('vrt-export-csv'); const printBtn = document.getElementById('vrt-print-btn');function getProjectFilename(ext) { const projEl = document.getElementById('vrt-project-name'); const cleanName = projEl && projEl.value ? projEl.value.replace(/[^a-zA-Z0-9-_]/g, '_') : 'Project'; return `Vulnerability_Report_${cleanName}.${ext}`; }if (exportMdBtn) { exportMdBtn.addEventListener('click', function() { const getVal = (id) => document.getElementById(id) ? document.getElementById(id).value : ''; let md = `# ${getVal('vrt-report-title')}\n\n`; md += `**Project:** ${getVal('vrt-project-name')}\n`; md += `**Client:** ${getVal('vrt-client-name')}\n`; md += `**Audited By:** ${getVal('vrt-company-name')} (${getVal('vrt-tester-name')})\n`; md += `**Date:** ${getVal('vrt-report-date')} | **Version:** ${getVal('vrt-report-version')}\n\n`; md += `## Executive Summary\nAssessment type: ${getVal('vrt-assessment-type')}.\n\n`; md += `## Vulnerability Findings\n\n`;vulnerabilities.forEach(v => { md += `### ${v.id}: ${v.name}\n`; md += `- **Severity:** ${v.severity} (CVSS: ${v.cvss})\n`; md += `- **Category:** ${v.category}\n`; md += `- **Component:** ${v.component}\n`; md += `- **URL:** ${v.url}\n\n`; md += `**Description:**\n${v.description}\n\n`; md += `**Impact:**\n${v.impact}\n\n`; if (v.steps) md += `**Steps to Reproduce:**\n${v.steps}\n\n`; if (v.poc) md += `**Proof of Concept:**\n\`\`\`\n${v.poc}\n\`\`\`\n\n`; md += `**Remediation:**\n${v.remediation}\n\n---\n\n`; });const blob = new Blob([md], { type: 'text/markdown;charset=utf-8;' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = getProjectFilename('md'); a.click(); URL.revokeObjectURL(url); showToast('Markdown exported successfully.'); }); }if (exportHtmlBtn) { exportHtmlBtn.addEventListener('click', function() { generateReportPreview(); const fullHtml = `${escapeHtml(document.getElementById('vrt-report-title').value)}
${previewBox.innerHTML}
`;const blob = new Blob([fullHtml], { type: 'text/html;charset=utf-8;' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = getProjectFilename('html'); a.click(); URL.revokeObjectURL(url); showToast('HTML Report exported successfully.'); }); }if (exportJsonBtn) { exportJsonBtn.addEventListener('click', function() { const meta = {}; metaInputIds.forEach(id => { const el = document.getElementById(id); if (el) meta[id] = el.value; }); const exportData = { meta, vulnerabilities }; const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json;charset=utf-8;' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = getProjectFilename('json'); a.click(); URL.revokeObjectURL(url); showToast('JSON backup exported successfully.'); }); }if (exportCsvBtn) { exportCsvBtn.addEventListener('click', function() { let csv = 'ID,Name,Category,Severity,CVSS,URL,Component\n'; vulnerabilities.forEach(v => { csv += `"${v.id}","${(v.name || '').replace(/"/g, '""')}","${v.category}","${v.severity}","${v.cvss}","${v.url}","${(v.component || '').replace(/"/g, '""')}"\n`; }); const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = getProjectFilename('csv'); a.click(); URL.revokeObjectURL(url); showToast('CSV exported successfully.'); }); }if (printBtn) { printBtn.addEventListener('click', function() { generateReportPreview(); window.print(); }); }// Initial Render renderVulnForm(); }if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initVRTApp); } else { initVRTApp(); } })();