Vulnerability Report Template Generator Pro 🛡️ Vulnerability Report Template Generator Pro Edition
📋 Report Metadata
🐛 Vulnerabilities
👁️ Live Report Preview
💾 Export & Print
Engagement & Report Metadata Live Structured Report Preview
Export & Reporting Options Download your fully formatted report across multiple professional formats or print directly to PDF.
💾 Download Markdown (.MD)
🌐 Download HTML Report
📦 Backup JSON Data
📊 Export CSV Vulnerabilities
🖨️ Print / Save as 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)}
Duplicate
Delete
Description
Business Impact
Risk Explanation
Proof of Concept (PoC)
Steps To Reproduce
Remediation
`;
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 Severity Count Description 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 ID Vulnerability Name Category Severity CVSS
`;if (vulnerabilities.length === 0) {
html += `No vulnerabilities recorded. `;
} 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 += `${escapeHtml(v.id)} ${escapeHtml(v.name)} ${escapeHtml(v.category)} ${escapeHtml(v.severity)} ${escapeHtml(v.cvss)}
`;
});
}html += `
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();
}
})();