How I hacked your mother… ahem, blog

Ez a post ott akarja felvenni a fonalat, ahol a webfejlesztésről – illetve annak hiányáról a képzésben – szóló véget ért, és egy kicsit rendhagyó módon próbál rámutatni arra, hogy a képzés által nem nyújtott, ám mégis érdekes dolgok – ha eléggé érdekelnek – megtanulhatóak saját kútfőből is (és jókat lehet szórakozni menet közben).

No de ki a franc vagyok én?

  • Képzett hacker több év tapasztalattal villanykaros diák
  • Valamennyit konyítok a webhez
  • Tárgyak nélkül célját vesztett kalandorként járom a kékség tengerét amit ti csak Facebookként ismertek

A történet ugyanis ott kezdődik hogy a fent linkelt postot meglátván elcsodálkoztam azon, hogy mennyire nehezen megy egy logo lecserélése egy ilyen WordPress alapú oldalon. Abban a hitben éltem hogy ilyesmit tenni egy ilyen modernebb blogmotoron nem valami észveszejtő dolog, így két lehetőség fogalmazódott meg az elmémben:

  1.  A fenti post írója téved, és csak nem talált meg valami panelt ahol ezt mind el lehet intézni
  2. Én tévedek, és tényleg túrni kell a kódban míg az ember megoldja a problémát

Mivel úgy gondoltam hogy mind a két esetet meg tudom oldani, így a magam kicsit nyakatekert módján megpróbáltam ezt úgy megtenni, hogy közben senki se tudjon róla hogy én voltam – be akartam jutni az oldal szerkesztői felületére. Abból hogy jelenleg ezt itt olvashatjátok az is kiderül, hogy sikerült.

Hogy hogyan? A módszer neve SQL Injection, a lényege pedig, hogy a sebezhető PHP kódban található SQL lekérésbe olyan módon tud beletúrni a támadó, hogy egy kis trükközéssel manipulálni tudja, hogy az oldal milyen információval szolgál számára – mondjuk az archívumban a régi évfolyamok régi számainak helyén a rendszerben feljegyzett felhasználók nevét és jelszavainak hashelt alakját tudja kiíratni. De inkább egy kis példakóddal szemléltetem a dolgot nektek. Tegyük fel, hogy van egy hasonló sor a PHP kódban:

mysql_query("SELECT * FROM users WHERE name = ".$_GET["username"]." AND password = ".$_GET["password"]);

Itt az $_GET globális változóval tudjuk elérni az url-ben átadott paramétereket, amiket valahogy így lehet megadni:

impulzus.com/blog/login?username=pista&password=jelszo

Ilyenkor a username helyére a lekérésben a “pista”, a password helyére pedig a “jelszó” szöveg kerül, majd ez a lekérés megy el az SQL szerver felé, amely ha van olyan user akinek pista a neve és jelszo a jelszava, akkor az ő adataival, különben pedig a nagy semmivel tér vissza – ezzel könnyen ellenőrizhető hogy valaki helyes adatokat ad-e meg. Vagy mégsem?

Mi van akkor, ha én most nem azt írom jelszónak hogy “jelszo”, hanem hogy “asd or 1=1”? Ekkor a lekérés a következő formát ölti:

SELECT * FROM users WHERE name = pista AND password = asd or 1=1

Nem meglepő módon így is be lehet jutni pista nevével, pista jelszavának ismerete nélkül az oldalra, hiszen a lekérés végére írt 1=1 mindig igazat fog adni, így a jelszó ellenőrzését tulajdonképpen kijátszottuk.

Most mondhatjátok, hogy ez mind szép és jó, de mi köze van ennek ahhoz, hogy én most ezt a postot írhatom? Hát sajnálatos módon egy rövid kutatás után sikerült az impulzus blogon egy ilyen sebezhető részt találnom és egy kis Google használattal olyan lekérést megfogalmaznom, ami előbb elmondta nekem, hogy az adatbázisban milyen táblák vannak és azok milyen szerkezettel rendelkeznek, majd miután tudtam, hogy van egy users tábla, sikerült előállnom pár usernév és hashelt jelszó párossal.

Ez még mindig nem lenne elég ahhoz, hogy bejussak, hiszen ez egy külön login rész táblája, a WordPresshez nem sok köze van – ám valaki véletlenül olyan jelszót választott aminek az md5 hashe – amely algoritmust ez a login rész használt a jelszavak tárolására – könnyen visszafejthető (egészen pontosan kikereshető, a hashelés egyirányú folyamat, de ha feljegyezzük hogy milyen szövegből milyen hash születik, akkor visszafejthetjük az eredeti szöveget egy hash alapján), egy Google keresés és már meg is van a jelszó. Baromi nagy szerencsém volt, ugyanis ennek a felhasználónak ugyanez volt a jelszava a WordPresses részen is, így bejutottam (az meg még nagyobb szerencse, hogy nem egy mezei halandóé volt a user).

Mivel alapvetően nem gonosz szándékkal jöttem, így a hirtelen örömömet, ami a bejutásból fakadt magam mögé tettem és elkezdtem bújni a menüt – meg is találtam a menüpontot amivel be tudom állítani a táncoló banánt, és mint kiderült az animáció azért nem akart működni, mert a WordPress átméretezi a képeket – de a gifeknél nem veszi figyelembe az animációt. Ezt ki lehet játszani úgy, hogy egy olyan képet tölt fel az ember amit nem kell átméreteznie a 220*220 pixelre az oldalnak, így megmarad az animáció. Nyert ügyünk van, hurrá, jöhet a stáblista.

Miután fölényes győzelmem öröme alábbhagyott, rájöttem, hogy még nem szóltam senkinek, hogy bejutottam – és valószínűleg a helyes tett az lenne, ha megtenném. Mivel a tagok közül ismertem pár embert, megkerestem az elsőt, akit találtam, és megpróbáltam rávenni a vezetőséget arra, hogy a dolgot a lehető leghamarabb javítsák ki – ugyanis én csak bejutni akartam, de sokkal hamarabb végezhetett volna valaki, aki csak a qpán el-elsütött DROP TABLE-t használja, effektíve kitörölve minden adatot az adatbázisból.

Sajnos meglepően lassan akartak megoldódni a dolgok, de én eltökélt voltam, szerettem volna megoldani a problémát – sajnos olyan szintre nem tudtam jutni az általam megszerzett usernévvel és jelszóval, hogy a lyukat, amin bejöttem kifele menet be is tudjam tömni, így kénytelen voltam várni a felsőbb vezetésre – ám mivel valószínűleg nem sikerült átadnom a probléma pontos forrását és súlyát, így csak azt sikerült elérnem, hogy valaki feltelepített egy WordPress modult, aminek a segítségével aztán jól ki is bannolta az egész oldalról az ip-met. :C

Sajnos, ezen illető azt nem tudhatta, hogy az ip ban kikerülése gyerekjáték, főleg akkor, ha az ember internetszolgáltatója dinamikusan osztja ki neki az ip-ket – két kattintás a routeren és már megint be tudtam lépni. Ekkor határoztam el, hogy megkeresem én az illetékest közvetlenül – SQL Injection segítségével kiderítettem, hogy milyen usernév alatt fut a mysql server és a tagok közül megkerestem azt, akinek a nevéhez illett a nickname – szerencsémre az illető kedves és segítőkész volt, így végül a lyukat betömtük, remélhetőleg örökre.

Mint minden jó történetnek, ennek is van tanulsága: ha valami érdekel, de az egyetemen nem tudod megtanulni, akkor is van esélyed arra, hogy elég jó szintre eljuss az adott területen, már ha elég elszánt és lelkes vagy, valamint időt is tudsz rá keríteni magadnak. Szóval ha valami érdekel, vágj bele, nézz utána, ne félj az ismeretlen banános animált gifek világától! Ja, és ne légy gonosz! Az gonosz dolog.

Vélemény, hozzászólás?

Ez a weboldal az Akismet szolgáltatását használja a spam kiszűrésére. Tudjunk meg többet arról, hogyan dolgozzák fel a hozzászólásunk adatait..