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
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. |
noisgate verdict.
The decisive factor is exposure population: this is a niche, downloadable student PHP project rather than a common enterprise platform. If you actually run it, the bug is trivial; but across a 10,000-host estate the odds that this is a material internet-facing business system are low, and the demonstrated blast radius is app-admin, not proven server compromise.
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.
What to do — in priority order.
- Put
/adminbehind real authentication — Require an upstream control such as reverse-proxy auth, VPN-only reachability, or IP allowlisting so direct requests to/admin/index.phpnever 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. - Disable self-registration where possible — The easiest abuse path is likely self-signup to low-privilege user and then direct browse to the admin page. If the site must stay up, turning off open registration sharply raises attacker cost; for LOW, this is backlog hygiene unless the instance is exposed to the internet.
- Add a server-side role check in
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. - Watch for user-to-admin jumps — Log and alert on fresh accounts hitting
/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.
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)
If you remember one thing.
/admin and disable open signup in the next normal change window, then schedule a code fix or retirement as backlog hygiene. For a LOW verdict there is no noisgate mitigation SLA and effectively no noisgate remediation SLA trigger beyond backlog hygiene, but exposed live instances should still be cleaned up before they surprise you during the next external scan.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.