{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"WebSec-Audit","text":"\ud83d\udd10 WebSec-Audit
Professional Web Security Audit Framework \u2014 modular, extensible, Bash-native
[](https://github.com/davidalvarezp/websec-audit/releases) [](https://github.com/davidalvarezp/websec-audit/blob/main/LICENSE) [](https://www.gnu.org/software/bash/) [](https://github.com/davidalvarezp/websec-audit) [](https://github.com/davidalvarezp/websec-audit/actions)Legal Notice
This tool is intended exclusively for authorised security assessments. Only run it against systems you own or have explicit written permission to test. Unauthorised use is illegal. The author assumes no liability for misuse.
"},{"location":"#what-is-websec-audit","title":"What is websec-audit?","text":"websec-audit is a Bash framework that automates comprehensive web application security audits. It integrates 15+ independent modules \u2014 from passive reconnaissance to active exploitation \u2014 and produces professional findings reports in three formats.
Designed to run on Debian, Ubuntu and Kali Linux with zero mandatory dependencies beyond curl and nmap.
Modular architecture
Enable or disable any of the 15+ modules with a single --skip-<module> flag.
Three scan modes
Normal, Aggressive and Stealth \u2014 adapt the scan depth to each engagement.
Rich reports
Interactive HTML dashboard, structured JSON and plain-text log \u2014 generated automatically.
Broad coverage
Recon \u00b7 Port scan \u00b7 SSL/TLS \u00b7 Headers \u00b7 SQLi \u00b7 XSS \u00b7 SSRF \u00b7 CORS \u00b7 CMS \u00b7 Takeover \u00b7 Nuclei
Proxy support
Route all traffic through Burp Suite or any HTTP proxy with --proxy.
Tool-agnostic
Graceful fallback when optional tools are absent. Core scan works with only curl + nmap.
git clone https://github.com/davidalvarezp/websec-audit.git\ncd websec-audit\nchmod +x install.sh websec-audit.sh\nsudo ./install.sh\n./websec-audit.sh -t https://target.com\n See Installation and Quick Start for details.
"},{"location":"#author","title":"Author","text":"Built by davidalvarezp.
github.com/davidalvarezp \u00b7 linkedin.com/in/davidalvarezp
"},{"location":"changelog/","title":"Changelog","text":"All notable changes are documented here. Format follows Keep a Changelog. Versioning follows Semantic Versioning.
"},{"location":"changelog/#101-2026-03-23","title":"1.0.1 \u2014 2026-03-23","text":""},{"location":"changelog/#added","title":"Added","text":".git, .env, AWS credentials, Dockerfiles)+all detection, DMARC p=none, 700+ Google Dorks--format json|html|txt|all flag--no-banner and --version flagsfindings.jsonl written as-discovered for resilient partial runs-A -O --script=vuln,auth, sqlmap level 5 + tamper, deep DOM XSS-sS -T2 -f, sqlmap delay, safe-freqmodule_*() function architectureadd_finding() emits structured JSONL with id, severity, module, title, description, evidence, recommendation, timestampContributions are welcome. This page covers everything you need to know before opening a PR.
"},{"location":"contributing/#getting-started","title":"Getting started","text":"git clone https://github.com/YOUR_USER/websec-audit.gitgit checkout -b feature/your-featureshellcheck -S warning websec-audit.sh \u2014 zero warnings requiredmainset -euo pipefail at the top of every script\"$var\" not $var[[ ]] for conditionslocal var then assign separately (avoids SC2155)shellcheck before every commitMOD_MYMODULE=1--skip-mymodule to parse_args()module_mymodule() {\n [[ $MOD_MYMODULE -eq 0 ]] && return\n log_section \"MODULE XX \u2014 NAME\"\n\n # your logic\n\n add_finding \"HIGH\" \"MYMODULE\" \"Title\" \"Description\" \"evidence\" \"Remediation.\"\n}\n main() before generate_reportsREADME.md and these docsCHANGELOG.md entryfeat(module): add GraphQL introspection detection\nfix(ssl): handle certificates with no expiry date\ndocs(readme): add Kali installation instructions\nrefactor(headers): extract cookie analysis into helper\n Types: feat \u00b7 fix \u00b7 docs \u00b7 refactor \u00b7 perf \u00b7 test \u00b7 chore
Use the GitHub issue templates:
The complete contributing guide is in the repository: CONTRIBUTING.md
"},{"location":"installation/","title":"Installation","text":"WebSec-Audit runs on Debian 11/12/13, Ubuntu 20.04/22.04/24.04 and Kali Linux 2023+.
"},{"location":"installation/#automatic-install-recommended","title":"Automatic install (recommended)","text":"The bundled install.sh script handles everything: APT packages, Go binaries, Ruby gems, Python packages and wordlists.
git clone https://github.com/davidalvarezp/websec-audit.git\ncd websec-audit\nchmod +x install.sh websec-audit.sh\nsudo ./install.sh\n The installer detects your architecture (amd64 / arm64) and downloads the correct pre-compiled binaries for tools not available via APT.
Install log
The installer writes a full log to /tmp/websec_install_<timestamp>.log. Check it if anything fails.
sudo apt-get install -y curl nmap\n"},{"location":"installation/#recommended-significantly-improves-coverage","title":"Recommended (significantly improves coverage)","text":"sudo apt-get install -y \\\n nikto sqlmap gobuster dirb \\\n whatweb wafw00f sslscan \\\n python3 python3-pip jq ruby \\\n dnsutils whois wordlists\n"},{"location":"installation/#optional-tools-install-individually","title":"Optional tools (install individually)","text":"testssl.shwpscandalfoxsubfindernucleidroopescan git clone --depth 1 https://github.com/drwetter/testssl.sh.git /opt/testssl.sh\nsudo ln -s /opt/testssl.sh/testssl.sh /usr/local/bin/testssl.sh\n sudo gem install wpscan --no-document\n # Download latest release for your arch\nwget https://github.com/hahwul/dalfox/releases/latest/download/dalfox_linux_amd64.tar.gz\ntar -xzf dalfox_linux_amd64.tar.gz\nsudo mv dalfox /usr/local/bin/\n wget https://github.com/projectdiscovery/subfinder/releases/latest/download/subfinder_linux_amd64.zip\nunzip subfinder_linux_amd64.zip\nsudo mv subfinder /usr/local/bin/\n wget https://github.com/projectdiscovery/nuclei/releases/latest/download/nuclei_linux_amd64.zip\nunzip nuclei_linux_amd64.zip\nsudo mv nuclei /usr/local/bin/\nnuclei -update-templates\n pip3 install droopescan\n"},{"location":"installation/#kali-linux","title":"Kali Linux","text":"Most tools are pre-installed. Run the installer to fill any remaining gaps:
sudo ./install.sh\n"},{"location":"installation/#verifying-the-installation","title":"Verifying the installation","text":"./websec-audit.sh --version\n Expected output:
websec-audit v1.0.1 \u2014 davidalvarezp\n The tool also performs a dependency check at the start of every scan, listing which tools are available and which are missing.
"},{"location":"installation/#dependency-matrix","title":"Dependency matrix","text":"Tool Required Module(s)curl \u2705 All HTTP modules nmap \u2705 Port Scanning nikto optional Nikto sqlmap optional SQL Injection gobuster optional Dir & File Enum ffuf optional Dir & File Enum (fallback) dirb optional Dir & File Enum (fallback) whatweb optional Fingerprinting wafw00f optional Fingerprinting sslscan optional SSL/TLS testssl.sh optional SSL/TLS (preferred) wpscan optional CMS \u2014 WordPress droopescan optional CMS \u2014 Drupal/Joomla dalfox optional XSS subfinder optional Reconnaissance amass optional Reconnaissance dnsrecon optional Reconnaissance subjack optional Subdomain Takeover nuclei optional Nuclei + Takeover jq optional JSON report parsing python3 optional URL encoding, HTML reports whois optional Reconnaissance dig optional DNS analysis"},{"location":"modes/","title":"Scan Modes","text":"WebSec-Audit supports three scan modes that control depth, noise and speed across all modules.
"},{"location":"modes/#normal-default","title":"Normal (default)","text":"Balanced scan suitable for most engagements. Moderate threads, mid-level tool aggression.
./websec-audit.sh -t https://target.com\n Aspect Behaviour nmap -sV -sC --open -T4 --top-ports 1000 sqlmap --level=3 --risk=2 gobuster Small wordlist, 10 threads dalfox Standard mode WhatWeb Aggression level 1 Nikto Default plugins"},{"location":"modes/#aggressive","title":"Aggressive","text":"Deepest scan. More findings, significantly more network noise. Use only when the scope explicitly permits it.
./websec-audit.sh -t https://target.com --aggressive\n./websec-audit.sh -t https://target.com --aggressive -T 20 --ports full\n Aspect Behaviour nmap Adds -A -O --script=vuln,auth,default,discovery sqlmap --level=5 --risk=3 --forms --crawl=<depth> --dbs --tamper=space2comment gobuster Large wordlist (dirbuster medium) dalfox --deep-domxss --follow-redirects WhatWeb Aggression level 3 Nikto --Plugins @@ALL Nuclei Includes low severity templates Port profile Can be combined with --ports full for -p- scan Noise warning
Aggressive mode will almost certainly trigger IDS/IPS alerts and WAF blocks. Always confirm with the client that this level of noise is within scope.
"},{"location":"modes/#stealth","title":"Stealth","text":"Slower scan designed to minimise the detection footprint. Useful for red team engagements or environments with sensitive monitoring.
./websec-audit.sh -t https://target.com --stealth\n Aspect Behaviour nmap -sS -T2 -f --data-length 32 --randomize-hosts sqlmap --delay=2 --safe-freq=3 --smart gobuster Small wordlist, reduced threads HTTP requests Longer intervals between requests Stealth limitations
Stealth mode reduces noise but does not guarantee evasion. A determined blue team will still detect the scan. For full covert operations, consider manual testing with specific targeted checks only.
"},{"location":"modes/#mode-comparison","title":"Mode comparison","text":"Feature Normal Aggressive Stealth nmap scripts default vuln + auth + discovery SYN + fragmented sqlmap level 3 5 3 sqlmap risk 2 3 2 Crawling No Yes (--depth) No Full port scan Optional Recommended Not recommended WAF evasion None None Partial Speed Medium Fast Slow Noise Medium High Low Detection risk Medium High Low-Medium"},{"location":"modes/#combining-flags","title":"Combining flags","text":"Modes can be combined with any module or output flag:
# Aggressive + custom threads + JSON only + proxy\n./websec-audit.sh -t https://target.com \\\n --aggressive -T 20 \\\n --proxy http://127.0.0.1:8080 \\\n --format json \\\n -o /tmp/red-team-audit\n"},{"location":"quickstart/","title":"Quick Start","text":"Get up and running in under 2 minutes.
Authorised targets only
Only scan systems you own or have explicit written permission to test. For practice, use DVWA, WebGoat, or a HackTheBox / TryHackMe machine.
"},{"location":"quickstart/#1-clone-and-install","title":"1. Clone and install","text":"git clone https://github.com/davidalvarezp/websec-audit.git\ncd websec-audit\nchmod +x install.sh websec-audit.sh\nsudo ./install.sh\n"},{"location":"quickstart/#2-run-your-first-scan","title":"2. Run your first scan","text":"./websec-audit.sh -t https://target.com\n The scan runs all 15 modules sequentially. Depending on the target and available tools, a standard scan takes 5\u201320 minutes.
"},{"location":"quickstart/#3-review-the-results","title":"3. Review the results","text":"When the scan finishes you will see a summary like this:
\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 TARGET : https://target.com \u2502\n \u2502 IP : 93.184.216.34 \u2502\n \u2502 RISK : HIGH \u2502\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 CRITICAL : 2 \u2502\n \u2502 HIGH : 5 \u2502\n \u2502 MEDIUM : 7 \u2502\n \u2502 LOW : 4 \u2502\n \u2502 INFO : 3 \u2502\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 TOTAL : 21 finding(s) \u2502\n \u2502 DURATION : 487s \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n HTML report : results_target_YYYYMMDD_HHMMSS/reports/report_*.html\n JSON report : results_target_YYYYMMDD_HHMMSS/reports/report_*.json\n Audit log : results_target_YYYYMMDD_HHMMSS/logs/audit_*.log\n Open the HTML report in your browser for the interactive dashboard.
"},{"location":"quickstart/#common-usage-patterns","title":"Common usage patterns","text":"Standard scanAggressive (deeper)Stealth (low noise)Through Burp SuiteSkip slow modulesJSON output onlyFull port scan./websec-audit.sh -t https://target.com\n ./websec-audit.sh -t https://target.com --aggressive -T 20\n ./websec-audit.sh -t https://target.com --stealth\n ./websec-audit.sh -t https://target.com --proxy http://127.0.0.1:8080\n ./websec-audit.sh -t https://target.com --skip-nikto --skip-sqli\n ./websec-audit.sh -t https://target.com --format json -o /tmp/audit\n ./websec-audit.sh -t https://target.com --ports full --aggressive\n"},{"location":"quickstart/#output-directory-structure","title":"Output directory structure","text":"results_target_20240101_120000/\n\u251c\u2500\u2500 logs/\n\u2502 \u251c\u2500\u2500 audit_20240101_120000.log # full timestamped log\n\u2502 \u2514\u2500\u2500 findings.jsonl # one JSON object per finding\n\u251c\u2500\u2500 recon/ WHOIS, DNS records, subdomains, WhatWeb, WAF, dorks\n\u251c\u2500\u2500 portscan/ nmap (.txt .xml .gnmap)\n\u251c\u2500\u2500 ssl/ testssl.json / sslscan.txt\n\u251c\u2500\u2500 headers/ response headers\n\u251c\u2500\u2500 dirs/ gobuster results, sensitive paths found\n\u251c\u2500\u2500 vulns/ sqlmap/, xss/, nuclei/\n\u251c\u2500\u2500 cms/ wpscan_results.json, droopescan_*.json\n\u251c\u2500\u2500 misc/ cors_tests.txt, open_redirect.txt, ssrf_tests.txt, subtakeover.txt\n\u2514\u2500\u2500 reports/\n \u251c\u2500\u2500 report_*.html \u2190 open this in your browser\n \u251c\u2500\u2500 report_*.json\n \u2514\u2500\u2500 report_*.txt\n"},{"location":"quickstart/#next-steps","title":"Next steps","text":"After every scan, WebSec-Audit generates three report formats automatically inside the output directory.
"},{"location":"reports/#output-directory","title":"Output directory","text":"results_<domain>_<timestamp>/\n\u251c\u2500\u2500 logs/\n\u2502 \u251c\u2500\u2500 audit_<timestamp>.log # live timestamped console log\n\u2502 \u2514\u2500\u2500 findings.jsonl # one JSON line per finding (written as discovered)\n\u251c\u2500\u2500 recon/\n\u251c\u2500\u2500 portscan/\n\u251c\u2500\u2500 ssl/\n\u251c\u2500\u2500 headers/\n\u251c\u2500\u2500 dirs/\n\u251c\u2500\u2500 vulns/\n\u251c\u2500\u2500 cms/\n\u251c\u2500\u2500 misc/\n\u2514\u2500\u2500 reports/\n \u251c\u2500\u2500 report_<timestamp>.html\n \u251c\u2500\u2500 report_<timestamp>.json\n \u2514\u2500\u2500 report_<timestamp>.txt\n You can override the base directory with -o /path/to/dir.
The most human-friendly format. Open it in any browser \u2014 no server needed.
"},{"location":"reports/#features","title":"Features","text":"Fully structured, machine-readable report. Ideal for:
jq{\n \"metadata\": {\n \"tool\": \"websec-audit\",\n \"version\": \"1.0.1\",\n \"author\": \"davidalvarezp\",\n \"target\": \"https://target.com\",\n \"domain\": \"target.com\",\n \"ip\": \"93.184.216.34\",\n \"start_time\": \"2026-03-23 12:00:00\",\n \"duration_secs\": 487\n },\n \"summary\": {\n \"total\": 21,\n \"critical\": 2,\n \"high\": 5,\n \"medium\": 7,\n \"low\": 4,\n \"info\": 3\n },\n \"findings\": [\n {\n \"id\": 1,\n \"severity\": \"CRITICAL\",\n \"module\": \"RECON\",\n \"title\": \"DNS Zone Transfer (AXFR) is permitted\",\n \"description\": \"Name server ns1.target.com allows AXFR \u2014 full DNS zone disclosed.\",\n \"evidence\": \"dig AXFR target.com @ns1.target.com\",\n \"recommendation\": \"Restrict AXFR to authorised secondary name servers only.\",\n \"timestamp\": \"2024-01-01T12:00:12Z\"\n }\n ]\n}\n"},{"location":"reports/#useful-jq-queries","title":"Useful jq queries","text":"# Count by severity\njq '.summary' report_*.json\n\n# List all critical findings\njq '.findings[] | select(.severity==\"CRITICAL\") | .title' report_*.json\n\n# Export findings as CSV\njq -r '.findings[] | [.id,.severity,.module,.title] | @csv' report_*.json\n\n# Filter by module\njq '.findings[] | select(.module==\"HEADERS\")' report_*.json\n"},{"location":"reports/#txt-report","title":"TXT report","text":"Full timestamped plain-text log. Contains:
Ideal for formal deliverables that require a plaintext audit trail.
"},{"location":"reports/#jsonl-findings-file","title":"JSONL findings file","text":"findings.jsonl is written as findings are discovered \u2014 one JSON object per line. This means if the scan is interrupted (Ctrl-C), you still have a valid, processable findings file.
# Count findings in a partial scan\nwc -l findings.jsonl\n\n# Pretty-print the last finding\ntail -1 findings.jsonl | jq .\n"},{"location":"reports/#controlling-report-format","title":"Controlling report format","text":"# Generate all formats (default)\n./websec-audit.sh -t https://target.com\n\n# JSON only\n./websec-audit.sh -t https://target.com --format json\n\n# HTML only\n./websec-audit.sh -t https://target.com --format html\n\n# TXT only\n./websec-audit.sh -t https://target.com --format txt\n"},{"location":"usage/","title":"All Options","text":"Complete CLI reference for WebSec-Audit.
./websec-audit.sh -t <target> [options]\n"},{"location":"usage/#required","title":"Required","text":"Flag Description -t, --target <url\\|ip> Target URL or IP address. If no scheme is provided, https:// is assumed."},{"location":"usage/#output","title":"Output","text":"Flag Default Description -o, --output <dir> ./results_<domain>_<ts> Directory where all results are saved --format <fmt> all Report format: json | html | txt | all"},{"location":"usage/#scan-options","title":"Scan options","text":"Flag Default Description -T, --threads <n> 10 Concurrent threads passed to brute-force tools -p, --ports <profile> top-1000 Port profile: top-100 | top-1000 | full --timeout <s> 10 Connection timeout in seconds for all HTTP/TCP operations --depth <n> 3 Crawl depth used in aggressive sqlmap and CMS scans --proxy <url> (none) Route all traffic through this proxy (e.g. http://127.0.0.1:8080) --aggressive off Aggressive mode \u2014 deeper scans, higher noise, more findings --stealth off Stealth mode \u2014 slower, lower detection footprint Warning
--aggressive and --stealth are mutually exclusive. If both are provided, --aggressive takes precedence.
Every module can be individually disabled. Useful for scoping an audit or skipping slow/noisy tools.
Flag Module disabled--skip-recon Reconnaissance (WHOIS, DNS, subdomain enum) --skip-portscan Port scanning (nmap) --skip-fingerprint Web fingerprinting (WhatWeb, WAF) --skip-ssl SSL/TLS analysis --skip-headers HTTP security headers --skip-dirbrute Directory & file brute-forcing --skip-nikto Nikto web scanner --skip-sqli SQL injection (sqlmap) --skip-xss XSS testing (dalfox + manual) --skip-cms CMS detection & scanning --skip-cors CORS misconfiguration tests --skip-redirect Open redirect tests --skip-ssrf SSRF tests --skip-subtakeover Subdomain takeover checks --skip-nuclei Nuclei template scan"},{"location":"usage/#wordlists","title":"Wordlists","text":"Flag Default Description --wl-dirs-small <file> /usr/share/wordlists/dirb/common.txt Small wordlist for directory brute-force (normal mode) --wl-dirs-big <file> /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt Large wordlist (aggressive mode) --wl-dns <file> /usr/share/wordlists/dnsmap.txt DNS subdomain brute-force wordlist"},{"location":"usage/#misc","title":"Misc","text":"Flag Description -v, --verbose Print verbose debug output to stdout --no-color Disable ANSI colour output (useful for piping / CI) --no-banner Suppress the ASCII banner (useful for scripting) -V, --version Print version and exit -h, --help Print usage and exit"},{"location":"usage/#examples","title":"Examples","text":"# Basic scan\n./websec-audit.sh -t https://target.com\n\n# Aggressive with 20 threads, custom output dir\n./websec-audit.sh -t https://target.com --aggressive -T 20 -o /tmp/audit\n\n# Stealth through Burp Suite\n./websec-audit.sh -t https://target.com --stealth --proxy http://127.0.0.1:8080\n\n# Skip slow modules, verbose, JSON only\n./websec-audit.sh -t https://target.com --skip-nikto --skip-sqli -v --format json\n\n# Full port scan, deep crawl\n./websec-audit.sh -t https://target.com --ports full --depth 5 --aggressive\n\n# Headers and SSL audit only (everything else skipped)\n./websec-audit.sh -t https://target.com \\\n --skip-recon --skip-portscan --skip-fingerprint \\\n --skip-dirbrute --skip-nikto --skip-sqli --skip-xss \\\n --skip-cms --skip-cors --skip-redirect --skip-ssrf \\\n --skip-subtakeover --skip-nuclei\n\n# No colour, no banner \u2014 clean output for CI/logging\n./websec-audit.sh -t https://target.com --no-color --no-banner\n"},{"location":"modules/","title":"Modules Overview","text":"WebSec-Audit is built around 15 independent modules. Each module can be enabled or disabled individually with --skip-<module>.
--skip flag Primary tools Key checks 01 Reconnaissance --skip-recon whois \u00b7 dig \u00b7 subfinder \u00b7 amass WHOIS \u00b7 DNS \u00b7 AXFR \u00b7 subdomain enum \u00b7 SPF/DMARC \u00b7 Google Dorks 02 Port Scanning --skip-portscan nmap Open ports \u00b7 service versions \u00b7 risk analysis for 20+ dangerous ports 03 Fingerprinting --skip-fingerprint whatweb \u00b7 wafw00f Tech stack \u00b7 WAF detection \u00b7 version-leaking headers 04 SSL/TLS --skip-ssl testssl.sh \u00b7 sslscan \u00b7 openssl Deprecated protocols \u00b7 weak ciphers \u00b7 cert expiry \u00b7 HSTS 05 HTTP Headers --skip-headers curl CSP \u00b7 X-Frame-Options \u00b7 cookies \u00b7 HTTP\u2192HTTPS redirect 06 Dir & File Enum --skip-dirbrute gobuster \u00b7 ffuf \u00b7 dirb Directory brute-force \u00b7 40+ sensitive path probes 07 Nikto --skip-nikto nikto Web server CVEs \u00b7 misconfigurations \u00b7 outdated software 08 SQL Injection --skip-sqli sqlmap SQLi detection \u00b7 exploitation \u00b7 database enumeration 09 XSS --skip-xss dalfox \u00b7 curl Reflected XSS \u00b7 DOM-based XSS \u00b7 common parameters 10 CMS Scanning --skip-cms wpscan \u00b7 droopescan WordPress \u00b7 Drupal \u00b7 Joomla \u00b7 Magento plugins/themes/users 11 CORS --skip-cors curl Wildcard \u00b7 reflected origin \u00b7 null origin \u00b7 credentialed 12 Open Redirect --skip-redirect curl 20 params \u00d7 10 redirect payloads 13 SSRF --skip-ssrf curl AWS/GCP/Azure IMDS \u00b7 localhost \u00b7 RFC1918 ranges 14 Subdomain Takeover --skip-subtakeover subjack \u00b7 nuclei \u00b7 dig Dangling CNAMEs across 20+ services 15 Nuclei --skip-nuclei nuclei CVE templates \u00b7 misconfiguration templates"},{"location":"modules/#execution-order","title":"Execution order","text":"Modules run sequentially in the order listed above. The output of earlier modules (subdomain list from Module 01, open ports from Module 02) is used as input for later modules.
graph LR\n A[Target Info] --> B[Recon]\n B --> C[Port Scan]\n C --> D[Fingerprint]\n D --> E[SSL/TLS]\n E --> F[Headers]\n F --> G[Dir Enum]\n G --> H[Nikto]\n H --> I[SQLi]\n I --> J[XSS]\n J --> K[CMS]\n K --> L[CORS]\n L --> M[Redirect]\n M --> N[SSRF]\n N --> O[Takeover]\n O --> P[Nuclei]\n P --> Q[Reports]"},{"location":"modules/#skipping-multiple-modules","title":"Skipping multiple modules","text":"# Quick headers + SSL check only\n./websec-audit.sh -t https://target.com \\\n --skip-recon --skip-portscan --skip-fingerprint \\\n --skip-dirbrute --skip-nikto --skip-sqli --skip-xss \\\n --skip-cms --skip-cors --skip-redirect --skip-ssrf \\\n --skip-subtakeover --skip-nuclei\n\n# Reconnaissance only (no active scanning)\n./websec-audit.sh -t https://target.com \\\n --skip-portscan --skip-fingerprint --skip-ssl \\\n --skip-headers --skip-dirbrute --skip-nikto \\\n --skip-sqli --skip-xss --skip-cms --skip-cors \\\n --skip-redirect --skip-ssrf --skip-subtakeover --skip-nuclei\n"},{"location":"modules/cms/","title":"Module 10 \u00b7 CMS Scanning","text":"Flag: --skip-cms
Detects the CMS powering the target and runs the appropriate scanner.
"},{"location":"modules/cms/#detection","title":"Detection","text":"The module detects CMS by analysing the response body and headers for known fingerprints:
CMS Detection signals WordPresswp-content, wp-includes, wordpress in body/headers Drupal sites/all/modules, Drupal.settings, X-Generator: Drupal Joomla /media/jui, generator: Joomla, cookie names Magento Mage.Cookies, /skin/frontend, magento"},{"location":"modules/cms/#wordpress-wpscan","title":"WordPress (wpscan)","text":"wpscan is run with:
Mode Flags Normal--url <target> --no-banner --format json Aggressive --enumerate ap,at,cb,dbe,u --plugins-detection aggressive Parsed results:
Condition Severity Plugin vulnerabilities found HIGH Theme vulnerabilities found MEDIUM Users enumerable via REST API MEDIUMWordPress-specific path probes:
Path Condition Severity/xmlrpc.php Accessible MEDIUM /wp-json/wp/v2/users Returns user list MEDIUM /wp-content/debug.log Accessible HIGH /?author=1 Author enumeration works LOW /wp-login.php Accessible INFO"},{"location":"modules/cms/#drupal-joomla-droopescan","title":"Drupal / Joomla (droopescan)","text":"droopescan is used for Drupal and Joomla targets, detecting:
cms/\n\u251c\u2500\u2500 wpscan_results.json\n\u251c\u2500\u2500 wpscan_console.txt\n\u251c\u2500\u2500 droopescan_drupal.json\n\u2514\u2500\u2500 droopescan_joomla.json\n"},{"location":"modules/cors/","title":"Module 11 \u00b7 CORS Misconfiguration","text":"Flag: --skip-cors
Tests the target's CORS policy against 7 adversarial origins.
"},{"location":"modules/cors/#test-origins","title":"Test origins","text":"https://evil.com\nhttps://<domain>.evil.com\nhttps://evil.<domain>\nnull\nhttps://attacker.io\nhttp://localhost\nhttps://not<domain>\n Each origin is sent in an Origin header with Access-Control-Request-Method: GET and Access-Control-Request-Headers: Authorization.
ACAO + ACAC: true CRITICAL Attacker origin reflected in ACAO (no credentials) MEDIUM Wildcard * in Access-Control-Allow-Origin MEDIUM null origin accepted HIGH"},{"location":"modules/cors/#why-cors-matters","title":"Why CORS matters","text":"A misconfigured CORS policy allows an attacker's website to make authenticated cross-origin requests on behalf of a victim user \u2014 reading sensitive API responses, exfiltrating data, or performing actions under their session.
The most critical case is:
Access-Control-Allow-Origin: https://evil.com\nAccess-Control-Allow-Credentials: true\n This combination allows a malicious site to make credentialed requests and read the responses.
"},{"location":"modules/cors/#remediation","title":"Remediation","text":"Origin against an explicit allowlist \u2014 never reflect it back directlyAccess-Control-Allow-Origin: * on endpoints that handle authenticated dataACAO: * with ACAC: true (browsers block this, but other clients do not)null originmisc/\n\u2514\u2500\u2500 cors_tests.txt\n"},{"location":"modules/dirbrute/","title":"Module 06 \u00b7 Dir & File Enumeration","text":"Flag: --skip-dirbrute
Combines wordlist-based directory brute-forcing with targeted probing of 40+ known sensitive paths.
"},{"location":"modules/dirbrute/#directory-brute-force","title":"Directory brute-force","text":"Mode Wordlist used Normal--wl-dirs-small (default: dirb/common.txt) Aggressive --wl-dirs-big (default: dirbuster/directory-list-2.3-medium.txt) Tool priority: gobuster \u2192 ffuf \u2192 dirb
# Use a custom wordlist\n./websec-audit.sh -t https://target.com --wl-dirs-small /path/to/custom.txt\n"},{"location":"modules/dirbrute/#sensitive-path-probing","title":"Sensitive path probing","text":"40+ paths are probed directly with curl regardless of the brute-force wordlist. Findings are severity-classified automatically:
/.git/HEAD Git repository exposed /.git/config Git config exposed /.env Environment file with credentials /.env.local Local environment file /.env.production Production secrets /wp-config.php WordPress database credentials /wp-config.php.bak Backup of WP config /configuration.php Joomla config /config/database.yml Rails DB config /.aws/credentials AWS credentials file /db.sql, /dump.sql, /backup.sql Database dumps Path Why /phpinfo.php, /info.php PHP environment disclosure /phpmyadmin/, /adminer.php Database admin interfaces /web.config IIS config / credentials /backup.zip, /backup.tar.gz Backup archives /console Interactive console (RCE risk) /Dockerfile, /docker-compose.yml Infrastructure secrets Path Why /admin/, /administrator/ Admin panels /.htaccess Apache config /server-status, /server-info Apache status pages /_profiler/, /_debugbar Framework debug panels /graphiql GraphQL IDE /.DS_Store Directory structure leak /package.json, /composer.json Dependency exposure Path Why /robots.txt May disclose hidden paths /sitemap.xml Site structure /api/swagger.json, /swagger-ui.html API docs /graphql GraphQL endpoint /.well-known/security.txt Security contact policy"},{"location":"modules/dirbrute/#output-files","title":"Output files","text":"dirs/\n\u251c\u2500\u2500 gobuster_dirs.txt\n\u251c\u2500\u2500 gobuster_dns.txt\n\u251c\u2500\u2500 ffuf_results.json\n\u251c\u2500\u2500 dirb_results.txt\n\u2514\u2500\u2500 sensitive_paths_found.txt # only paths that returned 200/301/302\n"},{"location":"modules/fingerprint/","title":"Module 03 \u00b7 Fingerprinting","text":"Flag: --skip-fingerprint
Identifies the technology stack, detects WAFs, and flags response headers that leak version information.
"},{"location":"modules/fingerprint/#technology-detection","title":"Technology detection","text":"Uses WhatWeb (aggression level 1 in normal mode, 3 in aggressive) to identify:
Output saved to recon/whatweb.json and recon/whatweb_brief.txt.
Uses wafw00f to identify the presence and type of Web Application Firewall.
Condition Severity No WAF detected LOW WAF identified INFOA missing WAF is flagged as Low because it means there is no automatic filtering layer between the internet and the application.
"},{"location":"modules/fingerprint/#version-leaking-headers","title":"Version-leaking headers","text":"The following response headers are checked. Any that disclose technology names or version numbers are flagged:
Server \u00b7 X-Powered-By \u00b7 X-AspNet-Version \u00b7 X-AspNetMvc-Version \u00b7 X-Generator \u00b7 X-CF-Powered-By \u00b7 Via
If whatweb is not installed, the module falls back to header-based detection using curl, scanning for technology names in the response headers and body.
recon/\n\u251c\u2500\u2500 whatweb.json\n\u251c\u2500\u2500 whatweb_brief.txt\n\u251c\u2500\u2500 waf_detection.txt\n\u2514\u2500\u2500 basic_headers_raw.txt # fallback only\n"},{"location":"modules/headers/","title":"Module 05 \u00b7 HTTP Headers","text":"Flag: --skip-headers
Audits HTTP response headers for security misconfigurations.
"},{"location":"modules/headers/#required-security-headers","title":"Required security headers","text":"Header Severity if absent NotesContent-Security-Policy MEDIUM Also audits CSP value for unsafe-inline, unsafe-eval, wildcards X-Frame-Options MEDIUM Clickjacking protection X-Content-Type-Options LOW MIME sniffing prevention Referrer-Policy LOW URL leakage control Permissions-Policy LOW Browser API restrictions Cross-Origin-Opener-Policy LOW Cross-origin isolation Cross-Origin-Resource-Policy LOW Resource access control"},{"location":"modules/headers/#csp-deep-audit","title":"CSP deep audit","text":"When CSP is present, the module further checks:
CSP Condition Severityunsafe-inline or unsafe-eval present MEDIUM Wildcard (*) in script-src or default-src HIGH"},{"location":"modules/headers/#version-leaking-headers","title":"Version-leaking headers","text":"Headers that should not be present in production:
Server \u00b7 X-Powered-By \u00b7 X-AspNet-Version \u00b7 X-AspNetMvc-Version \u00b7 X-Generator \u00b7 X-CF-Powered-By
Each flagged as LOW.
"},{"location":"modules/headers/#cookie-security-flags","title":"Cookie security flags","text":"Every Set-Cookie response header is analysed for:
HttpOnly MEDIUM Secure MEDIUM SameSite LOW SameSite=None without Secure MEDIUM"},{"location":"modules/headers/#http-https-redirect","title":"HTTP \u2192 HTTPS redirect","text":"Checks whether HTTP requests are automatically upgraded to HTTPS.
Condition Severity HTTP does not redirect to HTTPS MEDIUM"},{"location":"modules/headers/#cache-control","title":"Cache-Control","text":"Condition SeverityCache-Control header absent LOW"},{"location":"modules/headers/#output-files","title":"Output files","text":"headers/\n\u251c\u2500\u2500 response_headers.txt\n\u2514\u2500\u2500 initial_response.txt\n"},{"location":"modules/nikto/","title":"Module 07 \u00b7 Nikto","text":"Flag: --skip-nikto
Runs Nikto against the target and classifies findings by severity.
"},{"location":"modules/nikto/#what-nikto-checks","title":"What Nikto checks","text":"--Plugins @@ALL \u2014 runs every available plugin"},{"location":"modules/nikto/#severity-classification","title":"Severity classification","text":"Nikto findings are auto-classified:
Pattern in output Assigned severityvuln, exploit, inject, XSS, CVE, OSVDB-XXXX HIGH outdated, version, disclose, found, enabled MEDIUM Everything else LOW"},{"location":"modules/nikto/#output-files","title":"Output files","text":"vulns/\n\u251c\u2500\u2500 nikto.txt\n\u2514\u2500\u2500 nikto.json\n Nikto can be noisy
Nikto generates many false positives. Review each finding manually before including it in a formal report. Use --skip-nikto in quick assessments where time is limited.
Flag: --skip-nuclei
Runs the Nuclei engine against the target using the community template library.
"},{"location":"modules/nuclei/#severity-filter","title":"Severity filter","text":"Mode Templates included Normalmedium, high, critical Aggressive low, medium, high, critical"},{"location":"modules/nuclei/#template-categories-covered","title":"Template categories covered","text":"Templates are updated automatically during install.sh. To manually update:
nuclei -update-templates\n"},{"location":"modules/nuclei/#findings","title":"Findings","text":"Each Nuclei match is imported as a finding with its native severity (critical, high, medium, low, info).
vulns/nuclei/\n\u251c\u2500\u2500 nuclei_results.txt\n\u2514\u2500\u2500 nuclei_results.json\n Tip
Nuclei is also used internally by Module 14 (Subdomain Takeover) with the takeovers/ template tag.
Flag: --skip-portscan
Runs nmap against the target and performs automated risk analysis on every open port.
"},{"location":"modules/portscan/#port-profiles","title":"Port profiles","text":"--ports value nmap flag Use case top-100 --top-ports 100 Quick check top-1000 (default) --top-ports 1000 Standard full -p- Full coverage (slow)"},{"location":"modules/portscan/#mode-behaviour","title":"Mode behaviour","text":"Mode Extra flags Normal -sV -sC --open -T4 Aggressive Adds -A -O --script=vuln,auth,default,discovery Stealth -sS -T2 -f --data-length 32 --randomize-hosts"},{"location":"modules/portscan/#automated-risk-analysis","title":"Automated risk analysis","text":"Every open port is evaluated against a built-in risk table:
Port Service Severity Reason 21 FTP CRITICAL Plaintext credentials 23 Telnet CRITICAL Unencrypted remote shell 2375 Docker API CRITICAL Unauthenticated container access 445 SMB HIGH EternalBlue / ransomware risk 3306 MySQL HIGH DB exposed to internet 3389 RDP HIGH Brute-force target 5432 PostgreSQL HIGH DB exposed to internet 6379 Redis HIGH Often unauthenticated 9200 Elasticsearch HIGH Often unauthenticated 27017 MongoDB HIGH Often unauthenticated 25 SMTP MEDIUM Open relay risk 8080/8443 HTTP alt LOW Admin panel exposure"},{"location":"modules/portscan/#output-files","title":"Output files","text":"portscan/\n\u251c\u2500\u2500 nmap.txt # human-readable\n\u251c\u2500\u2500 nmap.xml # machine-readable, compatible with Metasploit\n\u2514\u2500\u2500 nmap.gnmap # grepable format\n"},{"location":"modules/recon/","title":"Module 01 \u00b7 Reconnaissance","text":"Flag: --skip-recon
The reconnaissance module performs passive and semi-passive information gathering before any active scanning begins.
"},{"location":"modules/recon/#sub-checks","title":"Sub-checks","text":""},{"location":"modules/recon/#whois-lookup","title":"WHOIS lookup","text":"Queries the WHOIS database for registrar, registrant, expiry date and nameservers. Output saved to recon/whois.txt.
Queries all major record types: A, AAAA, MX, TXT, NS, SOA, CNAME, CAA, DMARC. Output saved to recon/dns_records.txt.
SPF analysis \u2014 flags missing SPF records and dangerous +all policies:
+all HIGH No DMARC record MEDIUM DMARC p=none LOW"},{"location":"modules/recon/#dns-zone-transfer-axfr","title":"DNS Zone Transfer (AXFR)","text":"Attempts AXFR against all discovered nameservers. A successful transfer exposes the entire DNS zone.
Condition Severity AXFR permitted CRITICAL"},{"location":"modules/recon/#subdomain-enumeration","title":"Subdomain enumeration","text":"Uses multiple tools in parallel and deduplicates results into recon/subdomains.txt:
Generates a curated list of Google Dorks for manual research \u2014 not executed automatically. Saved to recon/google_dorks.txt. Categories include: information disclosure, admin panels, credentials, config files, exposed APIs.
whois WHOIS lookup None dig DNS queries host subfinder Passive subdomain enum Wordlist brute-force amass Extended passive enum Optional dnsrecon DNS standard checks Optional"},{"location":"modules/recon/#skip-this-module","title":"Skip this module","text":"./websec-audit.sh -t https://target.com --skip-recon\n"},{"location":"modules/recon/#output-files","title":"Output files","text":"recon/\n\u251c\u2500\u2500 whois.txt\n\u251c\u2500\u2500 dns_records.txt\n\u251c\u2500\u2500 axfr.txt\n\u251c\u2500\u2500 subfinder.txt\n\u251c\u2500\u2500 amass.txt\n\u251c\u2500\u2500 dnsrecon.json\n\u251c\u2500\u2500 subdomains.txt # deduplicated, used by Module 14\n\u251c\u2500\u2500 whatweb.json\n\u251c\u2500\u2500 waf_detection.txt\n\u2514\u2500\u2500 google_dorks.txt\n"},{"location":"modules/redirect/","title":"Module 12 \u00b7 Open Redirect","text":"Flag: --skip-redirect
Tests 20 common redirect parameters with 10 payload variants.
"},{"location":"modules/redirect/#parameters-tested","title":"Parameters tested","text":"next, url, redirect, redirect_uri, redirect_url, return, return_url, returnUrl, returnTo, go, goto, dest, destination, target, forward, redir, link, to, r, out, ref, continue, callback, successUrl, failureUrl
https://evil.com\n//evil.com\n///evil.com\nhttps:evil.com\n/\\evil.com\nhttps://evil.com%2F%2E%2E\n%2F%2Fevil.com\nhttps:///evil.com\n/%5Cevil.com\nhttps://evil.com@<target-domain>\n"},{"location":"modules/redirect/#findings","title":"Findings","text":"Condition Severity Redirect to external domain confirmed MEDIUM"},{"location":"modules/redirect/#remediation","title":"Remediation","text":"Validate redirect targets against an allowlist of known-safe internal paths or domains. If the application must redirect to external URLs, use an intermediate confirmation page.
"},{"location":"modules/redirect/#output-files","title":"Output files","text":"misc/\n\u2514\u2500\u2500 open_redirect.txt\n"},{"location":"modules/sqli/","title":"Module 08 \u00b7 SQL Injection","text":"Flag: --skip-sqli
Uses sqlmap to detect and confirm SQL injection vulnerabilities in the target URL.
"},{"location":"modules/sqli/#sqlmap-configuration","title":"sqlmap configuration","text":"Mode sqlmap flags Normal--batch --random-agent --level=3 --risk=2 --timeout=<n> --threads=<n> Aggressive --level=5 --risk=3 --forms --crawl=<depth> --dbs --tamper=space2comment Stealth Adds --delay=2 --safe-freq=3 --smart"},{"location":"modules/sqli/#what-is-checked","title":"What is checked","text":"--forms)--crawl)sqlmap tests for:
Use parameterised queries (prepared statements) in every database interaction. Never concatenate user-supplied input directly into SQL strings.
PHP (PDO)Python (psycopg2)Node.js (pg)$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');\n$stmt->execute([$_GET['id']]);\n cursor.execute(\"SELECT * FROM users WHERE id = %s\", (user_id,))\n const res = await client.query('SELECT * FROM users WHERE id = $1', [userId]);\n"},{"location":"modules/sqli/#output-files","title":"Output files","text":"vulns/sqlmap/\n\u251c\u2500\u2500 sqlmap_console.txt\n\u2514\u2500\u2500 <target>/ # sqlmap output directory per target\n"},{"location":"modules/ssl/","title":"Module 04 \u00b7 SSL/TLS","text":"Flag: --skip-ssl
Info
This module is automatically skipped if the target is served over plain HTTP. In that case, a HIGH finding is raised: \"Target is served over HTTP (no TLS)\".
"},{"location":"modules/ssl/#checks-performed","title":"Checks performed","text":""},{"location":"modules/ssl/#protocol-support","title":"Protocol support","text":"Flags deprecated and vulnerable protocols:
Protocol Severity SSLv2 HIGH SSLv3 HIGH TLS 1.0 HIGH TLS 1.1 HIGH TLS 1.2 \u2705 Acceptable TLS 1.3 \u2705 Preferred"},{"location":"modules/ssl/#cipher-suites","title":"Cipher suites","text":"Flags weak or broken ciphers:
max-age < 15552000 (6 months) LOW"},{"location":"modules/ssl/#tool-priority","title":"Tool priority","text":"ssl/\n\u251c\u2500\u2500 testssl.json # if testssl.sh available\n\u251c\u2500\u2500 testssl.log\n\u251c\u2500\u2500 sslscan.txt # if sslscan available\n\u2514\u2500\u2500 openssl_info.txt # fallback\n"},{"location":"modules/ssrf/","title":"Module 13 \u00b7 SSRF","text":"Flag: --skip-ssrf
Tests 25 common URL parameters with 16 SSRF payloads targeting cloud metadata services and internal network ranges.
"},{"location":"modules/ssrf/#payloads","title":"Payloads","text":"http://127.0.0.1/\nhttp://127.0.0.1:22/\nhttp://127.0.0.1:8080/\nhttp://localhost/\nhttp://[::1]/\nhttp://0.0.0.0/\nhttp://2130706433/ # 127.0.0.1 decimal\nhttp://0x7f000001/ # 127.0.0.1 hex\nhttp://169.254.169.254/ # shared IMDS\nhttp://169.254.169.254/latest/meta-data/\nhttp://169.254.169.254/latest/meta-data/iam/security-credentials/\nhttp://metadata.google.internal/\nhttp://metadata.google.internal/computeMetadata/v1/\nhttp://169.254.169.254/metadata/v1/\nhttp://192.168.0.1/\nhttp://10.0.0.1/\n"},{"location":"modules/ssrf/#detection-indicators","title":"Detection indicators","text":"The response body is scanned for these strings to detect successful SSRF:
ami-id \u00b7 instance-id \u00b7 availability-zone \u00b7 iam \u00b7 security-credentials \u00b7 computeMetadata \u00b7 root: \u00b7 daemon: \u00b7 mysql: \u00b7 127.0.0.1 \u00b7 localhost \u00b7 internal
Blind SSRF
In-band SSRF (where the response is returned directly) is what this module detects. Blind SSRF \u2014 where the server makes an out-of-band request \u2014 requires an external listener. Use Burp Collaborator or Interactsh for blind SSRF testing.
"},{"location":"modules/ssrf/#remediation","title":"Remediation","text":"misc/\n\u2514\u2500\u2500 ssrf_tests.txt\n"},{"location":"modules/subtakeover/","title":"Module 14 \u00b7 Subdomain Takeover","text":"Flag: --skip-subtakeover
Analyses the subdomain list produced by Module 01 for dangling CNAMEs pointing to deprovisioned external services.
Dependency
This module requires the subdomain list from Module 01 (recon/subdomains.txt). Run with --skip-recon only if you provide a pre-existing subdomain list.
subjack scans the subdomain list and checks each entry against its fingerprint database of known takeover-vulnerable services.
"},{"location":"modules/subtakeover/#method-2-nuclei-takeover-templates","title":"Method 2 \u2014 Nuclei takeover templates","text":"Nuclei runs against the subdomain list using the built-in takeovers/ template category.
For each subdomain with a CNAME record, the module checks whether the CNAME points to a known external service and whether the resource returns a 404/410/403/503 (indicating the resource no longer exists).
Monitored services (20+):
AWS S3 \u00b7 Elastic Beanstalk \u00b7 CloudFront \u00b7 GitHub Pages \u00b7 Heroku \u00b7 Zendesk \u00b7 Freshdesk \u00b7 HelpScout \u00b7 Surge.sh \u00b7 Netlify \u00b7 Render \u00b7 Azure Web Apps \u00b7 Azure API Management \u00b7 Shopify \u00b7 Squarespace \u00b7 Tumblr \u00b7 Ghost \u00b7 Webflow \u00b7 Fly.io \u00b7 Cloudflare Pages
"},{"location":"modules/subtakeover/#findings","title":"Findings","text":"Condition Severity Takeover confirmed (subjack / Nuclei) HIGH Dangling CNAME to known service + 404/410 HIGH"},{"location":"modules/subtakeover/#remediation","title":"Remediation","text":"Remove the DNS CNAME record for the affected subdomain, or reclaim the resource at the external service before an attacker does.
"},{"location":"modules/subtakeover/#output-files","title":"Output files","text":"misc/\n\u251c\u2500\u2500 subtakeover.txt\n\u2514\u2500\u2500 nuclei_takeover.txt\n"},{"location":"modules/xss/","title":"Module 09 \u00b7 XSS","text":"Flag: --skip-xss
Tests for reflected and DOM-based XSS using dalfox and a manual parameter probe.
"},{"location":"modules/xss/#dalfox-scan","title":"dalfox scan","text":"dalfox is run against the target URL with automatic parameter discovery.
Mode Extra flags Normal--silence --timeout <n> Aggressive --deep-domxss --follow-redirects dalfox tests for:
In addition to dalfox, the module probes common GET parameters with 8 payloads:
<script>alert(1)</script>\n'><img src=x onerror=alert(1)>\n<svg onload=alert(1)>\n\"><script>alert(1)</script>\njavascript:alert(1)\n';alert(1);//\n<details open ontoggle=alert(1)>\n<iframe srcdoc='<script>alert(1)</script>'>\n Parameters tested: q, s, search, query, keyword, id, name, page, url, ref, return, redirect, next, view, lang
If the payload is reflected verbatim in the response body, the finding is confirmed.
"},{"location":"modules/xss/#findings","title":"Findings","text":"Condition Severity XSS confirmed (dalfox or manual) HIGH"},{"location":"modules/xss/#remediation","title":"Remediation","text":"X-Content-Type-Options: nosniffvulns/xss/\n\u251c\u2500\u2500 dalfox_results.txt\n\u2514\u2500\u2500 reflected_xss.txt\n"}]}