This is a store with a side door left open, but it is mostly a training storefront in the back of the lab
CVE-2025-0206 is an access-control failure in code-projects Online Shoe Store 1.0, specifically the /admin/index.php path. The public write-up says a normal user can reach the admin panel directly; the project page also advertises a built-in sign-up flow, so in many deployments an attacker may be able to self-register first and then browse straight into admin. The affected version range publicly identified is just 1.0.
The vendor-side 5.3 MEDIUM is directionally closer to reality than the NVD's enriched 8.8 HIGH, but for enterprise patch planning I would still score it lower. The exploit is easy and public, but the real-world exposure population is tiny: this is a downloadable PHP student project typically run on XAMPP/WAMP, not a mainstream enterprise platform, and the demonstrated impact is application-admin takeover rather than verified server takeover.
4 steps from start to impact.
Reach a live instance
curl, or Burp Suite for fingerprinting the app and testing page flow.- A real deployment of
code-projects Online Shoe Store 1.0exists - The site is reachable from the attacker position
- This product is a niche source-code sample, not a broadly deployed enterprise package
- Project instructions emphasize local XAMPP/WAMP-style installation, which strongly suggests many copies never become internet-facing
Obtain low-privilege user context
/admin/index.php. Because the project advertises a sign-up system, the most likely real attack is self-registration followed by login; tooling is again trivial browser automation or Burp Repeater.- User registration is enabled, or attacker has valid low-privilege credentials
- If registration is disabled or manually approved, the bug becomes a post-auth issue and drops sharply in urgency
- If the app is only used internally for demos, attacker still needs a route into that internal environment
/admin/index.php, but few orgs monitor these student apps closely.Request the admin panel directly
/admin/index.php and, per the published gist, is treated as an admin user. The weaponized technique is simple direct-object or missing-authorization abuse; no exploit framework is required.- The admin page lacks an effective role check
- A local code fork may already have added a session or role guard
- Reverse proxies or additional auth in front of
/admincan break the path even if the code itself is weak
Abuse app-admin privileges
- Admin panel exposes sensitive business functions or customer data
- Blast radius is bounded to this one application unless admins reuse credentials or the panel exposes file-upload/code-edit features not shown in the advisory
- There is no authoritative evidence in the retrieved sources of active exploitation campaigns or common enterprise chaining
/admin behind real authentication — Require an upstream control such as reverse-proxy auth, VPN-only reachability, or IP allowlisting so direct requests to /admin/index.php never hit the app anonymously. For a LOW verdict there is no SLA — treat as backlog hygiene, but do it immediately if this app is internet-facing.admin/index.php — Do not rely on hidden links or UI gating; enforce a session and explicit admin-role validation before any admin page renders. No formal LOW mitigation deadline applies, but any live production instance should get this code fix before the next normal release cycle./admin/ paths, especially within minutes of registration. This is cheap detective control for an app that likely lacks mature security instrumentation; again, LOW means backlog hygiene unless the app is externally reachable.- A generic network IDS signature alone does not solve this; the exploit is ordinary HTTP navigation to an existing path.
- Hiding the admin link in the UI does not help; the issue is direct access to
/admin/index.php. - Password complexity for admins does not address the core flaw if a normal authenticated user can be treated as admin by path access.
The supporting signals.
| In-the-wild status | No authoritative evidence of active exploitation was found in retrieved primary sources. Not KEV-listed in the user-supplied intel block. |
|---|---|
| Proof of concept | Yes. A public gist by th4s1s says a normal user can log in and access /admin/index.php to become admin. |
| EPSS | 0.00122 from the user intel, i.e. about 0.122% probability of exploitation in the next 30 days; percentile was not authoritatively confirmed from retrieved FIRST data. |
| KEV status | No in the user intel block; no CISA action date applies. |
| CVSS reality check | Vendor/CNA vector is AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N (5.3 MEDIUM), while NVD enrichment added PR:L but inflated impact to C:H/I:H/A:H (8.8 HIGH). The public PoC supports *authorization failure*, but not host-level compromise. |
| Affected versions | Publicly identified affected version: code-projects Online Shoe Store 1.0 only. |
| Fixed version | No vendor-fixed release or backport was identified in the retrieved sources. Treat patched version as unknown/none published. |
| Exposure population | Real-world footprint looks small. The product page frames it as a downloadable PHP source project and its runbook centers on XAMPP/WAMP localhost deployment, which is a strong downward pressure on enterprise urgency. |
| Disclosure date | 2025-01-04. |
| Reporter | Public PoC and advisory references point to th4s1s via GitHub gist; CNA is VulDB. |
Sources.
Why this verdict
- Downward pressure: niche product —
code-projectsis distributing sample PHP source code, not a mainstream enterprise application stack. That massively narrows the exposed population. - Downward pressure: likely post-initial or self-registration dependent — the public PoC says log in as a normal user first. If registration is not open, this is a true low-privilege post-auth issue.
- Downward pressure: blast radius is app-level — the retrieved sources show admin-panel takeover, but not RCE, container escape, or host takeover.
- Upward pressure: exploitation is easy — the path is direct, the PoC is public, and the route is a simple request to
/admin/index.phpafter obtaining user context. - Upward pressure: remote and quiet — this is normal-looking web traffic, so weakly monitored hobby apps can be compromised without much noise.
Why not higher?
Because several prerequisites shrink the real-world risk fast: you need this exact PHP sample app deployed somewhere that matters, reachable, and still using the vulnerable code path. Even then, the demonstrated impact in the public material is application-admin access, not system-level compromise or broad tenant-to-tenant spread.
Why not lower?
Because if the app is present and exposed, the exploit path is cheap and realistic. Public PoC exists, the authorization check appears absent, and admin-panel access can still expose customer and order data or enable storefront tampering.
Crowdsourced verification payload.
Run this on the target host or a mounted application source tree, not from a scanner workstation. Invoke it as python3 check_cve_2025_0206.py /var/www/html/online-shoe-store; no root is required, only read access to the app files. It performs a source-level heuristic check of admin/index.php and prints VULNERABLE, PATCHED, or UNKNOWN.
#!/usr/bin/env python3
# check_cve_2025_0206.py
# Heuristic verifier for CVE-2025-0206 in code-projects Online Shoe Store 1.0
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN, 3=USAGE/ERROR
import os
import re
import sys
ROLE_PATTERNS = [
r'\$_SESSION\s*\[\s*["\']admin["\']\s*\]',
r'\$_SESSION\s*\[\s*["\']role["\']\s*\]',
r'\$_SESSION\s*\[\s*["\']user_type["\']\s*\]',
r'\$_SESSION\s*\[\s*["\']is_admin["\']\s*\]',
r'if\s*\(!?\s*isset\s*\(\s*\$_SESSION',
r'header\s*\(\s*["\']Location\s*:',
r'include\s*\(.*auth',
r'require(_once)?\s*\(.*auth',
]
WEAK_SIGNALS = [
r'admin',
r'dashboard',
r'orders',
r'products',
r'transactions',
]
def out(msg, code):
print(msg)
sys.exit(code)
if len(sys.argv) != 2:
out('UNKNOWN - usage: python3 check_cve_2025_0206.py <app_root>', 3)
root = sys.argv[1]
index_path = os.path.join(root, 'admin', 'index.php')
if not os.path.isdir(root):
out('UNKNOWN - supplied app_root does not exist', 3)
if not os.path.isfile(index_path):
out('UNKNOWN - admin/index.php not found', 2)
try:
with open(index_path, 'r', encoding='utf-8', errors='ignore') as f:
data = f.read()
except Exception as e:
out(f'UNKNOWN - unable to read file: {e}', 2)
head = data[:8000] # inspect early file content where auth gates usually live
found_role_guard = any(re.search(p, head, re.IGNORECASE | re.DOTALL) for p in ROLE_PATTERNS)
weak_context = sum(1 for p in WEAK_SIGNALS if re.search(p, data, re.IGNORECASE))
# Heuristic verdict logic
if found_role_guard:
out('PATCHED - admin/index.php appears to contain session/role/auth gating', 0)
if weak_context >= 2:
out('VULNERABLE - admin/index.php exists and no obvious session/role/auth guard was found', 1)
out('UNKNOWN - file exists but heuristic evidence is inconclusive', 2)