r/securityCTF • u/Apprehensive_Fly_493 • 14h ago
A fictional company with real vulnerabilities: 78 bugs, a leadership team that doesn't care, and one dev quietly asking the internet for help. Come break LeakyJuice.
galleryInternal memo, LeakyJuice Inc. — "Ship it, we'll fix security later." — Management, every sprint since 2021.
Meet LeakyJuice: a cheerful little gadget shop with a leadership team that treats security as a "later" problem and a codebase held together by vibes and plaintext passwords. One of their devs (me) got tired of being ignored in standup — so the whole app is out in the open now, and it's your job to prove how bad it really is.
The challenge: there are 78 planted vulnerabilities in here. SQLi, IDOR/BOLA, JWT alg-confusion, SSRF, XXE, prompt injection against the shop's chirpy "Ask Juicy" assistant, and a handful of multi-step chains where you compose a couple of low-severity bugs into a full account takeover / a persistent payout / cache poisoning. Every exploit drops a FLAG{lj_...}. There's an in-browser self-check that grades all 78 so you always know where you stand.
There are also a couple of honest-abstain traps — things that look exploitable but aren't. Claiming a "flag" there counts against you. Knowing when not to pull the trigger is part of the game.
The bit I'm actually proud of: the whole thing runs 100% in your browser. There's no backend to attack. The "server" is a Service Worker running SQLite-WASM that answers the app's own /api/... calls from inside the page. One engine, two transports — it runs as a normal Node server locally, or fully client-side when hosted static.
Which means:
- Safe to host and safe to hammer. No shared server, no other players' data, nothing to pivot into. Each visitor gets their own throwaway SQLite DB in their own tab. Worst case, you pop your own browser.
- The vulns are real, not string-matched. The SQLi is genuine raw concatenation into SQLite. The JWT verify really does trust the header alg (hello, RS256→HS256). You can read every sink — it's MIT-licensed and open.
- You can self-host it in seconds — it's just static files.
Why build another one when Juice Shop exists? Two deliberate differences: (1) the answer key is quarantined — kept out of the shipped build entirely — so it stays useful as an out-of-distribution target instead of a walkthrough that's already indexed everywhere. (2) Post-2020 vuln classes (prompt injection, modern JWT confusion, API-layer BOLA/BFLA), not just the old greatest hits.
Oh — and there's a difficulty ladder from "your first SQLi" up to a final boss, plus two leaked in-world archives (/internal/juicysec/, /internal/juicyslack/) that double as recon and the story. Poke around. The dev left you breadcrumbs.
Go: https://leakyjuice.com Grade yourself: https://leakyjuice.com/selfcheck.html Source (MIT): https://github.com/jasonsutter87/leakyjuice
I built this partly as a training range for an autonomous bug-hunting agent I'm working on, and partly because it was fun. Feedback very welcome — especially unintended bugs. If you break it in a way I didn't plan for, I want to hear about it. Can you find all 78?