Jump to content

SQL Injection


Yonut

Recommended Posts

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)

Nu mai raspund la mesaje de pe acest forum, decat foarte rar, m-am mutat pe alt forum.

Detalii de contact pe site-ul meu

Multumesc pentru intelegere!

 

Link to comment
Share on other sites

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!

Nu mai raspund la mesaje de pe acest forum, decat foarte rar, m-am mutat pe alt forum.

Detalii de contact pe site-ul meu

Multumesc pentru intelegere!

 

Link to comment
Share on other sites

  • 1 month later...
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
Link to comment
Share on other sites

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

Nu mai raspund la mesaje de pe acest forum, decat foarte rar, m-am mutat pe alt forum.

Detalii de contact pe site-ul meu

Multumesc pentru intelegere!

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • 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.