01 CONTEXT
Garuda CBT is a real, actively used school platform — exam delivery, report cards, student records — distributed as open-source PHP on CodeIgniter 3, installed and run by schools themselves. That combination (sensitive data, broad deployment, legacy framework) is exactly the profile worth auditing before a bad actor does it first. The question was simple: what does an attacker actually need to own a school's exam data? The answer turned out to be: no credentials, one HTTP request, and — in the worst case — nothing but the public repository.
02 METHOD
The shipped source is obfuscated with hex-escaped payloads, so step one was decoding it back into readable PHP. From there the audit ran as a loop:
- Decode the distributed source into readable PHP.
- Identify the dangerous sinks — file writes, raw query concatenation, execution-adjacent calls.
- Trace user input forward to each sink.
- Rank what actually matters.
- Verify every candidate dynamically against a locally built instance.
- Confirm against the database general log — ground truth for what actually executed.
The bench: PHP 8.3.28 built-in server, MariaDB 11.8.8, the full 74-table schema, test accounts created by me, ENVIRONMENT left at its shipped default. Every claim was exercised as plain curl requests against the local instance. Cleanup came last — webshells removed, test tables dropped.
| Verification | Findings |
|---|---|
| Dynamically verified on the local instance | 8 |
| Static code review only | 1 |
| Total | 9 |
