{"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

[![Version](https://img.shields.io/badge/version-1.0.1-blue?style=flat-square)](https://github.com/davidalvarezp/websec-audit/releases) [![License](https://img.shields.io/badge/license-MIT-green?style=flat-square)](https://github.com/davidalvarezp/websec-audit/blob/main/LICENSE) [![Bash](https://img.shields.io/badge/bash-5.0%2B-orange?style=flat-square)](https://www.gnu.org/software/bash/) [![Platform](https://img.shields.io/badge/platform-Debian%20%7C%20Ubuntu%20%7C%20Kali-lightgrey?style=flat-square)](https://github.com/davidalvarezp/websec-audit) [![CI](https://img.shields.io/github/actions/workflow/status/davidalvarezp/websec-audit/ci.yml?label=CI&style=flat-square)](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.

"},{"location":"#feature-highlights","title":"Feature highlights","text":""},{"location":"#modules-at-a-glance","title":"Modules at a glance","text":"Module 01 Reconnaissance WHOIS \u00b7 DNS \u00b7 AXFR \u00b7 Subdomains \u00b7 SPF/DMARC \u00b7 Dorks Module 02 Port Scanning nmap \u00b7 service detection \u00b7 risk analysis Module 03 Fingerprinting WhatWeb \u00b7 WAF detection \u00b7 version leakage Module 04 SSL/TLS testssl.sh \u00b7 ciphers \u00b7 cert expiry \u00b7 HSTS Module 05 HTTP Headers CSP \u00b7 cookies \u00b7 clickjacking \u00b7 redirects Module 06 Dir & File Enum gobuster \u00b7 ffuf \u00b7 40+ sensitive paths Module 07 Nikto Web server CVEs \u00b7 misconfigurations Module 08 SQL Injection sqlmap \u00b7 auto + aggressive mode Module 09 XSS dalfox \u00b7 reflected \u00b7 DOM-based Module 10 CMS Scanning WordPress \u00b7 Drupal \u00b7 Joomla \u00b7 Magento Module 11 CORS wildcard \u00b7 reflected origin \u00b7 null origin Module 12 Open Redirect 20 params \u00d7 10 payloads Module 13 SSRF AWS \u00b7 GCP \u00b7 Azure IMDS \u00b7 internal IPs Module 14 Subdomain Takeover subjack \u00b7 nuclei \u00b7 20+ services Module 15 Nuclei CVE templates \u00b7 misconfiguration scan"},{"location":"#quick-start","title":"Quick start","text":"
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":""},{"location":"changelog/#changed","title":"Changed","text":""},{"location":"changelog/#fixed","title":"Fixed","text":""},{"location":"changelog/#100-2026-01-13","title":"1.0.0 \u2014 2026-01-13","text":""},{"location":"changelog/#added_1","title":"Added","text":""},{"location":"contributing/","title":"Contributing","text":"

Contributions are welcome. This page covers everything you need to know before opening a PR.

"},{"location":"contributing/#getting-started","title":"Getting started","text":"
  1. Fork the repository on GitHub
  2. Clone your fork: git clone https://github.com/YOUR_USER/websec-audit.git
  3. Create a feature branch: git checkout -b feature/your-feature
  4. Make your changes
  5. Run shellcheck -S warning websec-audit.sh \u2014 zero warnings required
  6. Commit using conventional commits (see below)
  7. Push and open a Pull Request against main
"},{"location":"contributing/#code-style","title":"Code style","text":""},{"location":"contributing/#adding-a-new-module","title":"Adding a new module","text":"
  1. Add a toggle: MOD_MYMODULE=1
  2. Add --skip-mymodule to parse_args()
  3. Write the function:
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
  1. Call it in main() before generate_reports
  2. Add to the module table in README.md and these docs
  3. Add a CHANGELOG.md entry
"},{"location":"contributing/#commit-conventions","title":"Commit conventions","text":"
feat(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

"},{"location":"contributing/#issue-templates","title":"Issue templates","text":"

Use the GitHub issue templates:

"},{"location":"contributing/#full-guide","title":"Full guide","text":"

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.

"},{"location":"installation/#manual-install","title":"Manual install","text":""},{"location":"installation/#required-core-functionality","title":"Required (core functionality)","text":"
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":""},{"location":"reports/","title":"Reports & Output","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.

"},{"location":"reports/#html-report","title":"HTML report","text":"

The most human-friendly format. Open it in any browser \u2014 no server needed.

"},{"location":"reports/#features","title":"Features","text":""},{"location":"reports/#severity-colour-coding","title":"Severity colour coding","text":"Badge Severity Meaning CRITICAL Critical Immediate exploitation risk. Fix before going live. HIGH High Significant security risk. Fix urgently. MEDIUM Medium Notable risk. Fix in next release cycle. LOW Low Minor risk or best-practice violation. INFO Info Informational only. No direct security impact."},{"location":"reports/#json-report","title":"JSON report","text":"

Fully structured, machine-readable report. Ideal for:

"},{"location":"reports/#schema","title":"Schema","text":"
{\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.

"},{"location":"usage/#module-control","title":"Module control","text":"

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>.

"},{"location":"modules/#module-table","title":"Module table","text":"# 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 WordPress wp-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 MEDIUM

WordPress-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:

"},{"location":"modules/cms/#output-files","title":"Output files","text":"
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.

"},{"location":"modules/cors/#checks-and-findings","title":"Checks and findings","text":"Condition Severity Attacker origin reflected in 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":""},{"location":"modules/cors/#output-files","title":"Output files","text":"
misc/\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:

CriticalHighMediumLow / Info Path Why /.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.

"},{"location":"modules/fingerprint/#waf-detection","title":"WAF detection","text":"

Uses wafw00f to identify the presence and type of Web Application Firewall.

Condition Severity No WAF detected LOW WAF identified INFO

A 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

Condition Severity Version-leaking header present LOW"},{"location":"modules/fingerprint/#fallback","title":"Fallback","text":"

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.

"},{"location":"modules/fingerprint/#output-files","title":"Output files","text":"
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 Notes Content-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 Severity unsafe-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:

Missing flag Severity 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 Severity Cache-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":""},{"location":"modules/nikto/#mode-behaviour","title":"Mode behaviour","text":"Mode Nikto flags Normal Default plugins, 10-minute max Aggressive --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 severity vuln, 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.

"},{"location":"modules/nuclei/","title":"Module 15 \u00b7 Nuclei","text":"

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 Normal medium, high, critical Aggressive low, medium, high, critical"},{"location":"modules/nuclei/#template-categories-covered","title":"Template categories covered","text":""},{"location":"modules/nuclei/#template-updates","title":"Template updates","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).

"},{"location":"modules/nuclei/#output-files","title":"Output files","text":"
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.

"},{"location":"modules/portscan/","title":"Module 02 \u00b7 Port Scanning","text":"

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.

"},{"location":"modules/recon/#dns-record-enumeration","title":"DNS record enumeration","text":"

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:

Condition Severity No SPF record MEDIUM SPF uses +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:

"},{"location":"modules/recon/#google-dorks","title":"Google Dorks","text":"

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.

"},{"location":"modules/recon/#tools-used","title":"Tools used","text":"Tool Role Fallback 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

"},{"location":"modules/redirect/#payloads","title":"Payloads","text":"
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":"

sqlmap tests for:

"},{"location":"modules/sqli/#findings","title":"Findings","text":"Condition Severity SQL injection confirmed CRITICAL No SQLi on primary URL INFO"},{"location":"modules/sqli/#remediation","title":"Remediation","text":"

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:

"},{"location":"modules/ssl/#certificate-validity","title":"Certificate validity","text":"Condition Severity Certificate expired CRITICAL Expires in < 14 days CRITICAL Expires in < 30 days HIGH Expires in < 90 days MEDIUM Self-signed / untrusted HIGH"},{"location":"modules/ssl/#hsts","title":"HSTS","text":"Condition Severity HSTS header absent MEDIUM max-age < 15552000 (6 months) LOW"},{"location":"modules/ssl/#tool-priority","title":"Tool priority","text":"
  1. testssl.sh \u2014 comprehensive analysis, JSON output parsed automatically
  2. sslscan \u2014 protocol and cipher enumeration
  3. openssl \u2014 fallback, manual protocol checks
"},{"location":"modules/ssl/#output-files","title":"Output files","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

"},{"location":"modules/ssrf/#findings","title":"Findings","text":"Condition Severity Internal/cloud-metadata content in response CRITICAL No in-band SSRF detected INFO

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":""},{"location":"modules/ssrf/#output-files","title":"Output files","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.

"},{"location":"modules/subtakeover/#method-1-subjack","title":"Method 1 \u2014 subjack","text":"

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.

"},{"location":"modules/subtakeover/#method-3-manual-cname-analysis","title":"Method 3 \u2014 Manual CNAME analysis","text":"

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:

"},{"location":"modules/xss/#manual-reflected-xss-probe","title":"Manual reflected XSS probe","text":"

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":""},{"location":"modules/xss/#output-files","title":"Output files","text":"
vulns/xss/\n\u251c\u2500\u2500 dalfox_results.txt\n\u2514\u2500\u2500 reflected_xss.txt\n
"}]}