Jump to content
Autentificarea cu Google și Facebook nu mai este disponibilă. ×

Recommended Posts

Posted (edited)

Salut!

Astazi mi-a venit ideea sa postez o mare vurnerabilitate a serverelor de SA:MP (in special la cele mici) 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 un query care trebuie sa fie executat in 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!

 

UPDATE (Edit): Am facut un filterscript pentru a evita aceasta vurnerabilitate.

AntiSQLInjection.amx

Edited by Yonut
UPDATE (FIlterscript)
Posted
Just now, WopsS said:

Cred ca acest topic se potriveste mai bine la tutoriale. L-am mutat acolo.

Ok, nu am gasit acel topic atunci si l-am postat acolo. Mersi oricum!

  • 1 month later...
Posted
32 minutes ago, segmentationfault said:

sau este suficient sa folositi mysql_escape_string peste input-uri... ?

Sau asa

Posted (edited)
8 hours ago, segmentationfault said:

sau este suficient sa folositi mysql_escape_string peste input-uri... ?

functia mysql_format din pluginul mysql folosita cu specificatorul %e pentru string-uri face automat asta

alternativ se poate utiliza %q in functia nativa format 

Edited by Ksenon
Posted
2 hours ago, Ksenon said:

functia mysql_format din pluginul mysql folosita cu specificatorul %e pentru string-uri face automat asta

alternativ se poate utiliza %q in functia nativa format 

mi-ai dat lectia kseny, n-am ce zice m-ai muit

Posted
2 hours ago, Ksenon said:

functia mysql_format din pluginul mysql folosita cu specificatorul %e pentru string-uri face automat asta

alternativ se poate utiliza %q in functia nativa format 

mr ksenon, socheres prala

 

 

Posted (edited)
2 hours ago, Ksenon said:

functia mysql_format din pluginul mysql folosita cu specificatorul %e pentru string-uri face automat asta

alternativ se poate utiliza %q in functia nativa format 

Cea mai eficienta asta ar fi zic eu, atunci nu mi-am dat seama, doar de metodele clasice

Edited by Yonut

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.