A Realistic Web Shop Built for Training
Björn Kimminich walked through the benign shopping path: browse products, add to basket, check out with a saved credit card, and track delivery. The shop includes a photo wall, support chat, complaint form, and a deluxe membership tier. The only fake feature is actual delivery – you keep the items without paying. The application runs on Node.js, Express, and Angular (currently version 20), all packed into a single Docker image with an SQLite database. It has been kept up to date for 11 years.
Exploiting SQL Injection in the Login Form
Jannik Hollenbach demonstrated a SQL injection against the login screen. A single quote produced a 500 error with the SQL statement exposed in the network response. He terminated the string with ';-- and an always-true condition, logging in as the first user in the database – the administrator. The challenge was solved immediately. The related coding challenge showed the vulnerable line where user input was concatenated directly into the query. The audience saw that selecting the correct fix required identifying parameterized queries as the solution.
Cross-Site Scripting and the Hacking Instructor
For a reflected XSS challenge, Yannick copied a payload from the scoreboard by clicking it. He pasted it into the search field, where the input was reflected on the page. The alert popped up, and another challenge turned green. The hacking instructor guided newcomers step by step through these exercises. The scoreboard lists all 110 challenges, each with a difficulty rating from one to six stars. Finding the hidden scoreboard URL itself counts as the first challenge. Yannick guessed the URL as /score-board after failing with /scoreboard.
Cheat Detection, Rebranding, and the Tech Stack
Juice Shop has built-in cheat detection that measures time between challenge solves. The automated Cypress test suite, which exploits all challenges at high speed, scores 95-96% cheat probability. The application is completely rebrandable via a single YAML configuration file – color theme, product list, social links, and more can be overridden. Broken configurations cause the app to refuse startup with a clear error message. The technical stack includes Grunt for packaging and automated ZAP scans every week. A solution webhook fires when a challenge is solved, reporting hints used, cheat score, and user identity.
Multi-User Platform: Zero Setup for Workshops
Yannick introduced MultiJuicer, a self-hosted platform that spawns individual Juice Shop instances per team. Participants only need a browser. Registration requires just a team name; a passcode lets teammates share the same instance. The administrator can reset or delete instances via an admin interface. A new global scoreboard renders progress on an animated 3D globe. When a team solves a challenge associated with a country (e.g., Australia – Christmas special), that country fills with the team’s pattern. The feature is currently in preview. MultiJuicer is packaged for Kubernetes but also works on plain VMs.
AI Slop Floods Open Source Pull Requests
Björn showed a graph of spam pull requests rising sharply. The project gets accidental PRs from people testing scanning tools, and now many from “contribution farmers” using AI to produce low-effort changes – reformatting code or re-enabling tests that immediately fail CI. These PRs come with lengthy AI-generated descriptions that consume maintainer time. The project’s anti-spam policy blocks repeat offenders for 30 days, then permanently. Björn warned that if this continues, smaller projects may turn repos private. He refused to counter with AI reviewers, calling it a “battle of the contributor AI versus the maintainer AI.”
Q&A
Will a cloud provider’s default security protect a running Juice Shop instance? No – Juice Shop is just a web app. Cloud providers do not enable a WAF by default. The application disables persistent XSS and remote code execution challenges when running in Docker, but users can re-enable them via unsafe mode. ▶ Watch (1:01:44)
Is the configuration system built on YAML? Yes, the configuration files are YAML. The application itself is TypeScript, and MultiJuicer is written in Go. ▶ Watch (1:04:05)
Notable Quotes
This is basically the gist of what the Juice Shop is, right? So, it’s a it’s a web application which has terrible vulnerabilities. Björn Kimminich · ▶ Watch (1:00)
If you’re that fast, then it’s pretty obvious that you’re cheating. Björn Kimminich · ▶ Watch (20:48)
That’s why when we spot something like this and I think we’re pretty good at spotting these uh more or less immediately we also just mark them as spam close them. Björn Kimminich · ▶ Watch (51:57)
I don’t want to throw my own AI against that and let that review all the pull requests and then we have a battle of the contributor AI versus the maintainer AI. Björn Kimminich · ▶ Watch (52:48)
Key Takeaways
- Juice Shop contains 110 intentionally insecure challenges, from SQL injection to XSS, with a sixth-star difficulty tier.
- The MultiJuicer platform reduces workshop setup time from hours to minutes by provisioning isolated instances per team.
- Rebranding the entire application requires only editing a single YAML configuration file.
- AI-generated low-effort pull requests are a growing burden for maintainers and may push projects private.
About the Speaker(s)
Jannik Hollenbach is Project Lead of OWASP Juice Shop and OWASP secureCodeBox.
Björn Kimminich works as Product Group Lead Application Ecosystem at Kuehne+Nagel, responsible among other things for the Application Security program in the global IT. He is an OWASP Lifetime Member, project leader of the OWASP Juice Shop, and a co-chapter leader for the OWASP Germany Chapter. Björn also currently chairs the OWASP Project Committee.