Layer Cake in com_weblinks Joomla. Vdori in dodatki Umazane spletne povezave php


Začnimo si ogledati komponente tako, da pogledamo, kako osnovna komponenta spletnih povezav deluje v skrbniškem delu spletnega mesta. Ta komponenta, ki je značilna za ta del spletnega mesta, je zelo podobna ostalim komponentam, namenjenim upravljanju člankov, uporabnikov, modulov itd.

Programske datoteke za to komponento so navedene spodaj. Vse te datoteke se nahajajo v mapi administator/components/com_weblinks. V preostalem delu tega poglavja se vsa imena datotek komponent spletnih povezav nanašajo na to začetno mapo, razen če ni drugače navedeno. Večina datotek je organiziranih po vzorcu MVC. Natančneje, vse datoteke pogleda so v podmapi pogledov, vse glavne datoteke modela in krmilnika pa v podmapi modelov oziroma krmilnikov. Dopolnjujejo jih tudi namestitvene, konfiguracijske in pomožne datoteke.

Datoteke administrativnega dela komponente Weblinks, razen datotek index.html

  • controllers/weblink.php - Glavni krmilnik za urejanje En sam krmilnik spletne povezave
  • controllers/weblinks.php - glavni krmilnik za sestavljanje krmilnika in prikaz seznama spletnih povezav na zaslonu upravitelja spletnih povezav
  • helpers/weblinks.php - Ponuja različne metode, ki se uporabljajo v krmilnikih in pogledih
  • models/fields/ordering.php - model JformField, ki prikazuje stolpec za naročanje spletnih povezav na zaslonu upravitelja spletnih povezav
  • modeli/forms/weblink.xml - datoteka XML, ki se uporablja v razredu Jform-Model Field za postavitev obrazca z vnosnimi polji in urejanje spletnih povezav na zaslonu
  • models/weblink.php - Model za model spletne povezave z enim zaslonom
  • models/weblinks.php - Model za zaslonski obrazec upravitelja Model spletnih povezav
  • sql/install.mysql.utf8.sql - datoteka SQL za ustvarjanje tabele spletnih povezav med namestitvijo
  • sql/uninstall.mysql.ut8.sql - datoteka SQL za odstranitev tabele spletnih povezav med namestitvijo
  • tables/weblink.php - Zagotavlja razred modela
  • views/weblink/tmpl/edit_metadata.php - datoteka izvorne postavitve za urejanje metapodatkov spletnih povezav

Administrativni del komponente Weblinks

  • views/weblink/tmpl/edit_params.php - datoteka izvorne postavitve za urejanje izbirnih možnosti posamezne spletne povezave
  • views/weblink/tmpl/edit.php - datoteka izvorne postavitve za urejanje spletne povezave
  • views/view.html.php - Glavni razred pogleda za prikaz posamezne spletne povezave v formatu HTML Izvorna datoteka postavitve za upravitelja spletnih povezav
  • views/weblinks/view.html.php - Glavni razred pogleda za prikaz spletnih povezav v formatu HTML neposredno na zaslonu upravitelja spletnih povezav
  • access.xml - datoteka XML, ki ponuja seznam dejanj za sistem seznama za nadzor dostopa (ACL).
  • config.xml - datoteka XML s seznamom možnosti za izbiro konfiguracije komponente
  • controller.php - Glavni razred krmilnika
  • weblinks.php - Vstopna točka za zahtevo
  • weblinks.xml - datoteka XML, ki se uporablja za nadzor postopka namestitve

Večplastna torta

Govorili bomo o komponenti com_weblinks in oznaki html strani Joomla. O tem, kako enostavno in preprosto ustvariti imenik povezav na spletni strani Joomla.

Ta CMS je bil ustvarjen za interaktivno delo z registriranim uporabnikom, brez neposrednega kodiranja. Čeprav trend razvoja Joomle vodi v opustitev komponente com_weblinks kot popolnoma neuporabne na spletnem mestu in preprosto dodajanje dodatne teže (več kot 100 kb - 90 datotek) že tako "težkemu" sistemu. Toda za zdaj je ta komponenta še vedno prisotna v distribuciji in jo uporabljajo nekateri programerji.

Stran spletnega mesta Joomla, ki je vidna na zaslonu, je plastna pogača, pri gradnji katere je hkrati vključenih veliko blokov (in s tem veliko predlog). Tu pride do izraza filozofija Joomla – izgradnja spletnih mest z velikimi bloki. Vsak blok mora imeti lastno označevalno predlogo HTML (postavitev).

Glavni bloki:

Predloga glavne strani (site_template/index.php), ki s svojo oznako html določa položaje za module in komponente ter prikazuje te module in komponente.
- predloga strani
- predloge modulov
- predloge komponent

Vsak od teh velikih blokov je na voljo za urejanje (spremembe). To pomeni, da lahko ločeno uredite na primer predlogo katerega koli modula ali komponente in na strani bo videti kot nova. Enako velja za predlogo strani.

Programerju začetniku je lahko težko razumeti, da je prva vrstica v vsebinskem delu strani prikazana kot naslov strani in je urejena na strani za urejanje elementa menija, ki kaže na to stran. Da je druga vrstica izpeljana iz predloge komponente com_content ali com_weblinks. In nizi v predlogah so običajno nizovne spremenljivke, njihova inicializacija in lokalizacija pa se izvajata v jezikovnih datotekah, kot je language\ru-RU\ru-RU.mod_weblinks.ini in podobno.

Včasih je začetnik zmeden, katera predloga je ustvarila to ali ono vrstico, ki je na strani na zaslonu videti kot logično nadaljevanje iste pripovedi. Izkazalo se je, da je ena vrstica v eni predlogi, druga v drugi predlogi in tretja v tretji. In spodnja tabela z zavihki je izhod iz predloge modula mod_tabform.

Včasih se predloge modulov imenujejo postavitve. Ampak to je vprašanje terminologije. Bistvo je isto - to je "oblačilo" za vsebino. Pravilneje bi bilo reči markiranje. Torej se oznaka ene strani zaslona nahaja v različnih datotekah imenika Joomla.

meni

Mnogi novi programerji Joomla pogosto ne razumejo, da so menijski elementi lahko različnih vrst. Z drugimi besedami, elementi menija se lahko nanašajo na objekte Joomla različnih vrst. To so lahko različni objekti, kot so: komponente (glasovanje, iskanje, imenik povezav itd.).

Izbira vrste elementa menija:

Stiki (com_contact)
Seznam kontaktnih kategorij (kategorij)
Seznam stikov določene kategorije (kategorija)
Kontakt
Priljubljeni stiki (predstavljeni)

Materiali (com_content)
Arhivsko gradivo (arhiv)
Material (članek)
Seznam vseh kategorij (kategorij)
Kategorija bloga
Seznam kategorij materialov (kategorija)
Predstavljeni materiali
Ustvari material

Pametno iskanje (com_search)
Iskanje

Pozdravljen, svet! (com_helloworld)
Sporočilo (helloworld)

Viri novic (com_newsfeeds)
Seznam vseh kategorij virov novic (kategorij)
Seznam virov novic v kategoriji (kategorija)
Newsfeed

Iskanje (com_search)
Iskalni obrazec in seznam rezultatov iskanja (iskanje)

Upravitelj uporabnikov (com_users)
Obrazec za avtorizacijo (prijava)
Uporabniški profil (profil)
Spremenite uporabniški profil
Obrazec za registracijo
Obnovitev uporabniškega imena (opomnik)
Spreminjanje gesla (ponastavitev)

Ovoj (com_wrapper)
Ovoj

Kot lahko vidite, so vse vrste menijev komponente. Vrsta menijske postavke s svojim imenom dejansko označuje ime predloge njene vrste komponente. In predloge komponent se nahajajo v imenikih pogledov:

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

Kot lahko vidite, so imena vrst povezav v meniju in imena predlog v imenikih vews enaka.

Razvijalec ima možnost ustvarjanja novih nestandardnih predlog (postavitev) za komponente. Te nove postavitve se bodo odražale tudi kot nove vrste menijev v oknu za izbiro vrste menija. To je posebna tema.

Demo vsebina distribucije Joomla

Poglejmo, kako je zgrajena hierarhija postavk menija »O Joomli« za prikaz komponente com_weblinks na privzeti predstavitveni vsebini (Beez2 – privzeto) predlogi Joomla.

Pojdimo na skrbniško ploščo, da uredimo komponento com_weblinks: Komponente->Povezave. Vidimo, da je bilo v predstavitveni vsebini, ki je priložena distribuciji, ustvarjenih pet kategorij za komponento com_weblinks. To pomeni, da bodo povezave razdeljene v pet kategorij. Vse ustvarjene kategorije bodo shranjene v tabeli baze podatkov #_categories. V isti tabeli so shranjene tudi kategorije za druge komponente.

Primeri podatkovnih spletnih povezav
|-Povezave do parka
|-Joomla! Posebne povezave
|-|-Drugi viri
Nekategorizirano

V meniju About Joomla (v urejevalniku menijev) je bila ustrezno ustvarjena hierarhija elementov menija:

Hierarhija elementov menija:

Uporaba Joomla! (tip: material)
|-Uporaba razširitev (tip: seznam vseh kategorij) :: seznam kategorij v materialih
|-|-Komponente (tip: blog kategorije) :: kategorija v materialih
|-|-|-Komponenta spletnih povezav (tip: material)
|-|-|-|-Oddajte spletno povezavo (vnesite: ustvari povezavo) :: v komponenti Povezave
|-|-|-|-Enotna kategorija spletnih povezav (tip: seznam povezav v kategoriji) :: v komponenti Povezave
|-|-|-|-Kategorije spletnih povezav (tip: seznam kategorij povezav) :: v komponenti Povezave

Vidimo, da imajo nekateri elementi menija vrste: seznam kategorij, seznam povezav v kategoriji in ustvari povezavo.
"Seznam kategorij povezav" določa najvišjo kategorijo, iz katere bo prikazana hierarhija.
"Seznam povezav v kategoriji" določa kategorijo, katere povezave bodo prikazane.
V točki »Ustvari povezavo« se prikaže obrazec, ki ga mora registrirani uporabnik izpolniti.
Mimogrede, tako izgleda povezava do tega obrazca v urejevalniku (njen videz se bo spremenil v naslovni vrstici):

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

Nekateri elementi menija so lahko prikazani samo registriranim uporabnikom! Na primer, element menija z vrsto "Ustvari povezavo" bo viden samo registriranim uporabnikom. Ta funkcija je bila ustvarjena posebej, da lahko registrirani uporabniki ustvarijo povezave, ki bodo objavljene na strani.

Tako komponenta com_weblinks zagotavlja dober način za interaktivno zapolnitev strani z zanimivimi povezavami. Poleg tega imajo vse povezave, ki bodo postavljene na takšno stran, preusmeritev, to pomeni, da ne bodo indeksirane kot zunanje. Morda ste videli takšne povezave na forumih. Ko se z miško pomaknete nad tako povezavo, boste videli naslov vaše strani in šele po kliku nanjo boste preusmerjeni na naslov, ki ste ga navedli.

Možnost, da uporabnik dodaja povezave do zunanjih strani, je glavna prednost in pomen komponente com_weblinks, prav tako možnost, da uporabnik dodaja nove vsebine – članke, slike, video datoteke itd.

Omogočanje registriranemu uporabniku s pravicami, da napolni stran z vsebino brez neposrednega kodiranja, je osnovna filozofija CMS Joomla.

Nekategorizirano
Vzorci podatkovnih člankov
|- Joomla!
|-|- Razširitve
|-|-|- Komponente
|-|-|- Moduli
|-|-|-|- Vsebinski moduli
|-|-|-|- Uporabniški moduli
|-|-|-|- Prikazni moduli
|-|-|-|- pomožni moduli
|-|-|-|- Navigacijski moduli
|-|-|- Predloge
|-|-|-|- Atomsko
|-|-|-|- Beez 20
|-|-|-|- Beez 5
|-|-|- Jeziki
|-|-|- Vtičniki
|- Park Site
|-|- Blog o parku
|-|- Galerija fotografij
|-|-|- Živali
|-|-|- Pokrajina
|- Spletno mesto trgovine s sadjem
|-|- Pridelovalci
|-|- Recepti

Zdi se, da ni preveč kategorij za vsebino!
Hierarhijo kategorij v materialih si lahko ogledate tudi s poizvedbo v tabeli kategorij v bazi podatkov:

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

Ta mesec nas iskalci hroščev ne želijo razvajati z novimi odmevnimi podvigi v priljubljenih aplikacijah. Seveda je bilo veliko nasvetov objavljenih v izdelkih znanih podjetij, a zelo malo jih vsebuje berljive PoC kode. V našem pregledu sem poskušal zbrati najpomembnejše in popolne ranljivosti, ki so bile nedavno opisane, zato se udobno namestite in uživajte v branju.

Ranljivost PHP pri obdelavi zahtev HTTP Head Na kratko

3. marca je neki Adam Ivanyuk odkril zanimivo funkcijo v tolmaču PHP, ki ne obdeluje zahtev HEAD povsem pravilno. Raziskovalec je to ranljivost poimenoval "trik metode HTTP HEAD v skriptih php."

Mnogi koderji oblikujejo svoje skripte PHP v upanju, da se bodo vsa navodila, zapisana v njih, uspešno izvedla, ne da bi se zlomila nekje na sredini (zlasti pri kratkih skriptih). To se zgodi, če skript zahteva končni uporabnik z metodami GET, POST, PUT.

Vedeti pa morate, da obstajajo tudi druge metode HTTP - na primer HEAD. Ravno pri obdelavi te metode v PHP lahko nastane varnostna luknja.

Poglejmo enega od virov tolmača: ./main/SAPI.c, vrstica 315:

if (SG(request_info).request_method &&
!strcmp(SG(request_info).request_method, "HEAD"))
{
SG(request_info).headers_only = 1;
...

Ko prispe kakršen koli podatek, se izvede funkcija php_ub_body_write. Nato poglejte main/output.c, vrstica 699:

if (SG(request_info).headers_only) (
if(SG(headers_sent))
{
vrni 0;
}
php_header(TSRMLS_C);
zend_bailout();
}

Tukaj lahko vidite, da funkcija zend_bailout ob prvem izpisu na zaslon in pri uporabi metode HEAD prekine skript.

Izkoriščanje

Zdaj pa dostopimo do tega skripta z metodo HEAD:

Kot bi pričakovali, bo naša knjiga gostov ustavila svoje izvajanje v vrstici »echo $data;«, zato bo datoteka book.txt preprosto ponastavljena na nič.
Ta primer je precej destruktivne narave. V drugem primeru lahko zaobidemo avtorizacijo v primitivni skrbniški plošči:

V tem skriptu se pri prijavi z običajnimi metodami v seji nastavi skrbniška spremenljivka. Če uporabnik nato vnese napačno geslo, se ta spremenljivka ponastavi in ​​uporabnik ne postane skrbnik.

Če do skrbniške plošče dostopamo preko HEAD-a, bo njeno izvajanje prekinjeno na delu kode z “echo”, zato se administrativna spremenljivka ne bo ponastavila in lahko varno tavamo po zaprtem delu aplikacije. Tukaj morate upoštevati, da ima večina spletnih strežnikov vrednost izhodnega medpomnilnika nastavljeno na 4096 bajtov, zato bomo v delujočem primeru morda potrebovali niz "Dolg niz vsebuje približno 4090 znakov".

Izkoriščanje
  • PHP

    Tukaj niz $check vsebuje naše podatke POST, spremenljivka $locked pa je serializiran niz, zakrit s funkcijo str_rot13(), ki je popolnoma pod našim nadzorom.

    Na tej točki je vredno narediti majhno digresijo za tiste, ki niso prebrali ustreznih člankov v ][, in na kratko spregovoriti o napaki, ki se pojavlja v čarobnih metodah PHP. Tako se je v PHP različici 5 pojavil osnovni koncept OOP programiranja: konstruktor in destruktor. Konstruktor je implementiran z metodo "__construct", destruktor pa z metodo "__destruct". Po končanem delu in ob klicu prek funkcije unserialize() vsak objekt izvede lastno metodo __ destruct, če je zapisana v kodi.

    Zdaj pa se vrnimo k našemu ogrodju in si oglejmo destruktor razreda aplikacij iz datoteke ./libs/configure.php:

    funkcija __destruct()
    {
    če ($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");
    }
    }

    Iz zgornje kode lahko vidite, da je to metodo mogoče ogroziti z zapisovanjem poljubnih vrednosti v objekt Cache. Najbolj zanimiv ključ za vlom je 'file_map'. Upravlja povezave med razredi in ustreznimi datotekami PHP, uporablja pa se tudi za nalaganje dodatnih razredov med izvajanjem skripta.

    Dejanska koda za nalaganje razredov je nekoliko bolj zapletena, vendar se vse skrči na naslednjo kodo iz metode __load znotraj razreda App:

    Bingo! Z zamenjavo spremenljivke $file lahko vključimo lastno kodo PHP! Poleg tega bo to prava napaka Remote File Inclusion - tako ne bomo potrebovali dodatnih trikov za nalaganje lokalnih datotek na strežnik. Vendar pa avtor najdene ranljivosti ponuja možnost LFI za izkoriščanje te luknje, ker CakePHP uporablja lokalni predpomnilnik, ki temelji na datotekah, ki se nahaja v serializirani obliki v imeniku, ki ga napadalec pozna.

    Izkoriščanje

    Kot majhen PoC za generiranje strupenega serializiranega niza felix ponuja naslednjo kodo:

    Seveda morate najprej vključiti potrebne razrede iz CakePHP. Obstaja tudi popolnoma funkcionalen izkoriščanje Python, ki ga najdete na malloc.im/burnedcake.py.

    To izkoriščanje bi moralo delovati v vsaki aplikaciji, zgrajeni na CakePHP, ki uporablja obrazce POST z varnostnimi žetoni in v kateri standardna lokacija predpomnilniških datotek ni bila spremenjena. Izkoriščanje privzeto prikaže konfiguracijo baze podatkov; druge uporabne funkcije je mogoče enostavno dodati s spreminjanjem vgrajenega koristnega tovora PHP.

    Tarče
    • CakePHP getState("filter_order_dir");
      $fi lter_order = JFilterInput::clean($fi lter_order, "cmd");
      $fi lter_order_dir =
      JFilterInput::clean($fi lter_order_dir, "beseda");
      // Dobiti moramo seznam vseh
      // spletne povezave v dani kategoriji
      $query = "SELECT *" .
      "IZ #__spletnih povezav" .
      "WHERE catid = ". (int) $this->_id.
      "IN objavljeno = 1" .
      "IN arhivirano = 0".
      "NAROČI PO". $fi lter_order "".
      $fi lter_order_dir .", naročanje";
      vrni $poizvedbo;
      }

      Tukaj lahko vidite, da spremenljivki $filter_order in $filter_order_dir nista preverjeni glede stroge skladnosti s stavki SQL; preverjanje se izvede le z uporabo standardne čiste metode iz razreda JFilterInput:

      To kodo prilepimo kamor koli na spletno mesto, ki prikaže 5 naključnih povezav iz baze podatkov in naključno sidro. Bolje je razredčiti sidra, kot pa napisati samo 1 na povezavo. S pravilnim povezovanjem na vaši spletni strani boste takoj opazili povečanje obiska in izboljšanje drugih indikatorjev spletne strani.

      Veselim se vaših vprašanj v komentarjih na to objavo.

      Datum objave: 03. marec 2014
        Ocene in komentarji:

        Dmitrij :
        Hvala za scenarij, bom izvedel. Izvorne kode s spletnega mesta ni mogoče kopirati, kopira se le v majhnih fragmentih, bolj priročno bi bilo v celoti.

        Kiril:
        Hvala za opombo o kopiranju, šele zdaj sem videl, bom poskušal kmalu popraviti.

        Aleksej Pavlov:
        Napaka v vrstici $tex = explode(":",$sendlist[$count] Potrebujete podpičje, ne dvopičja. Nekoliko sem spremenil kodo, da je bolj jasna: