A back-office ledger left unlocked after the front door is closed
The vulnerability is an SQL injection in the classId parameter of /attendance-php/Admin/createClassArms.php in CodeAstro Student Attendance Management System 1.0. An authenticated low-privilege user can tamper with the parameter to inject SQL, potentially reading or modifying database records behind the application.
CodeAstro is a code-marketplace project commonly used for demos and coursework, not an enterprise attendance platform. The vendor MEDIUM severity of 6.3 overstates the realistic exposure: the bug requires valid application credentials and lands in a niche app with limited database impact. No active exploitation, KEV listing, or meaningful scanning has been observed.
4 steps from start to impact.
Obtain a valid low-privilege account
- Target instance is reachable over the network
- Attacker can obtain or create a low-privilege account
- Typical deployments are internal-only and may not expose self-registration
- Default credentials may be changed in production, though tutorials often leave them unchanged
Reach the vulnerable Admin endpoint
/attendance-php/Admin/createClassArms.php is under an /Admin/ path. However, many CodeAstro tutorial apps do not enforce role checks consistently, or a low-privilege teacher account is allowed to create class arms. The attacker needs to reach this script with a valid session.- Authenticated session exists
- Endpoint is exposed and reachable
- If role enforcement is properly implemented, low-privilege users cannot access the Admin path
- Server-side access controls may block direct script execution
createClassArms.php from unexpected users or IPs.Inject SQL via the classId parameter
classId argument, such as 1' UNION SELECT ..., because the input is concatenated into a SQL query without parameterization. This can be exploited using error-based, UNION-based, or time-based blind SQL injection techniques.- The
classIdparameter is not parameterized - The application reflects SQL errors or allows blind timing
- A WAF or input filter may block common SQLi patterns
- Database user privileges may prevent certain injected operations
classId values.Extract or manipulate database records
- Database user has read and possibly write access to relevant tables
- Application connects to a database containing sensitive data
- Least-privilege DB accounts limit the tables and operations available
- Network segmentation may restrict the database to the web server only
/attendance-php/Admin to internal network or VPN. No mitigation SLA for LOW, but treat as backlog hygiene before the 365-day remediation window closes. This breaks the remote attack path for internet attackers.classId parameter. Not a permanent fix but will stop opportunist public exploit attempts.- Generic OS/host patching does not fix application-layer SQLi.
- Database encryption at rest does not prevent SQL injection extraction of plaintext query results.
- MFA alone does not stop an attacker who already holds a valid low-privilege session.
- Rate limiting/account lockout is ineffective against low-volume targeted SQLi.
The supporting signals.
| In-the-wild status | No known campaigns; not listed in CISA KEV; no mass exploitation or GreyNoise scanning observed. |
|---|---|
| Proof-of-concept availability | Public exploit disclosed per CVE description; check pocindex.io and GitHub repos named after the CVE ID for PoCs. |
| EPSS score | 0.002 — 0.2% probability of exploitation in the next 30 days. |
| KEV status | Not listed in CISA Known Exploited Vulnerabilities catalog. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L — network vector, low complexity, low privilege, no user interaction, low confidentiality/integrity/availability impact. |
| Affected version range | CodeAstro Student Attendance Management System 1.0. |
| Fixed version | None publicly documented; product likely unmaintained. |
| Scanning/exposure data | No known internet-wide scanning; CodeAstro apps typically appear in small numbers on Shodan/Censys, often on demo or lab hosts. |
| Disclosure date | 2026-06-08 |
| Reporting researcher/org | Not specified in official record. |
Sources.
Why this verdict
- Role multiplier: CodeAstro Student Attendance Management System is a low-value LOB app; even successful SQLi stops at the app database — no domain, identity, fleet, or supply-chain blast radius.
- Friction audit: Requires a valid low-privilege account and access to an Admin-path endpoint; many implementations are internal-only and not self-registering.
- Deployment reality: CodeAstro scripts are tutorial/coursework code with a tiny install base, rarely internet-exposed; no high-value-role floor applies.
- Exploit intel: Public exploit exists but EPSS 0.002, no KEV listing, and no observed mass exploitation.
Why not higher?
Not pre-auth, impact scoped to a single web app database, no high-value-role blast radius, and no active exploitation. The affected product is not enterprise infrastructure; a critical or high rating would overstate the real-world exposure.
Why not lower?
It is remote, low complexity, and has a public exploit, so it cannot be ignored. If the app is internet-facing with weak credentials, skilled attackers can dump student PII and modify attendance records.
Crowdsourced verification payload.
Run from an auditor workstation with network access to the target; requires curl and no special privileges. Invoke as ./check_cve-2026-11585.sh http://<host>/attendance-php.
#!/usr/bin/env bash
# CVE-2026-11585 verification for CodeAstro Student Attendance Management System 1.0
# Usage: ./check_cve-2026-11585.sh <target_base_url>
# Example: ./check_cve-2026-11585.sh http://school.example.com/attendance-php
set -euo pipefail
TARGET="${1:-}"
if [ -z "$TARGET" ]; then
echo "usage: $0 <target_base_url>"
exit 2
fi
TARGET="${TARGET%/}"
URL="${TARGET}/Admin/createClassArms.php"
echo "[*] Checking ${URL}"
response=$(curl -sk -o /tmp/cve_2026_11585.out -w "%{http_code}" "${URL}")
if [ "$response" = "200" ]; then
if grep -qi "classId" /tmp/cve_2026_11585.out; then
echo "VULNERABLE: endpoint reachable and classId parameter present; patch or restrict access."
exit 1
else
echo "UNKNOWN: endpoint reachable but classId parameter not found in response; investigate manually."
exit 3
fi
elif [ "$response" = "404" ] || [ "$response" = "403" ]; then
echo "PATCHED: endpoint not accessible (HTTP ${response})."
exit 0
else
echo "UNKNOWN: HTTP ${response}; could not determine status."
exit 3
fi