People often search for “OWASP bWAPP,” but the distinction matters: bWAPP was created as part of ITSEC GAMES and is not maintained by OWASP. OWASP lists it in the Vulnerable Web Applications Directory. The official bWAPP v2.2 archive was published in November 2014, so a modern installation is mainly a compatibility exercise. Use the original source for provenance, bee-box for a prebuilt historical environment, or a clearly labeled community container for a quick local lab.
Fastest bWAPP setup: Docker, installer, and login
Already have Docker, Docker Compose, and Git? The block below clones the community-maintained PHP 7.4 adaptation, records the exact Git commit for repeatability, and replaces its default Compose exposure with a localhost-only configuration. The database remains inside Docker and is not published to the host.
git clone https://github.com/lmoroz/bWAPP.git bwapp-lab
cd bwapp-lab
git rev-parse HEAD | tee BWAPP_COMMIT.txt
cat > compose.local.yml <<'YAML'
services:
web:
build: .
image: bwapp-local:php74
ports:
- "127.0.0.1:8080:80"
depends_on:
- db
environment:
MYSQL_HOST: db
MYSQL_USER: root
db:
image: mysql:5.7
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
volumes:
- bwapp_db_data:/var/lib/mysql
volumes:
bwapp_db_data:
YAML
docker compose -f compose.local.yml up -d --build
docker compose -f compose.local.yml psVisit the local install.php page and use its installation link to create the training database.
Use the direct login URL after the installer reports success.
Use bee as the username and bug as the password, or create a disposable local learner account.
Keep the recorded commit, document observations, and remove the volume when you need a clean lab.
# Show status and recent logs docker compose -f compose.local.yml ps docker compose -f compose.local.yml logs --tail 120 # Stop the lab but keep its database docker compose -f compose.local.yml stop # Start it again later docker compose -f compose.local.yml start # Remove containers and the training database docker compose -f compose.local.yml down -v
What bWAPP is—and what it is not
bWAPP means “buggy web application.” It is a free, open-source PHP/MySQL application intentionally built with vulnerable behavior for authorized education. The project and OWASP’s directory describe more than 100 exercises spanning injection, scripting, authentication, authorization, file handling, server-side request forgery, XML, web services, parameter tampering, insecure configuration, and other historical web-security topics.
Useful for fundamentals
The exercise menu and security-level selector help learners compare vulnerable behavior with partial and stronger controls.
Useful for request analysis
Browser developer tools or a local intercepting proxy can show how input, cookies, parameters, and responses change.
Legacy by design
The official v2.2 archive dates to November 2, 2014. Containers or bee-box reduce compatibility work, but they do not modernize the underlying lessons.
Not a complete 2026 curriculum
bWAPP predates the OWASP Top 10:2025 and modern API, cloud, identity, supply-chain, and software-delivery practices. Use it as one lab, not as a complete security program.
The most accurate phrasing is: bWAPP is listed by OWASP, but it is not an OWASP-maintained application. That distinction improves technical accuracy and avoids implying that every exercise maps directly to the current OWASP Top 10.
Which bWAPP installation method should you choose?
| Method | Best for | Advantages | Main limitation |
|---|---|---|---|
| Reviewed community Docker build | Fast local labs on Linux, macOS, or Windows | Repeatable setup and easy reset | Not an official release; review and record the exact commit |
| Official bWAPP v2.2 ZIP | Source review and custom LAMP/WAMP/XAMPP work | Canonical original project files | Legacy PHP/MySQL compatibility requires more work |
| bee-box VM | Courses that expect the historical prebuilt environment | No separate application installation | Old guest OS and services; host-only networking is essential |
| OWASP Broken Web Apps VM | Older courses that use several labs in one appliance | Multiple vulnerable applications | Outdated image and a larger exposed surface |
For most readers, a localhost-only Docker build is the simplest option. Use the official ZIP when provenance or source inspection matters. Use bee-box only when a course expects it or when the original environment is more important than modern host integration.
Install bWAPP on Ubuntu, RHEL, Kali Linux, or Windows
The bWAPP application steps remain the same after Docker is available. What changes is the supported installation method for Docker and Compose on each operating system. Before copying commands, confirm that your OS release is supported by the current vendor documentation.
Ubuntu: Docker’s official repository
Use Docker’s official Ubuntu repository, verify the engine, then clone the community bWAPP build and apply the localhost-only Compose file.
sudo apt update
sudo apt install -y ca-certificates curl git
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker run --rm hello-world
sudo git clone https://github.com/lmoroz/bWAPP.git /opt/bwapp-lab
cd /opt/bwapp-lab
sudo git rev-parse HEAD | sudo tee BWAPP_COMMIT.txt
sudo tee compose.local.yml >/dev/null <<'YAML'
services:
web:
build: .
image: bwapp-local:php74
ports:
- "127.0.0.1:8080:80"
depends_on:
- db
environment:
MYSQL_HOST: db
MYSQL_USER: root
db:
image: mysql:5.7
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
volumes:
- bwapp_db_data:/var/lib/mysql
volumes:
bwapp_db_data:
YAML
sudo docker compose -f compose.local.yml up -d --buildOn a headless host, keep the container bound to loopback and use an SSH local port forward rather than changing it to 0.0.0.0.
RHEL: Docker’s official RPM repository
sudo dnf -y install git dnf-plugins-core
sudo dnf config-manager --add-repo \
https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker run --rm hello-world
sudo git clone https://github.com/lmoroz/bWAPP.git /opt/bwapp-lab
cd /opt/bwapp-lab
sudo git rev-parse HEAD | sudo tee BWAPP_COMMIT.txt
sudo tee compose.local.yml >/dev/null <<'YAML'
services:
web:
build: .
image: bwapp-local:php74
ports:
- "127.0.0.1:8080:80"
depends_on:
- db
environment:
MYSQL_HOST: db
MYSQL_USER: root
db:
image: mysql:5.7
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
volumes:
- bwapp_db_data:/var/lib/mysql
volumes:
bwapp_db_data:
YAML
sudo docker compose -f compose.local.yml up -d --buildKali Linux: use the distribution packages
Kali’s documentation recommends the docker.io package. Current Kali rolling also provides a Docker Compose v2 package. Keep Kali as a local testing workstation and avoid installing bWAPP directly into its host Apache/PHP stack.
sudo apt update
sudo apt install -y docker.io docker-compose git
sudo systemctl enable docker --now
sudo docker run --rm hello-world
git clone https://github.com/lmoroz/bWAPP.git "$HOME/bwapp-lab"
cd "$HOME/bwapp-lab"
git rev-parse HEAD | tee BWAPP_COMMIT.txt
cat > compose.local.yml <<'YAML'
services:
web:
build: .
image: bwapp-local:php74
ports:
- "127.0.0.1:8080:80"
depends_on:
- db
environment:
MYSQL_HOST: db
MYSQL_USER: root
db:
image: mysql:5.7
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
volumes:
- bwapp_db_data:/var/lib/mysql
volumes:
bwapp_db_data:
YAML
sudo docker-compose -f compose.local.yml up -d --buildIf your installation exposes Compose only as docker compose, use that spelling instead of docker-compose.
Windows 10 or 11: Docker Desktop with WSL 2
Docker Desktop currently recommends its per-user WSL 2 installation for most users. Confirm the supported Windows and WSL versions in Docker’s documentation, then keep Docker in Linux-container mode.
# PowerShell as Administrator: enable or update WSL
wsl --install
wsl --update
# Install Git and Docker Desktop with WinGet
winget install -e --id Git.Git --source winget
winget install -e --id Docker.DockerDesktop --source winget
# Restart if requested, start Docker Desktop, then run PowerShell normally
git clone https://github.com/lmoroz/bWAPP.git "$HOME\bwapp-lab"
Set-Location "$HOME\bwapp-lab"
git rev-parse HEAD | Set-Content BWAPP_COMMIT.txt
@'
services:
web:
build: .
image: bwapp-local:php74
ports:
- "127.0.0.1:8080:80"
depends_on:
- db
environment:
MYSQL_HOST: db
MYSQL_USER: root
db:
image: mysql:5.7
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
volumes:
- bwapp_db_data:/var/lib/mysql
volumes:
bwapp_db_data:
'@ | Set-Content -Encoding utf8 compose.local.yml
docker compose -f compose.local.yml up -d --build
docker compose -f compose.local.yml psOfficial bWAPP download, SourceForge, bee-box, and GitHub
The official ITSEC GAMES website points to SourceForge for the original project files and bee-box. SourceForge currently lists bWAPP v2.2, modified on November 2, 2014, as the latest application archive. OWASP’s directory links to the same project but does not maintain the code.
Official bWAPP archive
Use SourceForge when you need the canonical v2.2 source, release notes, installation file, vulnerability list, or training documents.
bee-box
A prebuilt virtual machine with bWAPP installed. Use host-only networking, disable unnecessary shared services, and take a clean snapshot before training.
Community Docker adaptation
The lmoroz repository updates bWAPP for PHP 7.4 and bundles Docker files. It is convenient, but it is not an official ITSEC GAMES or OWASP image.
Source verification
Record the download URL, file hash, Git commit, and date. A hash you calculate is useful for repeatability, but it is not independent verification unless the publisher provides a trusted expected value.
curl -L \ "https://sourceforge.net/projects/bwapp/files/bWAPP/bWAPPv2.2/bWAPPv2.2.zip/download" \ -o bWAPPv2.2.zip # Record a local hash and inspect the archive contents sha256sum bWAPPv2.2.zip unzip -l bWAPPv2.2.zip | less
bWAPP install.php, login page, and documented credentials
The first page is the database installer. Open http://127.0.0.1:8080/bWAPP/install.php, use the installation link once, and wait for a success message before opening login.php. The project documentation and common lab builds use bee as the username and bug as the password.
Run docker compose ps and inspect the web and database logs if the installer cannot connect.
Use the installer only inside the private lab. Do not expose it after setup.
Use bee / bug only in this disposable environment. Never reuse the password.
Start with the weakest level to understand the defect, then compare stronger levels and document which control changed.
If login fails, confirm that the installation completed, clear only the lab site’s cookies, and review both service logs. Resetting the database volume is a last resort because it deletes all local training state.
A better bWAPP walkthrough: learn the control, not just the answer
A useful lab note should be reproducible, defensive, and limited to the environment you control. Avoid collecting payload lists without explaining why the application accepted the input or how a production system should prevent the same class of failure.
| Step | What to record | Why it matters |
|---|---|---|
| 1. Scope | Lab URL, selected exercise, account, security level, Git commit or VM snapshot | Makes the observation repeatable |
| 2. Baseline | Normal request, normal response, expected state change | Prevents confusing ordinary behavior with a flaw |
| 3. One controlled change | The single input or sequence you changed inside the lab | Isolates the cause without unnecessary activity |
| 4. Evidence | Status, response difference, application state, relevant local logs | Supports a defensible conclusion |
| 5. Root cause | Missing validation, authorization, encoding, resource control, or configuration | Turns the exercise into an engineering lesson |
| 6. Fix and regression test | Code or architecture control plus an expected-deny test | Prevents the same defect from returning |
bWAPP SSRF lesson: a safe local learning method
bWAPP includes a server-side request forgery exercise. The safe objective is to observe that the application server makes a request based on user-controlled input, then identify the missing destination controls. Keep every destination on loopback or inside the same isolated lab; do not probe cloud metadata services, school/work systems, or networks you do not own.
Exercise goal: observe a server making a request from user-controlled input. Safe destination: 127.0.0.1 or a service created inside the same private lab. Record: baseline request, changed input, response difference, server-side effect. Root cause: destination is trusted without strict validation. Defenses: exact allowlist, DNS and resolved-IP validation, redirect checks, egress restrictions, short timeouts, response limits, and minimal logging.
Exact destination policy
Prefer a small allowlist of required destinations. Avoid substring checks and broad scheme-only validation.
Resolution and redirects
Validate resolved addresses and every redirect destination, or disable redirects when they are not needed.
Network egress
Restrict which networks and services the application can reach, including link-local and internal management ranges.
Operational evidence
Log destination class, decision, timing, and outcome without copying secrets or full sensitive responses.
For defensive controls, use the OWASP SSRF Prevention Cheat Sheet. For API-specific context, see OWASP API7:2023.
bWAPP troubleshooting: fix the common setup problems
# Container state and logs docker compose -f compose.local.yml ps docker compose -f compose.local.yml logs --tail 200 web docker compose -f compose.local.yml logs --tail 200 db # Check whether port 8080 is already used on Linux sudo ss -lntp | grep ':8080' || true # Validate the Compose file before rebuilding docker compose -f compose.local.yml config # Rebuild after a failed or partial build docker compose -f compose.local.yml down docker compose -f compose.local.yml build --no-cache docker compose -f compose.local.yml up -d # Intentionally erase the local training database docker compose -f compose.local.yml down -v docker compose -f compose.local.yml up -d --build
install.php cannot reach MySQL
Wait for MySQL to initialize, inspect both logs, and confirm that the web service uses MYSQL_HOST=db. A first start is slower than later starts.
Port 8080 is already in use
Stop the conflicting local service or change only the loopback mapping to 127.0.0.1:8081:80, then use port 8081 in the browser.
404 on the installer
The community build used here serves the application under /bWAPP/. Use /bWAPP/install.php, not a root-path URL copied from another image.
Build fails on ARM or Apple Silicon
Legacy images and packages may assume amd64. Review the Dockerfile and base-image architecture. Emulation can work but may be slower and should be treated as a compatibility workaround.
Windows cannot reach Docker
Start Docker Desktop, verify wsl --version and docker version, confirm Linux-container mode, then reopen PowerShell.
docker compose is unavailable on Kali
Use the installed docker-compose v2 command, or install a Compose plugin that matches your Docker package. Do not mix commands from unrelated package sources without checking compatibility.
Primary sources and current references
The guide distinguishes official project sources, OWASP catalog entries, current platform documentation, and community code.
What bWAPP can teach—and where modern security goes further
bWAPP is mainly a traditional web application lab. Its most transferable skill is the observation loop: identify the route, capture a normal baseline, change one controlled input, compare the result, name the trust failure, and define both a preventive control and a regression test.
| bWAPP lesson | Transferable engineering lesson | Modern extension |
|---|---|---|
| Parameter tampering | Do not trust client-controlled values or hidden fields | Typed contracts, server-side validation, authorization, and behavior-aware monitoring |
| Broken authorization | Evaluate permission at the requested object, property, and function | Tenant context, machine identities, delegated access, and expected-deny tests |
| SSRF | Restrict server-side destinations and egress | Resolved-IP controls, redirect validation, cloud metadata protection, and service identity |
| Injection | Separate untrusted data from commands and queries | Prepared interfaces, safe parsers, dependency controls, and secure error handling |
| Data exposure | Return only fields the caller needs and may access | Property-level authorization, schema drift detection, masking, and privacy-conscious telemetry |
Continue with the OWASP Top 10 guide, the API risk guide, and the API security evaluation checklist.
bWAPP lab checklist before you begin
| Check | Expected result |
|---|---|
| Source identified | Official SourceForge archive or a clearly labeled community repository with its exact commit recorded |
| Network scope | Web service bound to 127.0.0.1 or a private host-only VM network |
| Database exposure | No MySQL host port published |
| Legacy components accepted | Used only inside the disposable lab; never treated as production dependencies |
| Installer complete | Database created and login page loads locally |
| Credentials isolated | bee / bug used only in the lab and never reused |
| Evidence template | Scope, baseline, one controlled change, result, root cause, fix, and regression test |
| Reset plan | Compose volume removal or a clean VM snapshot is ready |
| End-of-session action | Lab stopped or removed when no longer needed |
Conclusion: keep bWAPP local, repeatable, and honest about its age
bWAPP remains useful because it gathers many classic web-security mistakes into one selectable training application. The most practical modern setup is a reviewed community Docker build with a localhost-only Compose override and the exact Git commit recorded. The official v2.2 source and bee-box remain available through the project’s SourceForge pages, while OWASP provides independent directory entries.
Open the installer locally, use the documented training account, capture a normal baseline, change one input at a time, and finish each exercise with the root cause, production control, and regression test. Just as importantly, recognize the limits: a 2014 training application is a foundation for learning—not a complete map of the OWASP Top 10:2025 or modern API security.
bWAPP frequently asked questions
What is bWAPP?
bWAPP, short for buggy web application, is a free and open-source PHP/MySQL application intentionally made insecure for authorized security education. OWASP lists it in the Vulnerable Web Applications Directory, but OWASP does not maintain the application.
What is the fastest safe way to install bWAPP?
For most users, the fastest practical route is a reviewed community Docker build with a Compose override that binds the web service only to 127.0.0.1 and keeps MySQL private inside Docker. Record the exact Git commit and remove the lab when training ends.
Is there an official bWAPP Docker image?
The canonical project distribution remains the bWAPP v2.2 archive and bee-box files linked by ITSEC GAMES on SourceForge. Docker repositories are community adaptations, so review them, record the commit, and keep them isolated.
What is the latest official bWAPP version?
SourceForge currently lists bWAPP v2.2, modified on November 2, 2014, as the latest official application archive. Its age is why containers or bee-box are often easier than installing it directly on a modern PHP/MySQL stack.
What URL opens bWAPP after installation?
For the Docker workflow in this guide, first open http://127.0.0.1:8080/bWAPP/install.php. After database initialization succeeds, open http://127.0.0.1:8080/bWAPP/login.php.
What is the default bWAPP login?
The documented training credentials are bee for the username and bug for the password. Use them only in the private lab, never reuse the password elsewhere, and create a disposable local learner account when useful.
How do I install bWAPP on Ubuntu or RHEL?
Install Docker Engine from Docker’s current official repository for the supported OS release, install Git, clone the reviewed community repository, create the localhost-only Compose file, record the Git commit, and build the lab.
How do I install bWAPP on Kali Linux?
Kali’s documentation recommends the docker.io package. Install Docker, the current Compose package, and Git, then run the same localhost-only community build. Keep Kali as a testing workstation rather than placing bWAPP directly into its host Apache/PHP stack.
How do I install bWAPP on Windows?
Use a supported Windows 10 or 11 release, current WSL 2, and Docker Desktop in Linux-container mode. Clone the community repository in PowerShell, create the loopback-only Compose file, start the containers, and open the local installer.
What is bee-box?
bee-box is a prebuilt virtual machine with bWAPP installed. It is convenient for historical compatibility, but it should use host-only or another isolated network and should never be bridged directly to an untrusted network.
Does bWAPP cover the current OWASP Top 10:2025?
bWAPP contains many classic vulnerability classes, but its official release predates the 2025 list. It is useful for fundamentals, not a complete or current OWASP Top 10:2025 verification program.
How should I use the bWAPP SSRF lesson safely?
Use only loopback addresses or services created inside the same isolated lab. Focus on the root cause and defenses such as exact allowlists, resolved-IP checks, redirect controls, restricted egress, timeouts, response limits, and minimal security logging.
Apply the lab method to real API traffic
A vulnerable training application teaches observation and root-cause analysis. Production API security also requires inventory, identity and authorization context, sensitive-data controls, runtime evidence, and safe response workflows.
