Layer Cake i com_weblinks Joomla. Hakovi i dodaci Prljave web veze php


Počnimo promatrati komponente tako što ćemo pogledati kako osnovna komponenta Weblinks radi u administratorskom dijelu web stranice. Ova komponenta, tipična za ovaj dio web stranice, vrlo je slična svojim ostalim komponentama namijenjenim upravljanju člancima, korisnicima, modulima itd.

Programske datoteke za ovu komponentu navedene su u nastavku. Sve ove datoteke nalaze se u mapi administator/components/com_weblinks. U ostatku ovog poglavlja, svi nazivi datoteka komponenti Weblinks se odnose na ovu početnu mapu osim ako nije drugačije navedeno. Većina datoteka organizirana je prema MVC uzorku. Konkretno, sve datoteke pogleda nalaze se u podmapi pogleda, a sve glavne datoteke modela i kontrolera nalaze se u podmapama modela i kontrolera. Također su dopunjene instalacijskim, konfiguracijskim i pomoćnim datotekama.

Datoteke administrativnog dijela komponente Weblinks, osim datoteka index.html

  • controllers/weblink.php - Glavni kontroler za uređivanje Jednostruki kontroler weblinka
  • controllers/weblinks.php - Glavni kontroler za kompajliranje Controllera i prikaz popisa web poveznica na zaslonu Weblinks Managera
  • helpers/weblinks.php - Pruža različite metode koje se koriste u kontrolerima i prikazima
  • modeli/polja/ordering.php - JformField model koji prikazuje stupac redoslijeda web veza na zaslonu Upravitelja web veza
  • modeli/forms/weblink.xml - XML ​​datoteka koja se koristi u klasi Jform-Model Field za raspored obrasca s poljima za unos i uređivanje web poveznica na ekranu
  • models/weblink.php - Model za model poveznice s jednim zaslonom
  • models/weblinks.php - Model za zaslonski obrazac upravitelja Model web poveznica
  • sql/install.mysql.utf8.sql - SQL datoteka za stvaranje tablice web veza tijekom instalacije
  • sql/uninstall.mysql.ut8.sql - SQL datoteka za uklanjanje tablice web veza tijekom instalacije
  • tables/weblink.php - Pruža klasu Model
  • views/weblink/tmpl/edit_metadata.php - Izvorna datoteka izgleda za uređivanje metapodataka web veze

Administrativni dio komponente Weblinks

  • views/weblink/tmpl/edit_params.php - Datoteka izgleda izvora za uređivanje opcija odabira pojedinačne web veze
  • views/weblink/tmpl/edit.php - Izvorna datoteka izgleda za uređivanje web veze
  • views/view.html.php - Glavna klasa prikaza za prikaz jedne web veze u HTML formatu Datoteka izvornog rasporeda za upravitelja web vezama
  • views/weblinks/view.html.php - Glavna klasa prikaza za prikaz web poveznica u HTML formatu izravno na zaslonu Upravitelja web veza
  • access.xml - XML ​​datoteka koja pruža popis radnji za sustav kontrole pristupa (ACL).
  • config.xml - XML ​​datoteka koja pruža popis opcija za odabir konfiguracije komponente
  • controller.php - Glavna klasa kontrolera
  • weblinks.php - Ulazna točka za zahtjev
  • weblinks.xml - XML ​​datoteka koja se koristi za kontrolu procesa instalacije

Slojeviti kolač

Govorit ćemo o komponenti com_weblinks i html označavanju Joomla stranice. O tome kako lako i jednostavno stvoriti direktorij poveznica na Joomla web stranici.

Ovaj CMS je kreiran za interaktivni rad s registriranim korisnikom, bez izravnog kodiranja. Iako razvojni trend Joomle dovodi do napuštanja komponente com_weblinks kao potpuno beskorisne na web stranici, i jednostavnog dodavanja dodatne težine (više od 100 kb - 90 datoteka) ionako "teškom" sustavu. Ali za sada je ova komponenta još uvijek prisutna u distribuciji i koriste je neki programeri.

Stranica Joomla web stranice vidljiva na ekranu je slojevita torta u čiju su konstrukciju istovremeno uključeni mnogi blokovi (a time i mnogi predlošci). Ovdje na scenu stupa Joomla filozofija - izgradnja web stranice velikih blokova. Svaki blok mora imati vlastiti predložak HTML oznake (izgled).

Glavni blokovi:

Predložak glavne stranice (site_template/index.php), koji svojim html označavanjem definira položaje za module i komponente i prikazuje te module i komponente.
- predložak stranice
- predlošci modula
- predlošci komponenti

Svaki od ovih velikih blokova dostupan je za uređivanje (promjene). To jest, možete zasebno uređivati, na primjer, predložak bilo kojeg modula ili komponente, i on će izgledati novo na stranici. Isto vrijedi i za predložak stranice.

Programeru početniku može biti teško razumjeti da je prvi redak u sadržajnom dijelu stranice prikazan kao naslov stranice i da se uređuje na stranici za uređivanje stavke izbornika koja upućuje na ovu stranicu. Da je drugi redak izveden iz predloška komponente com_content ili com_weblinks. I stringovi u predlošcima su obično string varijable i njihova inicijalizacija i lokalizacija se provodi u jezičnim datotekama, kao što su language\ru-RU\ru-RU.mod_weblinks.ini i slično.

Ponekad je početnik zbunjen koji je predložak proizveo ovaj ili onaj redak, koji na stranici na ekranu izgleda kao logičan nastavak iste priče. Ispada da je jedan red u jednom predlošku, drugi u drugom predlošku, a treći u trećem. Tablica s karticama ispod je izlaz iz predloška modula mod_tabform.

Ponekad se predlošci modula nazivaju izgledi. Ali ovo je pitanje terminologije. Suština je ista - to je "odjeća" za sadržaj. Ispravnije bi bilo reći označavanje. Dakle, oznaka jedne stranice zaslona nalazi se u različitim datotekama Joomla direktorija.

Jelovnik

Mnogi novi Joomla programeri često ne razumiju da stavke izbornika mogu imati različite vrste. Drugim riječima, stavke izbornika mogu se odnositi na Joomla objekte različitih vrsta. To mogu biti različiti objekti, kao što su: komponente (glasovanje, pretraživanje, imenik poveznica itd.).

Odabir vrste stavke izbornika:

Kontakti (com_contact)
Popis kategorija kontakata (kategorije)
Popis kontakata određene kategorije (kategorija)
Kontakt
Omiljeni kontakti (istaknuti)

Materijali (com_content)
Arhivski materijali (arhiva)
Materijal (članak)
Popis svih kategorija (kategorija)
Kategorija bloga
Popis kategorija materijala (kategorija)
Istaknuti materijali
Stvorite materijal

Pametno pretraživanje (com_search)
traži

Pozdrav svijete! (com_helloworld)
Poruka (helloworld)

Feed vijesti (com_newsfeeds)
Popis svih kategorija feedova vijesti (kategorija)
Popis feedova vijesti u kategoriji (kategorija)
Newsfeed

Pretraživanje (com_search)
Obrazac za pretraživanje i popis rezultata pretraživanja (pretraživanje)

Upravitelj korisnika (com_users)
Obrazac za autorizaciju (prijava)
Korisnički profil (profil)
Promjena korisničkog profila
Upisnica
Oporavak korisničkog imena (podsjetnik)
Promjena lozinke (poništavanje)

Omotač (com_wrapper)
Omot

Kao što vidite, ovdje su sve vrste izbornika komponente. Svojim imenom tip stavke izbornika zapravo označava naziv predloška tipa svoje komponente. Predlošci komponenti nalaze se u direktorijima pogleda:

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

Kao što vidite, nazivi tipova veza u izborniku i nazivi predložaka u direktorijima vews su isti.

Programer ima mogućnost stvaranja novih nestandardnih predložaka (izgleda) za komponente. Ovi novi izgledi također će se odraziti kao nove vrste izbornika u prozoru za odabir vrste izbornika. Ovo je posebna tema.

Demo sadržaj Joomla distribucije

Pogledajmo kako je izgrađena hijerarhija stavki izbornika "O Joomli" za prikaz komponente com_weblinks na zadanom demo sadržaju (Beez2 - Zadano) Joomla predlošku.

Idemo na administrativnu ploču za uređivanje komponente com_weblinks: Komponente->Veze. Vidimo da je u demo sadržaju koji dolazi s distribucijom stvoreno pet kategorija za komponentu com_weblinks. To znači da će poveznice biti raspoređene u pet kategorija. Sve stvorene kategorije bit će spremljene u tablici baze podataka #_categories. Kategorije za ostale komponente također su pohranjene u istoj tablici.

Uzorak podataka-Weblinkovi
|-Veze za park
|-Joomla! Specifične veze
|-|-Ostali izvori
Nekategorizirano

U izborniku About Joomla (u uređivaču izbornika), hijerarhija stavki izbornika stvorena je u skladu s tim:

Hijerarhija stavki izbornika:

Korištenje Joomla! (vrsta: materijal)
|-Korištenje proširenja (tip: popis svih kategorija) :: popis kategorija u materijalima
|-|-Komponente (tip: blog kategorije) :: kategorija u materijalima
|-|-|-Komponenta web poveznica (tip: materijal)
|-|-|-|-Pošaljite web vezu (upišite: kreirajte vezu) :: u komponenti Veze
|-|-|-|-Weblinks Pojedinačna kategorija (tip: popis poveznica u kategoriji) :: u komponenti Linkovi
|-|-|-|-Kategorije web veza (tip: popis kategorija veza) :: u komponenti Veze

Vidimo da neke stavke izbornika imaju tipove: popis kategorija, popis poveznica u kategoriji i stvaranje veze.
"Popis kategorija veza" navodi gornju kategoriju iz koje će se prikazati hijerarhija.
"Popis poveznica u kategoriji" određuje kategoriju čije će veze biti prikazane.
U stavci “Kreiraj poveznicu” prikazat će se obrazac koji će registrirani korisnik morati ispuniti.
Usput, ovako izgleda poveznica na ovaj obrazac u uređivaču (izgled će se promijeniti u adresnoj traci):

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

Neke stavke jelovnika mogu se prikazati samo registriranim korisnicima! Na primjer, stavka izbornika tipa "Stvori vezu" bit će vidljiva samo registriranim korisnicima. Ova je značajka stvorena posebno kako bi registrirani korisnici mogli stvarati poveznice koje će biti objavljene na stranici.

Stoga komponenta com_weblinks pruža dobar način za interaktivno popunjavanje stranice zanimljivim vezama. Štoviše, svi linkovi koji će biti postavljeni na takvu stranicu imaju preusmjeravanje, odnosno neće biti indeksirani kao vanjski. Možda ste vidjeli takve poveznice na forumima. Kada prijeđete mišem preko takvog linka, vidjet ćete adresu svoje stranice, a tek nakon klika na nju bit ćete preusmjereni na adresu koju ste naveli.

Mogućnost da korisnik doda poveznice na vanjske stranice glavna je prednost i smisao komponente com_weblinks, kao i mogućnost da korisnik doda novi sadržaj - članke, slike, video datoteke itd.

Omogućiti registriranom korisniku s pravima da popuni stranicu sadržajem bez izravnog kodiranja osnovna je filozofija CMS Joomla.

Nekategorizirano
Ogledni podaci-članci
|- Joomla!
|-|- Proširenja
|-|-|- Komponente
|-|-|- Moduli
|-|-|-|- Sadržajni moduli
|-|-|-|- Korisnički moduli
|-|-|-|- Moduli zaslona
|-|-|-|- Pomoćni moduli
|-|-|-|- Navigacijski moduli
|-|-|- Predlošci
|-|-|-|- Atomski
|-|-|-|- Beez 20
|-|-|-|- Beez 5
|-|-|- Jezici
|-|-|- Dodaci
|- Mjesto parka
|-|- Blog parka
|-|- Galerija fotografija
|-|-|- Životinje
|-|-|- Krajolik
|- Stranica voćarne
|-|- Uzgajivači
|-|- Recepti

Čini se da nema previše kategorija za sadržaj!
Također možete vidjeti hijerarhiju kategorija u materijalima pomoću upita prema tablici kategorija u bazi podataka:

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

Ovaj mjesec, kopači bugova ne žele nas razmaziti novim eksploatacijama visokog profila u popularnim aplikacijama. Naravno, puno je savjeta objavljeno u proizvodima poznatih tvrtki, ali vrlo malo njih sadrži čitljive PoC kodove. U našoj recenziji pokušao sam prikupiti najznačajnije i najpotpunije ranjivosti opisane nedavno, stoga se udobno smjestite i uživajte u čitanju.

PHP ranjivost prilikom obrade HTTP Head zahtjeva Ukratko

Dana 3. ožujka izvjesni Adam Ivanyuk otkrio je zanimljivu značajku u PHP interpreteru, koja ne obrađuje HEAD zahtjeve sasvim ispravno. Istraživač je ovu ranjivost nazvao "trikom HTTP HEAD metode u php skriptama."

Mnogi koderi dizajniraju svoje PHP skripte nadajući se da će se sve upute napisane u njima uspješno izvršiti bez prekida negdje u sredini (posebno u kratkim skriptama). Ovo se događa ako skriptu zatraži krajnji korisnik pomoću metoda GET, POST, PUT.

Ali trebali biste znati da postoje i druge HTTP metode - na primjer, HEAD. Upravo kod obrade ove metode u PHP-u može nastati sigurnosna rupa.

Pogledajmo jedan od izvora tumača: ./main/SAPI.c, linija 315:

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

Kada bilo koji podatak stigne, izvršava se funkcija php_ub_body_write. Zatim pogledajte main/output.c, redak 699:

if (SG(request_info).headers_only) (
if(SG(headers_sent))
{
povratak 0;
}
php_zaglavlje(TSRMLS_C);
zend_bailout();
}

Ovdje možete vidjeti da prvi put kada se ispisuje na ekran i kada se koristi HEAD metoda, funkcija zend_bailout prekida skriptu.

Iskorištavati

Sada pristupimo ovoj skripti pomoću metode HEAD:

Kao što biste i očekivali, naša će knjiga gostiju zaustaviti svoje izvršenje u retku “echo $data;”, tako da će se datoteka book.txt jednostavno vratiti na nulu.
Ovaj primjer je prilično destruktivne prirode. U drugom primjeru možemo zaobići autorizaciju u primitivnoj administrativnoj ploči:

U ovoj skripti, kada se prijavljujete uobičajenim metodama, u sesiji se postavlja administrativna varijabla. Zatim, ako korisnik unese netočnu lozinku, ova se varijabla resetira i korisnik ne postaje administrator.

Ako pristupimo admin panelu preko HEAD-a, njegovo izvršavanje će biti prekinuto na dijelu koda sa “echo”, pa se administrativna varijabla neće resetirati, a mi možemo mirno lutati po zatvorenom dijelu aplikacije. Ovdje treba imati na umu da većina web poslužitelja ima izlaznu vrijednost međuspremnika postavljenu na 4096 bajtova, pa bi nam u radnom primjeru mogao trebati niz "Dugi niz sadrži oko 4090 znakova".

Iskorištavati
  • PHP

    Ovdje polje $check sadrži naše POST podatke, a varijabla $locked je serijalizirani niz zamagljen pomoću funkcije str_rot13(), koja je u potpunosti pod našom kontrolom.

    Na ovom mjestu vrijedi napraviti malu digresiju za one koji nisu pročitali odgovarajuće članke u ][, i ukratko govoriti o grešci koja se pojavljuje u čarobnim metodama PHP-a. Tako se u PHP verziji 5 pojavio osnovni koncept OOP programiranja: konstruktor i destruktor. Konstruktor se implementira pomoću metode "__construct", a destruktor se implementira pomoću metode "__destruct". Po završetku svog rada i kada se pozove kroz funkciju unserialize(), svaki objekt izvršava vlastitu metodu __ destruct, ako je napisana u kodu.

    Sada se vratimo našem okviru i pogledajmo destruktor klase aplikacije iz datoteke ./libs/configure.php:

    funkcija __destruct()
    {
    ako ($this->__cache)
    {
    $core = App::core("kolač");
    poništi($ovo->__staze);
    Cache::write("dir_map", array_fi lter($this->__paths),
    "jezgra_torte");
    Cache::write("fi le_map", array_fi lter($this->__map),
    "jezgra_torte");
    Cache::write("object_map", $this->__objects,
    "jezgra_torte");
    }
    }

    Iz gornjeg koda možete vidjeti da se ova metoda može kompromitirati pisanjem proizvoljnih vrijednosti u Cache objekt. Najzanimljiviji ključ za crack je 'file_map'. Upravlja vezama između klasa i odgovarajućih PHP datoteka, a također se koristi za učitavanje dodatnih klasa tijekom izvođenja skripte.

    Stvarni kod za učitavanje klasa je malo složeniji, ali sve se svodi na sljedeći kod iz metode __load unutar App klase:

    Bingo! Zamjenom varijable $file možemo uključiti vlastiti PHP kod! Štoviše, ovo će biti pravi bug Remote File Inclusion - stoga nam neće trebati nikakvi dodatni trikovi za učitavanje lokalnih datoteka na poslužitelj. Međutim, autor pronađene ranjivosti nudi LFI opciju za iskorištavanje ove rupe, jer CakePHP koristi lokalnu predmemoriju temeljenu na datotekama, koja se nalazi u serijaliziranom obliku u direktoriju koji je poznat napadaču.

    Iskorištavati

    Kao mali PoC za generiranje otrovnog serijaliziranog niza, felix nudi sljedeći kod:

    Naravno, prvo morate uključiti potrebne klase iz CakePHP. Tu je i potpuno funkcionalan Python exploit, koji možete pronaći na malloc.im/burnedcake.py.

    Ova eksploatacija trebala bi raditi u svakoj aplikaciji izgrađenoj na CakePHP-u, koja koristi POST obrasce sa sigurnosnim tokenima i u kojoj standardna lokacija datoteka predmemorije nije promijenjena. Prema zadanim postavkama eksploatacija prikazuje konfiguraciju baze podataka; druge korisne značajke mogu se jednostavno dodati promjenom ugrađenog PHP korisnog opterećenja.

    Mete
    • CakePHP getState("filter_order_dir");
      $fi lter_order = JFilterInput::clean($fi lter_order, "cmd");
      $fi lter_order_dir =
      JFilterInput::clean($fi lter_order_dir, "riječ");
      // Moramo dobiti popis svih
      // web veze u danoj kategoriji
      $query = "SELECT *" .
      "IZ #__weblinks" .
      "WHERE catid = ". (int) $this->_id.
      "I objavljeno = 1" .
      "I arhivirano = 0".
      "NARUČI PO". $fi lter_order "".
      $fi lter_order_dir .", naručivanje";
      vrati $upit;
      }

      Ovdje možete vidjeti da se varijable $filter_order i $filter_order_dir ne provjeravaju za strogu usklađenost sa SQL izjavama; provjera se vrši samo korištenjem standardne čiste metode iz klase JFilterInput:

      Ovaj kod zalijepimo bilo gdje na web mjesto, što prikazuje 5 nasumičnih veza iz baze podataka i nasumično sidro. Bolje je razrijediti sidra nego napisati samo 1 na vezu. S pravilnim povezivanjem na vašoj web stranici, odmah ćete vidjeti povećanje prometa i poboljšanje ostalih pokazatelja web stranice.

      Veselim se vašim pitanjima u komentarima na ovaj post.

      Datum objave: 03.03.2014
        Recenzije i komentari:

        Dmitrij :
        Hvala na scenariju, implementirat ću ga. Nemoguće je kopirati izvorni kod s web mjesta; kopira se samo u malim fragmentima; bilo bi prikladnije u cijelosti.

        Kiril:
        Hvala na napomeni o kopiranju, tek sam to vidio, pokušat ću to uskoro popraviti.

        Aleksej Pavlov:
        Greška u retku $tex = explode(":",$sendlist[$count] Treba vam točka-zarez, a ne dvotočka. Malo sam promijenio kod da bude jasniji: