Critical findings detected

OWASP Juice Shop: what we'd send the owner.

We ran our $49 check on OWASP Juice Shop, a working e-commerce app built for security training. It has genuine holes, so we can show you a finished report with nothing redacted. Yours would look exactly like this, just with your site, your URLs, and your own findings.

Scanned URLowasp-juice.shop
PlatformDocker / Node.js
Scan DateMay 27, 2026
Tools UsedWhatWeb, Nikto, Dirb, SSLScan
Report IDFTS-JUICE-001
Owner summary

If you owned this site, here's the email I'd send you.

The short version

Your site has working holes. Customer info is sitting out in the open, your API hands records to anyone who asks, and an attacker can drop scripts onto your pages. Every finding below came from a scan I can re-run on demand.

What a bad actor could do today

List every file on the server, pull user records straight from the API, plant malicious code on your product pages, or hijack a logged-in session. The wide-open CORS setting makes most of this a one-line attack.

Send this to your developer

Require login on every API endpoint that returns user data. Remove the public /ftp directory. Change CORS from "*" to your own domain. Add Content-Security-Policy, HSTS, and Referrer-Policy headers.

Critical findings

Fix these first. Any one of them could leak customer data or hand over an account.

Critical

Exposed FTP directory listing

Hitting /ftp returns a full file listing with no login. Anyone on the internet can browse it and download whatever's there.

Fix: Take the public FTP directory down, or put it behind a login. If those files genuinely need to be public, host them on a CDN or static bucket instead of exposing your filesystem.
Critical

Unauthenticated API: user data exposed

The /api/Users endpoint hands back user records without asking for a login. It does check for a header, but the error response leaks enough structure to map the API. Meanwhile /api/Products returns full product data including internal timestamps and deletedAt fields to anyone who asks.

Fix: Require auth on every endpoint that returns user-specific data. Strip internal fields like createdAt, updatedAt, and deletedAt from public API responses.
Critical

Wildcard CORS header: Access-Control-Allow-Origin: *

Every response carries a wildcard CORS header, which means any site on the internet can call your API from a user's browser and read the response. An attacker with a malicious page can lift data out of your app one-step.

Fix: Swap * for your actual domain(s). Example: Access-Control-Allow-Origin: https://yourdomain.com

High-severity findings

Fix these soon. They don't break the site on their own, but they make every other attack easier.

High

No Content-Security-Policy header

There's no CSP set. If a script ever slips in through a customer review, a product description, or a compromised dependency, the browser has nothing telling it to refuse.

Fix: Add a CSP. A safe starting point: default-src 'self'; script-src 'self'; style-src 'self' fonts.googleapis.com
High

No HTTP Strict-Transport-Security (HSTS)

HSTS isn't set. A first-time visitor on a hostile network (coffee shop wifi, hotel, airport) can get quietly downgraded from HTTPS to HTTP before they ever reach you.

Fix: Add Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Medium-severity findings

Not on fire, but worth tidying up before you ship anything new.

Medium

A few security headers are missing

Referrer-Policy, Permissions-Policy, and X-Content-Type-Options aren't set. Small headers, easy wins. They add another layer if something else slips through.

Fix: Add Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy: camera=(), microphone=(), and X-Content-Type-Options: nosniff
Medium

X-Recruiting header leaks an internal URL

The response includes X-Recruiting: /#/jobs, which quietly exposes an internal path. It's free information for anyone poking around.

Fix: Drop the X-Recruiting header. If you want to advertise jobs, put a link in the page content where it belongs.
Medium

robots.txt is acting as a treasure map

robots.txt blocks /ftp, which has the opposite of the intended effect: it tells every attacker exactly where to look. Sensitive paths shouldn't be mentioned there at all.

Fix: Remove the /ftp entry from robots.txt. If a directory shouldn't be crawled, it shouldn't be reachable in the first place.

SSL/TLS check

Some good news. Encryption is the one area already pulling its weight.

SSLScan results
TLS 1.2 + 1.3Modern protocols enabled, old ones disabled
Pass
Strong ciphers onlyAES-256-GCM, ChaCha20-Poly1305, ECDHE key exchange
Pass
HeartbleedNot vulnerable on TLS 1.2 or 1.3
Pass
CertificateValid Sectigo cert, wildcard *.owasp-juice.shop, expires Oct 2026
Pass
CompressionDisabled, no CRIME attack vector
Pass

Want one of these for your site?

This came from an actual scan, not a template. Yours would have the same format with your URLs, your findings, and your fixes.

Get my report