Ako napísať registráciu v php. Jednoduchý systém registrácie používateľov. Schéma databázy

  • 20.06.2020

Dnes sa pozrieme na využitie kritickej 1-dňovej zraniteľnosti v populárnom redakčnom systéme Joomla, ktorý explodoval na internete koncom októbra. Budeme hovoriť o zraniteľnostiach s číslami CVE-2016-8869, CVE-2016-8870 a CVE-2016-9081. Všetky tri pochádzajú z jedného kusu kódu, ktorý sa v hlbinách frameworku ukrýval dlhých päť rokov a čakal v krídlach, aby sa potom oslobodil a priniesol so sebou chaos, hacknuté stránky a slzy nevinných používateľov tejto Joomly. Len tí najudatnejší a najodvážnejší vývojári, ktorých oči sú červené od svetla monitorov a ktorých klávesnice sú posiate omrvinkami, dokázali vyzvať zúrivých zlých duchov a položiť hlavu na oltár opráv.

UPOZORNENIE Všetky informácie sú poskytované len na informačné účely. Redakcia ani autor nezodpovedajú za prípadné škody spôsobené materiálmi tohto článku. Kde to všetko začalo

6. októbra 2016 Demis Palma vytvoril tému na Stack Exchange, v ktorej sa pýtal: prečo vlastne v Joomla verzii 3.6 existujú dve metódy na registráciu používateľov s rovnakým menom register()? Prvý je v ovládači UsersControllerRegistration a druhý je v ovládači UsersControllerUser. Damis chcel vedieť, či bola niekde použitá metóda UsersControllerUser::register(), alebo či to bol len evolučný anachronizmus, ktorý zostal zo starej logiky. Jeho obavou bolo, že aj keď túto metódu nepoužíva žiadny pohľad, dá sa volať vytvoreným dotazom. Na čo som dostal odpoveď od vývojára pod prezývkou itoctopus, ktorý potvrdil: problém naozaj existuje. A poslal správu vývojárom Joomla.

Potom sa udalosti vyvíjali najrýchlejšie. 18. októbra vývojári Joomly prijali správu od Damisa, ktorý v tom čase vypracoval PoC, ktorý by umožňoval registráciu používateľov. Na svojej webovej stránke zverejnil poznámku, v ktorej hovoril všeobecne o probléme, ktorý našiel, a svojich názoroch na túto záležitosť. V ten istý deň je vydaná nová verzia Joomla 3.6.3, ktorá stále obsahuje zraniteľný kód.

Potom Davide Tampellini roztočí chybu do bodu, keď zaregistruje nie jednoduchého používateľa, ale správcu. A 21. októbra prichádza do bezpečnostného tímu Joomla nový prípad. Už hovorí o zvyšovaní privilégií. V ten istý deň sa na webovej stránke Joomla objavuje oznámenie, že v utorok 25. októbra bude vydaná ďalšia verzia so sériovým číslom 3.6.3, ktorá opravuje kritickú zraniteľnosť v jadre systému.

25. október Tím Joomla Security Strike našiel najnovší problém vytvorený kúskom kódu, ktorý objavil Damis. Potom sa do hlavnej vetvy oficiálneho úložiska Joomla natlačí commit s dátumom 21. októbra s nenápadným názvom Prepare 3.6.4 Stable Release, ktorý nešťastnú chybu opravuje.

Po tomto vydaní sa do komunity vývojárov pripojí množstvo zainteresovaných jednotlivcov – začnú propagovať zraniteľnosť a pripravovať exploity.

27. októbra výskumník Harry Roberts nahrá hotový exploit do úložiska Xiphos Research, ktorý dokáže nahrať súbor PHP na server so zraniteľným CMS.

Podrobnosti

Pozadie je u konca, prejdime k najzaujímavejšej časti – analýze zraniteľnosti. Nainštaloval som Joomla 3.6.3 ako testovaciu verziu, takže všetky čísla riadkov budú relevantné pre túto verziu. A všetky cesty k súborom, ktoré uvidíte nižšie, budú uvedené vzhľadom na koreňový adresár nainštalovaného CMS.

Vďaka objavu Damisa Palmu vieme, že existujú dve metódy, ktoré vykonávajú registráciu používateľov v systéme. Prvý z nich používa CMS a nachádza sa v súbore /components/com_users/controllers/registration.php:108. Druhý (ten, ktorý budeme musieť zavolať) žije v /components/com_users/controllers/user.php:293. Poďme sa na to pozrieť bližšie.

286: /** 287: * Spôsob registrácie používateľa. 288: * 289: * @return boolean 290: * 291: * @od 1.6 292: */ 293: register verejnej funkcie () 294: ( 295: JSession::checkToken("post") alebo jexit(JText::_ ("JINVALID_TOKEN") ... 300: // Získanie údajov formulára 301: $data = $this->input->post->get("user", array(), "array" . 315: $return = $model->validate($form, $data: // Kontrola chýb 318: if ($return === false) 319: ( ... 345: / /); Dokončite registráciu 346: $return = $model->register($data);

Tu som nechal len zaujímavé riadky. Plnú verziu zraniteľnej metódy si môžete pozrieť v úložisku Joomla.

Poďme zistiť, čo sa stane počas bežnej registrácie používateľa: aké údaje sa odosielajú a ako sa spracúvajú. Ak je v nastaveniach povolená registrácia používateľa, formulár nájdete na http://joomla.local/index.php/component/users/?view=registration.


Legitímna žiadosť o registráciu používateľa vyzerá ako nasledujúca snímka obrazovky.


Komponent com_users je zodpovedný za prácu s používateľmi. Venujte pozornosť parametru úlohy v požiadavke. Má formát $controller.$method . Pozrime sa na štruktúru súborov.

Názvy skriptov v priečinku controllers zodpovedajú menám volaných ovládačov. Keďže naša požiadavka má teraz $controller = "registrácia" , zavolá sa súbor registration.php a jeho metóda register().

Pozor, otázka: ako preniesť spracovanie registrácie na zraniteľné miesto v kóde? Pravdepodobne ste to už uhádli. Názvy zraniteľných a skutočných metód sú rovnaké (register), takže stačí zmeniť názov volaného kontroléra. Kde sa nachádza náš zraniteľný kontrolór? Presne tak, v súbore user.php. Ukázalo sa, že $controller = "user" . Keď všetko dáme dokopy, dostaneme task = user.register . Teraz je žiadosť o registráciu spracovaná metódou, ktorú potrebujeme.


Druhá vec, ktorú musíme urobiť, je odoslať údaje v správnom formáte. Všetko je tu jednoduché. Legitimný register() od nás očakáva pole s názvom jform , do ktorého odovzdávame registračné údaje - meno, prihlasovacie meno, heslo, email (pozri snímku obrazovky so žiadosťou).

  • /components/com_users/controllers/registration.php: 124: // Získanie používateľských údajov.

125: $requestData = $this->input->post->get("jform", array(), "pole");

  • Náš klient získava tieto údaje z poľa s názvom user.

/components/com_users/controllers/user.php: 301: // Získanie údajov formulára.

302: $data = $this->input->post->get("user", array(), "pole");

  • Preto meníme názvy všetkých parametrov v požiadavke z jfrom na user .

Naším tretím krokom je nájsť platný CSRF token, pretože bez neho nebude registrácia.


/components/com_users/controllers/user.php: 296: JSession::checkToken("post") alebo jexit(JText::_("JINVALID_TOKEN"));

Takto to vyzerá v „pracovnej“ metóde register() z radiča UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Ak je registrácia zakázaná - Presmerujte na prihlasovaciu stránku.

114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=) login", false)); 117: 118: return false; 119: )

  • A tak v zraniteľnom:

/components/com_users/controllers/user.php:

Áno, v žiadnom prípade.

Aby sme pochopili druhý, oveľa vážnejší problém, pošlime požiadavku, ktorú sme vytvorili, a pozrime sa, ako sa vykonáva v rôznych častiach kódu. Tu je časť, ktorá je zodpovedná za overenie údajov odoslaných používateľom v pracovnej metóde:

Pokračovanie je dostupné len pre členov Možnosť 1. Pripojte sa ku komunite „stránky“ a prečítajte si všetky materiály na stránke

Členstvo v komunite v určenom období vám umožní prístup ku VŠETKÝM materiálom Hackerov, zvýši vašu osobnú kumulatívnu zľavu a umožní vám nazbierať profesionálne hodnotenie Xakep Score!
Dobrý deň, priatelia, v tomto návode sa naučíme registráciu a prihlásenie používateľov pomocou uloženej procedúry PHP.
Štruktúra súboru pre tento tutoriál
config.php
index.php
check_availability.php
login.php
vitajte.php
odhlásiť.php

Štruktúra tabuľky SQL tblregistration

CREATE TABLE `tblregistration` (`id` int(11) NOT NULL, `FullName` varchar(200) NOT NULL, `EmailId` varchar(200) NOT NULL, `Password` varchar(255) NOT NULL, `RegDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=latin1;

config.php

Vytvorte konfiguračný súbor db pomocou rozšírenia mysqli. Poskytnite poverenia podľa vašej konfigurácie

index.php

Vytvorte html formulár na registráciu používateľa.

Registrácia Celé meno E-mail Heslo

Už zaregistrovaný. prihláste sa tu

Jquery / Ajax pre dostupnosť e-mailu používateľa

check_availability.php
Na tejto stránke skontrolujeme dostupnosť e-mailu používateľa. Vytvorte procedúru obchodu s dostupnosťou kontroly názvu

Kód postupu uloženia:

DELIMITER $ CREATE DEFINER=`root`@`localhost` PROCEDURE `checkavailbilty`(IN `email` VARCHAR(255)) NO SQL SELECT EmailId FROM tblregistration WHERE EmailId=email$ DELIMITER ;
Teraz vytvorte procedúru uloženia pre registráciu používateľa.

DELIMITER $ CREATE DEFINER=`root`@`localhost` PROCEDURE `registration`(IN `fname` VARCHAR(200), IN `emailid` VARCHAR(200), IN `password` VARCHAR(255)) NO SQL insert into tblregistration( Celé meno,EmailId,Heslo) VALUES(meno,email,heslo)$ DELIMITER ;

Po vytvorení procedúry store vykonajte procedúru store.

Tu je úplný kód, ktorý sme napísali na registráciu (index.php):

Registrácia pomocou funkcie Store Procedure checkAvailability() ( $("#loaderIcon").show(); jQuery.ajax(( url: "check_availability.php", data:"emailid="+$("#email").val (), zadajte: "POST", success:function(data)( $("#user-availability-status").html(data); $("#loaderIcon").hide(); ), error:function ()() )) Registrácia Celé meno E-mail Heslo

Registrácia Celé meno E-mail Heslo

login.php

Vytvorte prihlasovací formulár prihlásenie používateľa.

prihlásenie

Nie ste zaregistrovaný? Vytvorte si účet

Teraz vytvorte ukladaciu procedúru pre prihlásenie pomocou prihlasovacieho mena.
Postup prihlásenia do obchodu:

DELIMITER $ CREATE DEFINER=`root`@`localhost` PROCEDURE `login`(IN `useremail` VARCHAR(255), IN `password` VARCHAR(255)) NO SQL SELECT EmailId,Password from tblregistration where EmailId=useremail and Password= heslo$ DELIMITER ;

Teraz vykonajte postup ukladania prihlásení