ES.^

MySQL „hackinimas“ | Padėjusiam sumokėsiu

Recommended Posts

Sveiki. Ant dienų pastebėjau serveryje žaidėją, kuris sugeba bug'inti pinigus, kreditus, atsiblokuoja ir keičia nick'us. Kaip tai įmanoma?

Log'as:

[OFF]: Data: 2014/11/22 14:55:50 | Kenneth_Grahame(IP: **.**.***.**) | Money: 10133 | Bank Money: 450 |

[ON]: Data: 2014/11/22 15:00:01 | Kenneth_Grahame(IP: **.**.***.***) | Money: 10133 | Bank Money: 2000450 |

[OFF] - pinigų kint. reikšmė atsijungiant.

[ON] - pinigų kint. reikšmė prisijungiant.

MySQL atsijungiant išsaugojo 450, užkrovė: 2000450 - tai reiškia, kad bug'ina ne serveryje!

Vakar kažkaip pasikeitė nick'ą ir užsidėjo kreditų - log'e nėra, reiškia tokiu pat būdu (kai buvo atsijungęs). Peržiūrėjau visą mod'ą, visus php failus tinklapyje, kuriuose yra prisijungimas prie serverio PhpMyAdmin - atrodo viskas gerai.

Keylog'o / backdoor'o nebuvau ir nesu pasigavęs. Jeigu žinotu PhpMyAdmin slaptažodį - butu pridirbęs daugiau...

Kas per magija? Kaip ištaisyti?

Padėjusiam sumokėsiu 20 25 50 LTL.

Redaguota , nario ES.^
  • Teigiamai 2

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Spėju kad GetPlayerNameEx funkcija gražina tik paprastą string?

 

String reikia "escapinti", ankstesnėse MySQL plugin versijose tam buvo funkcija mysql_real_escape_string... Tavo laimei, tu naudoji naują versiją. Kur rašai %s, naudok %e. Tai veiks tol, kol naudosi mysql_format.

 

 

Pora pastebėjimų dėl tavo kodo:

  • Saugodamas gali naudoti mysql_pquery. Tai išsiųs paralelinę užklausą, ji dar greitesnė. Tačiau neaišku kuri užklausa nueis pirma, bet šiuo atveju, tai nėra svarbu.
  • Ar tau tikrai reikia TIEK užklausų? 

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Spėju kad GetPlayerNameEx funkcija gražina tik paprastą string?

#define GetPlayerNameEx(%0) pInfo[%0][PlayerName]
stock j_GetPlayerName(playerid)
{
     GetPlayerName(playerid, pInfo[playerid][PlayerName], 21);
     if(!strcmp("--", pInfo[playerid][PlayerName], true))
     {
          j_GetPlayerName(playerid);
     }
}

String reikia "escapinti", ankstesnėse MySQL plugin versijose tam buvo funkcija mysql_real_escape_string... Tavo laimei, tu naudoji naują versiją. Kur rašai %s, naudok %e. Tai veiks tol, kol naudosi mysql_format.

Nežinau/nesuprantu apie ką kalbi.

Pora pastebėjimų dėl tavo kodo:

  • Saugodamas gali naudoti mysql_pquery. Tai išsiųs paralelinę užklausą, ji dar greitesnė. Tačiau neaišku kuri užklausa nueis pirma, bet šiuo atveju, tai nėra svarbu.
  • Ar tau tikrai reikia TIEK užklausų? 
Apie mysql_pquery negirdėjau. Ne, tiek užklausų nereikia. Kodas labai senas, neturiu laiko sutvarkyt...

P.S: String ilgis j_GetPlayerName 21, todėl, kad tik su tokiu nick'ų galima prisijungt į serverį. Rekursija padaryta, todėl, kad ne visada iš pirmo karto išgauna nick'ą.

Redaguota , nario ES.^

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Pavyzdys:

mysql_format(MYSQL_ARG, tQuery, 190, "UPDATE `players` SET `PINkodas` = '%d', `Adminas` = '%d', `Vipas` = '%d', `VipLaikas` = '%d', `VipIspejimai` = '%d' WHERE `Vardas` = '%e'", pInfo[playerid][pPinKodas], pInfo[playerid][pAdmin], pInfo[playerid][pVip], pInfo[playerid][VipLaikas], pInfo[playerid][VipIspejimai], GetPlayerNameEx(playerid));

Vienintelis pokytis: "%s" tampa "%e".  Tai automatiškai escapins string. 

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Pavyzdys:

mysql_format(MYSQL_ARG, tQuery, 190, "UPDATE `players` SET `PINkodas` = '%d', `Adminas` = '%d', `Vipas` = '%d', `VipLaikas` = '%d', `VipIspejimai` = '%d' WHERE `Vardas` = '%e'", pInfo[playerid][pPinKodas], pInfo[playerid][pAdmin], pInfo[playerid][pVip], pInfo[playerid][VipLaikas], pInfo[playerid][VipIspejimai], GetPlayerNameEx(playerid));
Vienintelis pokytis: "%s" tampa "%e".  Tai automatiškai escapins string.
Ir šis kodas sutvarkys šią klaidą?

P.S: Jeigu klaida serveryje, kodėl kai atsijungia, išsaugoja - viskas gerai (kaip turi būti), po 5 min. ateina ir iš MySQL traukia jau 2 mln...

P.P.S: Error'ų ir warning'ų mysql log'e nėra.

Redaguota , nario ES.^

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Jei aš atspėjau kokia tavo problema, padės. Jei ne tai reiškia problema kita. Neišbandęs nesužinosi.

Tai man dabar reikėtu absoliučiai visus '%s' pakeist į '%e'? UPDATE, SELECT ir INSERT funkcijose?

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Kur naudoji mysql_format, taip.

Supratau, dėkui. Pabandysiu, ant dienų atrašysiu.

P.S:

Kokie simboliai užklausoje gali išsiųsti SQL injekciją? Tik „'“? Pas mane praktiškai visur paprasti, normalus tekstai ir visur yra apsaugos nuo „'“ simbolio. Kažkaip abejoju, kad Justo pasiūlymas pakeisti visus '%s' į '%e' padės. Jeigu net pavyktu išsiųst tą simbolį tai žmogus negautu jokio rezultato, tiesiog išmestu MySQL error. Kiek žiūrėjau log'ą, ten absoliučiai nieko blogo ar panašaus neradau. Nesenai rašiau žmogui kuris naujina mano kreditų sistema (tinklapyje), jis sakė, kad sistema nesaugi. Tai gal problema ten o ne mod'e?

Redaguota , nario ES.^

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

o gal tiesiog jis prisijungia pas tau prie servo su ssh ir prisideda tu pinigu?

Kaip?

-------------------------------

Padėjusiam sumokėsiu 25 LTL.

Redaguota , nario ES.^

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Geriausiai tą klaidą sutvarkys tas kuris ją rado. Bandyk susisiekt su tuo žmogumi kaip nors.

Buvau susisiekęs, nežadu mokėt pinigų už "pagalbą". Kelis kartus bandė apgaut ir vieną kartą net siuntė backdoor'ą.

Žinau tiksliai, kad įsilaužia į duomenų bazę, tik nežinau kaip... Manau, kad per php failus, ieškau klaidos.

Redaguota , nario ES.^

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį
Svečias
Ši tema yra užrakinta.

  • Šiame puslapyje naršo:   0 nariai

    Nėra registruotų narių peržiūrinčių šį forumą.


  • SuperGames programele
  • SuperGames programele