Salut!

Astazi mi-a venit ideea sa postez o mare vurnerabilitate a serverelor de SA:MP ce folosesc baza de date (MySQL).

Am cautat pe acest forum (sa-mp.ro) si nu am gasit absolut nici macar o discutie cu privire la acest lucru.

Aceasta vurnerabilitate nu este aparuta de azi sau de ieri, este de foarte mult timp.

Doresc sa va prezint si rezolvarea acestei vurnerabilitati.



In ce consta aceasta vurnerabilitate?

Aceasta vurnerabilitate consta in adaugarea unui text intr-o comanda, dialog, etc. care modifica date din baza de date.



Exemplu:

Am testat pe mai multe servere, in primul rand, te poti autentifica pe un cont de admin prin logare, daca server-ul nu are parolele criptate si nici nu are aceasta vurnerabilitate. Am introdus text-ul: tutorial' OR `Admin`='1

Sau ce admin avea, se poate autentifica si pe un cont care nu este admin, trebuie sa-i stim e-mailul, etc. Inlocuiti acel camp. Cam asa arata un query de cautare in baza de date normal, fara SQL Injection:

SELECT * FROM `users` WHERE `Username`='NumelePersoanei' AND `Password`='ParolaIntrodusa' LIMIT 1

* Asa arata un query cu injectarea de mai sus:

SELECT * FORM `users` WHERE `Username`='NumelePersoanei' AND `Password`='tutorial' OR `Admin`='1' LIMIT 1



Si eu am abuzat foarte mult de aceasta chestie zilele trecute, insa m-am hotarat sa fac o fapta buna si sa se rezolve aceasta treaba.



Poate fi rezolvata? Ce solutii avem?

Da, aceasta vurnerabilitate poate fi rezolvata, in general aceasta este pe gamemode-ul bigzone.

Ca solutii avem urmatoarele:

1) Dialog:

if(strlen(inputtext) >= 1)
{
if(strfind(inputtext, "*", true) != -1 || strfind(inputtext, "?", true) != -1 || strfind(inputtext, "[", true) != -1 || strfind(inputtext, "]", true) != -1 || strfind(inputtext, "!", true) != -1 || strfind(inputtext, "-", true) != -1 || strfind(inputtext, "#", true) != -1 || strfind(inputtext, "%", true) != -1 || strfind(inputtext, "_", true) != -1 || strfind(inputtext, "^", true) != -1|| strfind(inputtext, "-", true) != -1) return SendClientMessage(playerid, -1, "Caractere invalide!");
}
* Am adaugat o restrictie pentru toate caracterele ce pot fi folosite in MySQL pentru modificare.



2) De adaugat in functia OnPlayerCommandReceived:

if(strlen(cmdtext) >= 1)
{
if(strfind(cmdtext, "*", true) != -1 || strfind(cmdtext, "?", true) != -1 || strfind(cmdtext, "[", true) != -1 || strfind(cmdtext, "]", true) != -1 || strfind(cmdtext, "!", true) != -1 || strfind(cmdtext, "-", true) != -1 || strfind(cmdtext, "#", true) != -1 || strfind(cmdtext, "%", true) != -1 || strfind(cmdtext, "_", true) != -1 || strfind(cmdtext, "^", true) != -1|| strfind(cmdtext, "-", true) != -1) return 0;
}
Am mai vazut server in care /changepass era pe text, si aici exista aceasta vurnerabilitate.

3) De adaugat la functia OnPlayerText:

if(strlen(text) >= 1)
{
if(strfind(text, "*", true) != -1 || strfind(text, "?", true) != -1 || strfind(text, "[", true) != -1 || strfind(text, "]", true) != -1 || strfind(text, "!", true) != -1 || strfind(text, "-", true) != -1 || strfind(text, "#", true) != -1 || strfind(text, "%", true) != -1 || strfind(text, "_", true) != -1 || strfind(text, "^", true) != -1|| strfind(text, "-", true) != -1) return 0;
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



* Cam aceasta a fost prezentarea vurnerabilitatii, sper ca ati inteles cate ceva, daca aveti probleme cu implementarea dati-mi mesaj.

As aprecia daca mi-ati da un +1.

Va multumesc pentru atentia acordata!