CVE-2025-69459 – Movie Rating System 1.0 - Broken Access Control
Wed Jan 21 2026 · 2 min read
Category: Security Research
Introduction
In this report, I will detail the discovery and exploitation of a critical Broken Access Control vulnerability in the "Movie Rating System 1.0" application. This vulnerability allows an unauthenticated attacker to create a new user with administrator privileges.
Vulnerability Analysis
Unauthorized Access and User Creation
Upon examining the classes/Users.php file, which handles user management operations, I detected that the save_users function is executed without any authentication checks.
// Vulnerable Code in classes/Users.php
$action = !isset($_GET['f']) ? 'none' : strtolower($_GET['f']);
switch ($action) {
case 'save':
echo $users->save_users();
break;
// ...
}

As seen in the code snippet above, requests with the parameter f=save are directly routed to the save_users function. At this point, there is no check whether the user is logged in or has administrative privileges.
Looking into the save_users function, we see that data sent via POST request is directly saved to the database:
public function save_users(){
// ...
extract($_POST);
// ...
foreach($_POST as $k => $v){
if(in_array($k,array('firstname','middlename','lastname','username','type'))){
if(!empty($data)) $data .=" , ";
$data .= " {$k} = '{$v}' ";
}
}
// ...
if(empty($id)){
$qry = $this->conn->query("INSERT INTO users set {$data}");
// ...
}
// ...
}


The most critical point here is that the type parameter can be manipulated externally. In the system, type=1 typically represents Administrator privileges. An attacker can send this parameter as 1 to make themselves an administrator.
Exploit Development
I developed a Python exploit (exploit.py) to leverage this vulnerability. The attack steps are as follows:
-
Target Selection: The target URL is taken from the user.
-
Admin Account Creation: A specially crafted
multipart/form-dataPOST request is sent toclasses/Users.php?f=save.username: "tago"password: "tagoletta"type: "1" (Admin Privilege)firstname,lastname: Random values.
-
Login Check: After the account is created, a login request is sent to
classes/Login.php?f=loginwith the created credentials to verify the success of the exploit.
If the server returns 200 OK and the login is successful, we now have a fully privileged administrator account on the system.
Remediation
To fix this vulnerability, access to the save_users function must be restricted to authorized administrators only.
Mitigation:
Add an authorization check to the switch structure in classes/Users.php or at the beginning of the save_users function.
Secure Implementation Example:
// classes/Users.php
// ...
switch ($action) {
case 'save':
// Add session check and authorization check
if(!isset($_SESSION['userdata']) || $_SESSION['userdata']['type'] != 1){
echo json_encode(['status' => 'failed', 'msg' => 'Unauthorized access.']);
exit;
}
echo $users->save_users();
break;
// ...
}
This change will ensure that only logged-in users with a type value of 1 (Administrator) can call this function.
CVE ID: CVE-2025-69459
Original public disclosure: December 22, 2021
Researcher: Tağmaç "Tagoletta"
Canonical reference: https://www.exploit-db.com/exploits/50621
Github Repository: https://github.com/Tagoletta/CVE-2025-69459
Introduction
In this report, I will detail the discovery and exploitation of a critical Broken Access Control vulnerability in the "Movie Rating System 1.0" application. This vulnerability allows an unauthenticated attacker to create a new user with administrator privileges.
Vulnerability Analysis
Unauthorized Access and User Creation
Upon examining the classes/Users.php file, which handles user management operations, I detected that the save_users function is executed without any authentication checks.
// Vulnerable Code in classes/Users.php
$action = !isset($_GET['f']) ? 'none' : strtolower($_GET['f']);
switch ($action) {
case 'save':
echo $users->save_users();
break;
// ...
}

As seen in the code snippet above, requests with the parameter f=save are directly routed to the save_users function. At this point, there is no check whether the user is logged in or has administrative privileges.
Looking into the save_users function, we see that data sent via POST request is directly saved to the database:
public function save_users(){
// ...
extract($_POST);
// ...
foreach($_POST as $k => $v){
if(in_array($k,array('firstname','middlename','lastname','username','type'))){
if(!empty($data)) $data .=" , ";
$data .= " {$k} = '{$v}' ";
}
}
// ...
if(empty($id)){
$qry = $this->conn->query("INSERT INTO users set {$data}");
// ...
}
// ...
}


The most critical point here is that the type parameter can be manipulated externally. In the system, type=1 typically represents Administrator privileges. An attacker can send this parameter as 1 to make themselves an administrator.
Exploit Development
I developed a Python exploit (exploit.py) to leverage this vulnerability. The attack steps are as follows:
-
Target Selection: The target URL is taken from the user.
-
Admin Account Creation: A specially crafted
multipart/form-dataPOST request is sent toclasses/Users.php?f=save.username: "tago"password: "tagoletta"type: "1" (Admin Privilege)firstname,lastname: Random values.
-
Login Check: After the account is created, a login request is sent to
classes/Login.php?f=loginwith the created credentials to verify the success of the exploit.
If the server returns 200 OK and the login is successful, we now have a fully privileged administrator account on the system.
Remediation
To fix this vulnerability, access to the save_users function must be restricted to authorized administrators only.
Mitigation:
Add an authorization check to the switch structure in classes/Users.php or at the beginning of the save_users function.
Secure Implementation Example:
// classes/Users.php
// ...
switch ($action) {
case 'save':
// Add session check and authorization check
if(!isset($_SESSION['userdata']) || $_SESSION['userdata']['type'] != 1){
echo json_encode(['status' => 'failed', 'msg' => 'Unauthorized access.']);
exit;
}
echo $users->save_users();
break;
// ...
}
This change will ensure that only logged-in users with a type value of 1 (Administrator) can call this function.
CVE ID: CVE-2025-69459
Original public disclosure: December 22, 2021
Researcher: Tağmaç "Tagoletta"
Canonical reference: https://www.exploit-db.com/exploits/50621
Github Repository: https://github.com/Tagoletta/CVE-2025-69459
Giriş
Exploit Kodunu Görüntüle
Bu raporda, "Movie Rating System 1.0" uygulamasında kritik bir Erişim Kontrolü Bozukluğu (Broken Access Control) zafiyetinin nasıl keşfedildiğini ve istismar edildiğini detaylandıracağım. Bu zafiyet, kimliği doğrulanmamış bir saldırganın sisteme yönetici (admin) yetkileriyle yeni bir kullanıcı eklemesine olanak tanımaktadır.
Zafiyet Analizi
Yetkisiz Erişim ve Kullanıcı Oluşturma
Uygulamanın kullanıcı yönetimi işlemlerini gerçekleştiren classes/Users.php dosyasını incelediğimde, save_users fonksiyonunun herhangi bir kimlik doğrulama kontrolü yapmadan çalıştığını tespit ettim.
case 'save':
echo $users->save_users();
break;
// ...
} ```

Yukarıdaki kod parçasında görüldüğü üzere, `f=save` parametresi ile gelen istekler doğrudan `save_users` fonksiyonuna yönlendirilmektedir. Bu noktada kullanıcının oturum açıp açmadığı veya yönetici yetkisine sahip olup olmadığı kontrol edilmemektedir.
`save_users` fonksiyonunun içeriğine baktığımızda ise, POST isteği ile gönderilen verilerin doğrudan veritabanına kaydedildiğini görüyoruz:
```php public function save_users(){
// ...
extract($_POST);
// ...
foreach($_POST as $k => $v){
if(in_array($k,array('firstname','middlename','lastname','username','type'))){
if(!empty($data)) $data .=" , ";
$data .= " {$k} = '{$v}' ";
}
}
// ...
if(empty($id)){
$qry = $this->conn->query("INSERT INTO users set {$data}");
// ...
}
// ...
} ```


Buradaki en kritik nokta, `type` parametresinin de dışarıdan manipüle edilebilir olmasıdır. Sistemde `type=1` genellikle yönetici (Administrator) yetkisini temsil etmektedir. Saldırgan, bu parametreyi `1` olarak göndererek kendini yönetici yapabilir.
### Exploit Geliştirme
Bu zafiyeti istismar etmek için Python dilinde bir exploit geliştirdim (`exploit.py`). Saldırı adımları şu şekildedir:
1. **Hedef Belirleme:** Kullanıcıdan hedef URL alınır.
2. **Yönetici Hesabı Oluşturma:** `classes/Users.php?f=save` adresine özel olarak hazırlanmış bir `multipart/form-data` POST isteği gönderilir.
* `username`: "tago"
* `password`: "tagoletta"
* `type`: "1" (Yönetici Yetkisi)
* `firstname`, `lastname`: Rastgele değerler.
3. **Giriş Kontrolü:** Hesap oluşturulduktan sonra, `classes/Login.php?f=login` adresine oluşturulan kullanıcı adı ve şifre ile giriş isteği gönderilerek exploitin başarısı doğrulanır.
Eğer sunucu `200 OK` dönerse ve giriş başarılı olursa, sistemde artık tam yetkili bir yönetici hesabımız var demektir.
### Çözüm ve Kapatma
Bu zafiyeti gidermek için, `save_users` fonksiyonuna erişimin sadece yetkili yöneticiler tarafından yapılabileceğinden emin olunmalıdır.
**Önlem:**
`classes/Users.php` dosyasındaki `switch` yapısına veya `save_users` fonksiyonunun başına bir yetki kontrolü eklenmelidir.
*Güvenli Uygulama Örneği:*
```php // classes/Users.php
// ...
switch ($action) {
case 'save':
// Oturum kontrolü ve yetki kontrolü ekleyin
if(!isset($_SESSION['userdata']) || $_SESSION['userdata']['type'] != 1){
echo json_encode(['status' => 'failed', 'msg' => 'Unauthorized access.']);
exit;
}
echo $users->save_users();
break;
// ...
} ```
Bu değişiklik, sadece oturum açmış ve `type` değeri `1` olan (Yönetici) kullanıcıların bu fonksiyonu çağırmasına izin verecektir.
---
**CVE ID:** CVE-2025-69459 **İlk Yayın Tarihi:** 22 Aralık 2021 **Araştırmacı:** Tağmaç "Tagoletta" **Canonical reference:** https://www.exploit-db.com/exploits/50623 **Github Repository:** https://github.com/Tagoletta/CVE-2025-69459
Frequently Asked Questions
What is CVE-2025-69459?
A Broken Access Control flaw in Movie Rating System 1.0 that lets an unauthenticated attacker create an administrator account, discovered as a zero-day by Tağmaç 'Tagoletta'.
Why is this vulnerability dangerous?
The admin-registration function lacks authorization checks, so anyone can self-provision a full admin account and take over the application without any credentials.
What is Broken Access Control?
The number-one category in the OWASP Top 10 — when the application fails to enforce what a user is allowed to do, letting them access functions or data beyond their privileges.
How do you fix CVE-2025-69459?
Enforce server-side authorization on every privileged action, deny by default, never expose admin-creation endpoints without authentication, and audit access control on all state-changing functions.
Where is the PoC exploit writeup for CVE-2025-69459?
The full proof-of-concept exploit code and step-by-step writeup are published on this site — see the companion exploit page for the ready-to-run PoC that self-provisions an administrator account without authentication.