Layer Cake a com_weblinks Joomla. Hacky a doplnky Špinavé webové odkazy php


Začnime sa pozerať na komponenty tak, že sa pozrieme na to, ako funguje základný komponent Weblinks v administračnej časti webovej stránky. Tento komponent, ktorý je typický pre túto časť webu, je veľmi podobný jeho ostatným komponentom určeným na správu článkov, používateľov, modulov atď.

Programové súbory pre tento komponent sú uvedené nižšie. Všetky tieto súbory sa nachádzajú v priečinku administator/components/com_weblinks. Vo zvyšku tejto kapitoly sa všetky názvy súborov komponentov Weblinks odkazujú na tento počiatočný priečinok, pokiaľ nie je uvedené inak. Väčšina súborov je usporiadaná podľa vzoru MVC. Konkrétne, všetky súbory zobrazenia sú v podpriečinku views a všetky hlavné súbory modelu a ovládača sú v podpriečinkoch modelov a ovládačov. Sú doplnené aj o inštalačné, konfiguračné a pomocné súbory.

Súbory administratívnej časti komponentu Weblinks, okrem súborov index.html

  • controllers/weblink.php - Hlavný ovládač na úpravu Single weblink controller
  • controllers/weblinks.php - Hlavný ovládač na zostavenie ovládača a zobrazenie zoznamu webových odkazov na obrazovke Weblinks Manager
  • helpers/weblinks.php - Poskytuje rôzne metódy používané v ovládačoch a zobrazeniach
  • models/fields/ordering.php - model JformField zobrazujúci stĺpec pre objednávanie webových odkazov na obrazovke Weblinks Manager
  • models/forms/weblink.xml – súbor XML používaný v triede Jform-Model Field na rozloženie formulára so vstupnými poľami a úpravu webových odkazov na obrazovke
  • models/weblink.php - Model pre jednoobrazovkový model webového odkazu
  • models/weblinks.php - Model pre obrazovku manažéra Model webových odkazov
  • sql/install.mysql.utf8.sql – súbor SQL na vytvorenie tabuľky webových odkazov počas inštalácie
  • sql/uninstall.mysql.ut8.sql – súbor SQL na odstránenie tabuľky webových odkazov počas inštalácie
  • tables/weblink.php - Poskytuje triedu Model
  • views/weblink/tmpl/edit_metadata.php – Súbor zdrojového rozloženia na úpravu metadát webového odkazu

Administratívna časť komponentu Weblinks

  • views/weblink/tmpl/edit_params.php – Súbor zdrojového rozloženia na úpravu možností výberu jedného webového odkazu
  • views/weblink/tmpl/edit.php – Súbor zdrojového rozloženia na úpravu webového odkazu
  • views/view.html.php - Hlavná trieda zobrazenia na zobrazenie jedného webového odkazu vo formáte HTML Zdrojový súbor rozloženia pre správcu webových odkazov
  • views/weblinks/view.html.php – Hlavná trieda zobrazenia na zobrazenie webových odkazov vo formáte HTML priamo na obrazovke správcu webových odkazov
  • access.xml - XML ​​​​súbor poskytujúci zoznam akcií pre systém zoznamu prístupových práv (ACL).
  • config.xml - XML ​​​​súbor poskytujúci zoznam možností pre výber konfigurácie komponentu
  • controller.php - Hlavná trieda ovládača
  • weblinks.php – Vstupný bod pre požiadavku
  • weblinks.xml - súbor XML používaný na kontrolu procesu inštalácie

Vrstvená torta

Budeme hovoriť o komponente com_weblinks a html značke stránky Joomla. O tom, ako ľahko a jednoducho vytvoriť adresár odkazov na webovej stránke Joomla.

Tento CMS bol vytvorený pre interaktívnu prácu s registrovaným užívateľom, bez priameho kódovania. Aj keď vývojový trend Joomly vedie k opusteniu komponentu com_weblinks ako úplne zbytočného na stránke a jednoduchému pridávaniu extra váhy (viac ako 100 kb - 90 súborov) do už aj tak „ťažkého“ systému. Ale zatiaľ je tento komponent stále prítomný v distribúcii a používajú ho niektorí programátori.

Webová stránka Joomla viditeľná na obrazovke je vrstvový koláč, na ktorého konštrukcii sa súčasne podieľa veľa blokov (a teda veľa šablón). Tu vstupuje do hry filozofia Joomla – budovanie stránok z veľkých blokov. Každý blok musí mať vlastnú šablónu HTML značkovania (rozloženie).

Hlavné bloky:

Šablóna hlavnej stránky (site_template/index.php), ktorá svojím html označením definuje pozície pre moduly a komponenty a zobrazuje tieto moduly a komponenty.
- šablóna stránky
- šablóny modulov
- šablóny komponentov

Každý z týchto veľkých blokov je k dispozícii na úpravu (zmeny). To znamená, že môžete samostatne upravovať napríklad šablónu ľubovoľného modulu alebo komponentu a na stránke bude vyzerať ako nová. To isté platí pre šablónu stránky.

Pre začínajúceho programátora môže byť ťažké pochopiť, že prvý riadok v obsahovej časti stránky sa zobrazuje ako názov stránky a upravuje sa na editačnej stránke položky ponuky, ktorá ukazuje na túto stránku. Že druhý riadok je odvodený zo šablóny komponentu com_content alebo com_weblinks. A reťazce v šablónach sú zvyčajne reťazcové premenné a ich inicializácia a lokalizácia sa vykonáva v jazykových súboroch, ako napríklad language\ru-RU\ru-RU.mod_weblinks.ini a podobne.

Niekedy je začiatočník zmätený tým, ktorá šablóna vytvorila ten či onen riadok, ktorý na obrazovke vyzerá ako logické pokračovanie toho istého príbehu. Ukazuje sa, že jeden riadok je v jednej šablóne, druhý v druhej šablóne a tretí v tretej. A tabuľka nižšie je výstupom zo šablóny modulu mod_tabform.

Niekedy sa šablóny modulov nazývajú rozloženia. Ale to je otázka terminológie. Podstata je rovnaká - je to „oblečenie“ pre obsah. Správnejšie by bolo povedať označenie. Takže označenie jednej stránky obrazovky sa nachádza v rôznych adresárových súboroch Joomla.

Ponuka

Mnoho nových Joomla programátorov často nechápe, že položky menu môžu mať rôzne typy. Inými slovami, položky ponuky môžu odkazovať na objekty Joomla rôznych typov. Môžu to byť rôzne objekty, ako napríklad: komponenty (hlasovanie, vyhľadávanie, adresár odkazov atď.).

Výber typu položky ponuky:

Kontakty (com_contact)
Zoznam kategórií kontaktov (kategórií)
Zoznam kontaktov danej kategórie (kategórie)
Kontakt
Obľúbené kontakty (odporúčané)

Materiály (com_content)
Archívne materiály (archív)
Materiál (článok)
Zoznam všetkých kategórií (kategórií)
Kategória blogu
Zoznam kategórie materiálov (kategória)
Odporúčané materiály
Vytvorte materiál

Inteligentné vyhľadávanie (com_search)
Vyhľadávanie

Ahoj svet! (com_helloworld)
Správa (helloworld)

Novinky (com_newsfeeds)
Zoznam všetkých kategórií spravodajských kanálov (kategórií)
Zoznam spravodajských kanálov v kategórii (kategória)
Newsfeed

Hľadať (com_search)
Vyhľadávací formulár a zoznam výsledkov vyhľadávania (vyhľadávanie)

Správca používateľov (com_users)
Autorizačný formulár (prihlásenie)
Používateľský profil (profil)
Zmeniť užívateľský profil
Registračný formulár
Obnovenie používateľského mena (pripomenutie)
Zmena hesla (reset)

Wrapper (com_wrapper)
Zavinovačka

Ako vidíte, všetky typy ponúk sú tu komponenty. Typ položky ponuky svojím názvom v skutočnosti označuje názov šablóny svojho typu komponentu. Šablóny komponentov sa nachádzajú v adresároch zobrazení:

joomla\components\com_weblinks\views\categories
joomla\components\com_weblinks\views\category
joomla\components\com_weblinks\views\weblink
joomla\components\com_users\views\login

Ako vidíte, názvy typov odkazov v ponuke a názvy šablón v adresároch vews sú rovnaké.

Vývojár má možnosť vytvárať nové neštandardné šablóny (rozloženia) komponentov. Tieto nové rozloženia sa prejavia aj ako nové typy ponúk v okne výberu typu ponuky. Toto je samostatná téma.

Demo obsah distribúcie Joomla

Pozrime sa, ako je postavená hierarchia položiek ponuky "O Joomle" na zobrazenie komponentu com_weblinks na predvolenom demo obsahu (Beez2 - Predvolené) šablóne Joomla.

Prejdeme na admin panel a upravíme komponent com_weblinks: Components->Links. Vidíme, že v demo obsahu, ktorý sa dodáva s distribúciou, bolo vytvorených päť kategórií pre komponent com_weblinks. To znamená, že odkazy budú rozdelené do piatich kategórií. Všetky vytvorené kategórie sa uložia do databázovej tabuľky #_categories. V tej istej tabuľke sú uložené aj kategórie pre ostatné komponenty.

Vzorové dátové odkazy
|-Park Links
|-Joomla! Konkrétne odkazy
|-|-Iné zdroje
Nezaradené do kategórie

V ponuke About Joomla (v editore ponuky) bola podľa toho vytvorená hierarchia položiek ponuky:

Hierarchia položiek menu:

Pomocou Joomla! (typ: materiál)
|-Používanie rozšírení (typ: zoznam všetkých kategórií) :: zoznam kategórií v materiáloch
|-|-Komponenty (typ: kategória blog) :: kategória v materiáloch
|-|-|-Komponent Weblinks (typ: materiál)
|-|-|-|-Odoslať webový odkaz (napíšte: vytvoriť odkaz) :: v komponente Odkazy
|-|-|-|-Webové odkazy Jedna kategória (typ: zoznam odkazov v kategórii) :: v komponente Odkazy
|-|-|-|-Kategórie odkazov (typ: zoznam kategórií odkazov) :: v komponente Odkazy

Vidíme, že niektoré položky ponuky majú typy: zoznam kategórií, zoznam odkazov v kategórii a vytvorenie odkazu.
"Zoznam kategórií odkazov" určuje najvyššiu kategóriu, z ktorej sa zobrazí hierarchia.
"Zoznam odkazov v kategórii" určuje kategóriu, ktorej odkazy sa zobrazia.
V položke „Vytvoriť odkaz“ sa zobrazí formulár, ktorý bude musieť registrovaný užívateľ vyplniť.
Mimochodom, takto vyzerá odkaz na tento formulár v editore (v paneli s adresou sa zmení jeho vzhľad):

index.php?option=com_weblinks&view=form&layout=edit

Niektoré položky menu môžu byť zobrazené len registrovaným užívateľom! Napríklad položka ponuky s typom „Vytvoriť odkaz“ bude viditeľná iba pre registrovaných používateľov. Táto funkcia bola vytvorená špeciálne preto, aby registrovaní užívatelia mohli vytvárať odkazy, ktoré budú zverejnené na stránke.

Komponent com_weblinks teda poskytuje dobrý spôsob, ako interaktívne vyplniť stránku zaujímavými odkazmi. Navyše všetky odkazy, ktoré budú umiestnené na takejto stránke, majú presmerovanie, to znamená, že nebudú indexované ako externé. Možno ste videli takéto odkazy na fórach. Keď na takýto odkaz nabehnete myšou, zobrazí sa vám adresa vašej stránky a až po kliknutí na ňu budete presmerovaní na vami zadanú adresu.

Schopnosť používateľa pridávať odkazy na externé stránky je hlavnou výhodou a zmyslom komponentu com_weblinks, rovnako ako možnosť používateľa pridávať nový obsah – články, obrázky, videosúbory atď.

Umožniť registrovanému užívateľovi s právami naplniť stránku obsahom bez priameho kódovania je základnou filozofiou CMS Joomla.

Nezaradené do kategórie
Vzorové údaje-články
|- Joomla!
|-|- Rozšírenia
|-|-|- Komponenty
|-|-|- Moduly
|-|-|-|- Moduly obsahu
|-|-|-|- Užívateľské moduly
|-|-|-|- Moduly displeja
|-|-|-|- Obslužné moduly
|-|-|-|- Navigačné moduly
|-|-|- Šablóny
|-|-|-|- Atómový
|-|-|-|- Beez 20
|-|-|-|- Beez 5
|-|-|- Jazyky
|-|-|- Pluginy
|- Parkovisko
|-|- Blog o parku
|-|- Fotogaléria
|-|-|- Zvieratá
|-|-|- Krajina
|- Stránka obchodu s ovocím
|-|- Pestovatelia
|-|- Recepty

Zdá sa, že pre obsah nie je príliš veľa kategórií!
Môžete tiež zobraziť hierarchiu kategórií v materiáloch pomocou dotazu na tabuľku kategórií v databáze:

SELECT * FROM `#_categories` WHERE `extension` = "com_content"

Tento mesiac nás hľadači chýb nechcú rozmaznať novými vysokoprofilovými exploitmi v populárnych aplikáciách. Samozrejme, veľa odporúčaní bolo publikovaných v produktoch známych spoločností, ale len veľmi málo z nich obsahuje čitateľné PoC kódy. V našej recenzii som sa pokúsil zhromaždiť najvýznamnejšie a najkompletnejšie zraniteľnosti opísané nedávno, takže sa pohodlne usaďte a užite si čítanie.

Zraniteľnosť PHP pri spracovaní požiadaviek HTTP Head Stručný

Istý Adam Ivanyuk objavil 3. marca zaujímavú funkciu v interpretači PHP, ktorý nespracováva požiadavky HEAD celkom korektne. Výskumník nazval túto zraniteľnosť „metódou HTTP HEAD trik v skriptoch PHP“.

Mnoho programátorov navrhuje svoje PHP skripty v nádeji, že všetky inštrukcie v nich napísané sa úspešne vykonajú bez prerušenia niekde uprostred (najmä v krátkych skriptoch). Toto sa stane, ak si skript vyžiada koncový používateľ pomocou metód GET, POST, PUT.

Mali by ste však vedieť, že existujú aj iné metódy HTTP – napríklad HEAD. Práve pri spracovaní tejto metódy v PHP môže vzniknúť bezpečnostná diera.

Pozrime sa na jeden zo zdrojov tlmočníka: ./main/SAPI.c, riadok 315:

if (SG(request_info).request_method &&
!strcmp(SG(request_info).request_method, "HEAD"))
{
SG(info_požiadavky).iba_hlavičky = 1;
...

Keď prídu nejaké dáta, spustí sa funkcia php_ub_body_write. Ďalej sa pozrite na main/output.c, riadok 699:

if (SG(request_info).headers_only) (
if(SG(headers_sent))
{
návrat 0;
}
php_header(TSRMLS_C);
zend_bailout();
}

Tu môžete vidieť, že pri prvom vytlačení na obrazovku a pri použití metódy HEAD funkcia zend_bailout preruší skript.

Využiť

Teraz získajme prístup k tomuto skriptu pomocou metódy HEAD:

Ako by ste očakávali, naša kniha návštev zastaví svoju činnosť na riadku „echo $data;“, takže súbor book.txt sa jednoducho vynuluje.
Tento príklad má skôr deštruktívny charakter. V druhom príklade môžeme obísť autorizáciu v primitívnom správcovskom paneli:

V tomto skripte sa pri prihlasovaní obvyklými metódami nastavuje v relácii administratívna premenná. Potom, ak používateľ zadá nesprávne heslo, táto premenná sa vynuluje a používateľ sa nestane správcom.

Ak pristúpime k administračnému panelu cez HEAD, jeho vykonávanie sa preruší pri kúsku kódu s „echo“, takže sa administratívna premenná neresetuje a môžeme pokojne blúdiť po zatvorenej časti aplikácie. Tu treba mať na pamäti, že väčšina webových serverov má výstupnú hodnotu vyrovnávacej pamäte nastavenú na 4096 bajtov, takže v pracovnom príklade by sme mohli potrebovať reťazec „Dlhý reťazec obsahuje asi 4090 znakov“.

Využiť
  • PHP

    Tu pole $check obsahuje naše POST dáta a premenná $locked je serializovaný reťazec zahmlený pomocou funkcie str_rot13(), ktorá je úplne pod našou kontrolou.

    V tomto bode stojí za to urobiť malú odbočku pre tých, ktorí nečítali príslušné články v ][, a stručne porozprávať o chybe, ktorá sa objavuje v magických metódach PHP. Takže vo verzii PHP 5 sa objavil základný koncept OOP programovania: konštruktor a deštruktor. Konštruktor je implementovaný pomocou metódy "__construct" a deštruktor je implementovaný pomocou metódy "__destruct". Po dokončení svojej práce a pri volaní prostredníctvom funkcie unserialize() každý objekt vykoná svoju vlastnú deštrukčnú metódu __, ak je napísaná v kóde.

    Teraz sa vráťme k nášmu frameworku a pozrime sa na deštruktor triedy App zo súboru ./libs/configure.php:

    funkcia __destruct()
    {
    if ($this->__cache)
    {
    $core = App::core("torta");
    unset($this->__paths);
    Cache::write("dir_map", array_fi lter($this->__paths),
    "cake_core");
    Cache::write("fi le_map", array_fi lter($this->__map),
    "cake_core");
    Cache::write("object_map", $this->__objects,
    "cake_core");
    }
    }

    Z vyššie uvedeného kódu môžete vidieť, že táto metóda môže byť ohrozená zapísaním ľubovoľných hodnôt do objektu Cache. Najzaujímavejší kľúč na crack je 'file_map'. Spravuje spojenia medzi triedami a zodpovedajúcimi súbormi PHP a používa sa aj na načítanie ďalších tried počas vykonávania skriptu.

    Skutočný kód na načítanie tried je o niečo zložitejší, ale všetko sa scvrkáva na nasledujúci kód z metódy __load v triede App:

    Bingo! Nahradením premennej $file môžeme zahrnúť náš vlastný PHP kód! Okrem toho to bude skutočná chyba Remote File Inclusion – teda nebudeme potrebovať žiadne ďalšie triky na nahrávanie lokálnych súborov na server. Autor nájdenej zraniteľnosti však ponúka možnosť LFI na zneužitie tejto diery, pretože CakePHP používa lokálnu vyrovnávaciu pamäť založenú na súboroch, ktorá sa v serializovanej forme nachádza v adresári, ktorý útočník pozná.

    Využiť

    Ako malý PoC na generovanie jedovatého serializovaného reťazca ponúka felix nasledujúci kód:

    Samozrejme, najprv musíte zahrnúť potrebné triedy z CakePHP. K dispozícii je aj plne funkčný exploit Pythonu, ktorý nájdete na adrese malloc.im/burnedcake.py.

    Tento exploit by mal fungovať v každej aplikácii postavenej na CakePHP, ktorá používa formuláre POST s bezpečnostnými tokenmi a v ktorej sa nezmenilo štandardné umiestnenie súborov vyrovnávacej pamäte. V predvolenom nastavení exploit zobrazuje konfiguráciu databázy; ďalšie užitočné funkcie možno ľahko pridať zmenou vstavaného obsahu PHP.

    Ciele
    • CakePHP getState("filter_order_dir");
      $fi lter_order = JFilterInput::clean($fi lter_order, "cmd");
      $fi lter_order_dir =
      JFilterInput::clean($fi lter_order_dir, "slovo");
      // Potrebujeme získať zoznam všetkých
      // weblinky v danej kategórii
      $query = "SELECT *" .
      "Z #__webových odkazov" .
      "KDE catid = ". (int) $this->_id.
      "A zverejnené = 1" .
      "A archivované = 0".
      "ZORADIŤ PODĽA". $fi lter_order "".
      $fi lter_order_dir .", objednávanie";
      návrat $ dotaz;
      }

      Tu môžete vidieť, že premenné $filter_order a $filter_order_dir nie sú kontrolované na prísnu zhodu s príkazmi SQL; kontrola sa vykonáva iba pomocou štandardnej čistej metódy z triedy JFilterInput:

      Tento kód vložíme kamkoľvek na stránku, ktorá zobrazuje 5 náhodných odkazov z databázy a náhodnú kotvu. Je lepšie riediť kotvy, ako písať iba 1 do odkazu. Pri správnom prelinkovaní na vašom webe okamžite uvidíte nárast návštevnosti a zlepšenie ostatných ukazovateľov webu.

      Teším sa na vaše otázky v komentároch k tomuto príspevku.

      Dátum zverejnenia: 03.03.2014
        Recenzie a komentáre:

        Dmitrij:
        Ďakujem za scenár, implementujem ho. Nie je možné kopírovať zdrojový kód zo stránky, kopíruje sa len po malých častiach, vhodnejšie by bolo v celku.

        Kirill:
        Ďakujem za poznámku o kopírovaní, práve som to videl, pokúsim sa to čoskoro opraviť.

        Alexey Pavlov:
        Chyba v riadku $tex = explode(":",$sendlist[$count] Potrebujete bodkočiarku, nie dvojbodku. Trochu som zmenil kód, aby bol prehľadnejší: