|
395 | 395 |
|
396 | 396 | const looksLikeJSMatcher = (/^\s*\[[^\]]+\].*->/i.test(finding) || (file.includes('js-') && !file.includes('trufflehog') && !file.includes('github'))) && !file.includes('trufflehog') && !file.includes('github-secrets'); |
397 | 397 | const looksLikeJSURL = file.includes('js-url') || /\.m?jsx?(\?|$)/i.test(target); |
398 | | - // Exclude JS analysis files from GitHub bucket |
| 398 | + const looksLikeJSEndpoints = file.includes('js-endpoint') || moduleNorm === 'js-endpoints'; |
| 399 | + const looksLikeKatana = file.includes('katana') || moduleNorm === 'katana-crawler' || moduleNorm === 'katana'; |
399 | 400 | const looksLikeGitHub = (file.includes('github') || file.includes('trufflehog') || file.includes('secrets_table') || file.includes('github-secrets') || (file.includes('secrets') && file.endsWith('.json'))) && !file.startsWith('js-'); |
400 | 401 |
|
401 | 402 | if (looksLikeGitHub) kind = 'github-scan'; |
| 403 | + else if (looksLikeJSEndpoints) kind = 'js-endpoints'; |
| 404 | + else if (looksLikeKatana) kind = 'katana-crawler'; |
402 | 405 | else if (looksLikeJSMatcher) kind = 'js-analysis'; |
403 | 406 | else if (looksLikeJSURL && kind === 'other') kind = 'js_urls'; |
404 | 407 | if (isAPKScan) kind = 'apkx'; |
405 | 408 |
|
406 | 409 | // Do not treat GitHub/TruffleHog rows as JS just because the blob URL ends in .js |
407 | | - const isJS = kind !== 'github-scan' && (kind === 'js_urls' || looksLikeJSURL); |
| 410 | + const isJS = kind !== 'github-scan' && kind !== 'js-endpoints' && kind !== 'katana-crawler' && (kind === 'js_urls' || looksLikeJSURL); |
408 | 411 | if (kind === 'js_urls') kind = 'urls'; |
409 | 412 |
|
410 | 413 | let normalizedModule = isAPKScan ? 'apkx' : moduleNorm; |
411 | 414 | if (kind === 'github-scan') { |
412 | 415 | normalizedModule = 'github-scan'; |
| 416 | + } else if (kind === 'js-endpoints') { |
| 417 | + normalizedModule = 'js-endpoints'; |
| 418 | + } else if (kind === 'katana-crawler') { |
| 419 | + normalizedModule = 'katana-crawler'; |
413 | 420 | } else if (moduleNorm === 'unknown' && (kind === 'js-analysis' || isJS)) { |
414 | 421 | normalizedModule = 'js-analysis'; |
415 | 422 | } |
|
457 | 464 | assets: '🏠 Assets', |
458 | 465 | urls: '🔗 Links', |
459 | 466 | apkx: '📱 APK Analysis', |
460 | | - 'js-analysis': '📜 JS Analysis', |
| 467 | + 'js-analysis': '📜 JS Secrets', |
| 468 | + 'js-endpoints': '🛣️ JS Endpoints', |
| 469 | + 'katana-crawler': '🕷️ Katana', |
461 | 470 | 'gf-patterns': '🎯 GF Patterns', |
462 | 471 | nuclei: '☢️ Nuclei', |
463 | 472 | ffuf: '🎲 FFUF', |
464 | 473 | buckets: '🪣 S3 Buckets', |
465 | 474 | ports: '📡 Ports', |
466 | 475 | reflection: '🔎 Reflection', |
| 476 | + 'xss-detection': '🐛 XSS (Dalfox)', |
467 | 477 | 'github-scan': '🐦 GitHub Secrets', |
468 | 478 | other: '📁 Other', |
469 | 479 | github: '🐙 GitHub Secrets', |
|
478 | 488 |
|
479 | 489 | dynamicKinds.forEach(k => { |
480 | 490 | if (k === 'subdomains' || k === 'assets' || k === 'vuln' || VULN_KINDS.has(k) || k === 'github-scan') { |
481 | | - if (['js-analysis', 'gf-patterns', 'nuclei', 'ffuf', 'reflection', 'github-scan', 'github'].includes(k)) { |
| 491 | + if (['js-analysis', 'js-endpoints', 'katana-crawler', 'gf-patterns', 'nuclei', 'ffuf', 'reflection', 'xss-detection', 'github-scan', 'github'].includes(k)) { |
482 | 492 | DATASET_TABS.push([k, TAB_LABELS[k] || k]); |
483 | 493 | } |
484 | 494 | return; |
|
501 | 511 |
|
502 | 512 | const preferredModuleOrder = [ |
503 | 513 | 'nuclei', 'gf-patterns', 'misconfig', 'ffuf-fuzzing', 'dns-takeover', |
504 | | - 'backup-detection', 'js-analysis', 'xss-detection', 'sql-detection', |
| 514 | + 'backup-detection', 'js-analysis', 'js-endpoints', 'katana-crawler', 'xss-detection', 'sql-detection', |
505 | 515 | 's3-scan', 'port-scan', 'zerodays', 'aem', 'github-scan' |
506 | 516 | ]; |
507 | 517 | const usedModulesRaw = [...new Set(allRows.map(r => window.normalizeModuleKey(r.module)).filter(Boolean))]; |
|
513 | 523 | if (bi !== -1) return 1; |
514 | 524 | return a.localeCompare(b); |
515 | 525 | }); |
516 | | - const excludedModuleTabs = new Set(['autoar', 'unknown', 'tech-detect', 'ffuf-fuzzing', 'js-analysis', 'github-scan', 'nuclei', 'ffuf', 'reflection', 'js-analysis']); |
| 526 | + const excludedModuleTabs = new Set(['autoar', 'unknown', 'tech-detect', 'ffuf-fuzzing', 'js-analysis', 'js-endpoints', 'katana-crawler', 'xss-detection', 'github-scan', 'nuclei', 'ffuf', 'reflection']); |
517 | 527 | const hasUrlsDatasetTab = UNIQUE_TABS.some((t) => t[0] === 'urls'); |
518 | 528 | if (hasUrlsDatasetTab) excludedModuleTabs.add('url-collection'); |
519 | 529 | const hasApkxDatasetTab = UNIQUE_TABS.some((t) => t[0] === 'apkx'); |
|
0 commit comments