veebilingid php tulu. Layer Cake ja com_weblinks Joomla. Muud komponentides kasutatavad failid

Kihiline kook

Räägime komponendist com_weblinks ja Joomla lehe html-märgistusest. Sellest, kuidas Joomla veebisaidil lihtsalt ja lihtsalt luua linkide kataloog.

See CMS on loodud interaktiivseks tööks registreeritud kasutajaga, ilma otsese kodeerimiseta. Kuigi Joomla arengutrend viib selleni, et komponendist com_weblinks loobutakse saidil täiesti kasutuna ja lisatakse niigi "raskele" süsteemile lihtsalt lisaraskust (üle 100 kb - 90 faili). Kuid praegu on see komponent distributsioonis endiselt olemas ja mõned programmeerijad kasutavad seda.

Ekraanil nähtav Joomla kodulehe leht on kihiline tort, mille ehitamisel on korraga kaasatud palju plokke (ja seega ka palju malle). Siin tuleb mängu Joomla filosoofia – suurte plokkidega saidi ehitamine. Igal plokil peab olema oma HTML-i märgistusmall (paigutus).

Peamised plokid:

Pealehe mall (site_template/index.php), mis oma html-märgistusega määrab moodulite ja komponentide asukohad ning kuvab need moodulid ja komponendid.
- lehe mall
- mooduli mallid
- komponentide mallid

Kõik need suured plokid on redigeerimiseks (muudatusteks) saadaval. See tähendab, et saate eraldi redigeerida näiteks mis tahes mooduli või komponendi malli ja see näeb lehel uus välja. Sama kehtib ka lehe malli kohta.

Algajal programmeerijal võib olla raske mõista, et lehe sisuosa esimene rida kuvatakse lehe pealkirjana ja seda redigeeritakse sellele lehele osutava menüüelemendi redigeerimislehel. Et teine ​​rida on tuletatud komponendi com_content või com_weblinks mallist. Ja stringid mallides on tavaliselt stringimuutujad ning nende lähtestamine ja lokaliseerimine toimub keelefailides, näiteks language\ru-RU\ru-RU.mod_weblinks.ini jms.

Mõnikord jääb algaja hämmelduma, milline mall selle või teise rea koostas, mis ekraanilehel näib sama narratiivi loogilise jätkuna. Selgub, et ühes mallis on üks rida, teises mallis teine ​​ja kolmandas kolmas. Ja allolev vahekaartidega tabel on mooduli mod_tabform malli väljund.

Mõnikord nimetatakse mooduli malle paigutusteks. Aga see on terminoloogia küsimus. Sisuliselt on see sama - see on sisu jaoks "riietus". Õigem oleks öelda märgistamine. Niisiis, ühe ekraanilehe märgistus asub erinevates Joomla kataloogifailides.

Menüü

Paljud uued Joomla programmeerijad ei saa sageli aru, et menüüelemendid võivad olla erinevat tüüpi. Teisisõnu võivad menüüelemendid viidata erinevat tüüpi Joomla objektidele. Need võivad olla erinevad objektid, näiteks: komponendid (hääletus, otsing, linkide kataloog jne).

Menüüelemendi tüübi valimine:

Kontaktid (com_contact)
Kontaktikategooriate loend (kategooriad)
Teatud kategooria kontaktide loend (kategooria)
Võtke ühendust
Lemmikkontaktid (esiletõstetud)

Materjalid (com_content)
Arhiivimaterjalid (arhiiv)
Materjal (artikkel)
Kõigi kategooriate loend (kategooriad)
Blogi kategooria
Materjalide kategooria (kategooria) loend
Esiletõstetud materjalid
Loo materjali

Nutikas otsing (com_search)
Otsing

Tere, Maailm! (com_helloworld)
Sõnum (helloworld)

Uudistevood (com_newsfeeds)
Kõigi uudistevoo kategooriate loend (kategooriad)
Kategooria (kategooria) uudistevoogude loend
Uudistevoog

Otsi (com_search)
Otsinguvorm ja otsingutulemuste loend (otsing)

Kasutajahaldur (com_users)
Autoriseerimisvorm (sisselogimine)
Kasutajaprofiil (profiil)
Muutke kasutajaprofiili
Registreerimisvorm
Kasutajanime taastamine (meeldetuletus)
Parooli muutmine (lähtestamine)

Ümbris (com_wrapper)
Ümbris

Nagu näete, on siin kõik menüütüübid komponendid. Nime järgi näitab menüüelemendi tüüp tegelikult selle komponenditüübi malli nime. Ja komponentide mallid asuvad vaadete kataloogides:

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

Nagu näete, on lingitüüpide nimed menüüs ja mallide nimed vewsi kataloogides samad.

Arendajal on võimalus luua komponentidele uusi mittestandardseid malle (paigutusi). Need uued paigutused kajastuvad ka uute menüütüüpidena menüütüübi valikuaknas. See on eraldi teema.

Joomla levitamise demo sisu

Vaatame, kuidas on üles ehitatud menüü "About Joomla" hierarhia, et kuvada Joomla vaikimisi demosisu (Beez2 – vaikimisi) mallil komponent com_weblinks.

Läheme administraatori paneelile, et redigeerida komponenti com_weblinks: Komponendid->Lingid. Näeme, et levitamisega kaasnevas demosisus on komponendi com_weblinks jaoks loodud viis kategooriat. See tähendab, et lingid jaotatakse viide kategooriasse. Kõik loodud kategooriad salvestatakse #_categories andmebaasi tabelisse. Samas tabelis on salvestatud ka teiste komponentide kategooriad.

Andme-veebilinkide näidised
|-Pargi lingid
|-Joomla! Konkreetsed lingid
|-|-Muud ressursid
Kategooriata

Menüüs Teave Joomla kohta (menüüredaktoris) on vastavalt loodud menüüüksuste hierarhia:

Menüüüksuste hierarhia:

Joomla! (tüüp: materjal)
|-Laienduste kasutamine (tüüp: kõigi kategooriate loend) :: materjalide kategooriate loend
|-|-Komponendid (tüüp: kategooria blogi) :: kategooria materjalides
|-|-|-Veebilinkide komponent (tüüp: materjal)
|-|-|-|-Esita veebilink (tüüp: loo link) :: komponendis Links
|-|-|-|-Veebilinkide üks kategooria (tüüp: kategooria linkide loend) :: komponendis Lingid
|-|-|-|-Veebilinkide kategooriad (tüüp: lingikategooriate loend) :: komponendis Lingid

Näeme, et mõnel menüüelemendil on tüübid: kategooriate loend, kategooria linkide loend ja lingi loomine.
"Lingikategooriate loend" määrab ülemise kategooria, millest hierarhiat näidatakse.
"Kategooria linkide loend" määrab kategooria, mille linke kuvatakse.
Punktis "Loo link" kuvatakse vorm, mille registreeritud kasutaja peab täitma.
Muide, selle vormi link näeb redaktoris välja järgmine (selle välimus aadressiribal muutub):

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

Mõnda menüüelementi saab näidata ainult registreeritud kasutajatele! Näiteks menüüelement tüübiga "Loo link" on nähtav ainult registreeritud kasutajatele. See funktsioon loodi spetsiaalselt selleks, et registreeritud kasutajad saaksid luua linke, mis lehele postitatakse.

Seega pakub komponent com_weblinks hea võimaluse lehe interaktiivseks täitmiseks huvitavate linkidega. Lisaks on kõigil linkidel, mis sellisele lehele paigutatakse, ümbersuunamine, see tähendab, et neid ei indekseerita välisteks. Võib-olla olete foorumites selliseid linke näinud. Kui hõljutate kursorit sellise lingi kohal, näete oma saidi aadressi ja alles pärast sellel klõpsamist suunatakse teid teie määratud aadressile.

Kasutaja võimalus lisada linke välistele saitidele on com_weblinks komponendi peamine eelis ja tähendus, nagu ka kasutaja võimalus lisada uut sisu – artikleid, pilte, videofaile jne.

CMS Joomla põhifilosoofia on lubada registreeritud kasutajal, kellel on õigused, täita sait sisuga ilma otsese kodeerimiseta.

Kategooriata
Näidisandmed-artiklid
|- Joomla!
|-|- Laiendused
|-|-|- Komponendid
|-|-|- Moodulid
|-|-|-|- Sisumoodulid
|-|-|-|- Kasutaja moodulid
|-|-|-|- Kuvamoodulid
|-|-|-|- Utiliidimoodulid
|-|-|-|- Navigatsioonimoodulid
|-|-|- Mallid
|-|-|-|- Aatomi
|-|-|-|- Beez 20
|-|-|-|- Beez 5
|-|-|- Keeled
|-|-|- Pluginad
|- Pargi sait
|-|- Pargi blogi
|-|- Fotogalerii
|-|-|- Loomad
|-|-|- Maastik
|- Puuviljapoe sait
|-|-Kasvatajad
|-|- Retseptid

Tundub, et sisu jaoks ei ole liiga palju kategooriaid!
Samuti saate vaadata materjalide kategooriate hierarhiat, kasutades andmebaasi kategooriatabeli päringut:

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

Funktsioonis cleanText on failis /includes/joomla.php soovitus rea asendamiseks

$tekst = riba_sildid($tekst); $tekst = riba_sildid ( $tekst , " " ) ;

See häkkimine on mõeldud ainult piltidele, mis on sisestatud tavaliste piltidena. Mamboti (mosimage) sisestatud piltide puhul see häkkimine ei tööta.

Kuidas otselinki komponendis com_weblinks kuvada

Saidis weblinks.html.php peate asendama rea:

$link = sefRelToAbs( "index.php?option=com_weblinks&task=view&catid=" . $catid ."&id=" . $row ->id ) ; $link = $rida ->url ; Kuidas panna Joomla töötama kahel hostil (domeenil) korraga. Need. näiteks kohalikus võrgus 10.0.0.15 ja veebisaidilt-firmy.ru. Vaatamata sellele, et mõlemad aadressid on määratud samale masinale.

Esiteks on probleemi mõte selles, et Joomla kuvab kõik pildid ja CSS-failid (nende teed mallis) võrreldes oma muutujaga $mosConfig_live_site – installimise ajal sisestatud saidi baasaadressiga. Ja kui keegi üritab sellele juurde pääseda mõne teise aadressiga, siis selle toimimise loogikas midagi ei muutu – baasaadress võetakse konfiguratsioonifailist. Näiteks kui konfiguratsioonis on kirjas, et Joomla asub localhostis, siis kohalikust võrgust ligipääs isegi õigesti konfigureeritud Apache'ile, mis kuulab aadressi 192.168.0.1, ei muuda selles midagi - piltide src algab ikkagi. "localhost", millel on teiste masinate jaoks juba oma kohalik host. Selliste juhtumite lahenduste eesmärk on asendada soovitud hosti muutuja $mosConfig_live_site, et kõik funktsioonid saaksid väljastada õiged lingid ja suunata kasutaja juba selleni. kas üks või teine ​​virtuaalne sait (andke õiged põhiteed piltidele ja põhiteed aadressidele). selleks peate failis configuration.php definitsiooni $mosConfig_live_site asemel kirjutama midagi sellist.

if ($_SERVER [ "HTTP_HOST" ] =="host1.ru" ) $mosConfig_live_site = "host1.ru" ; else $mosConfig_live_site = "host2.ru" ;

Tähelepanu tuleb pöörata sellele, et vahemälu kasutamisel peab sul olema ka kaks erinevat vahemällu salvestamise kataloogi kahe masina jaoks, sest vahemälus võivad lingid erinevatele hostidele ristuda ja siis ei jõua valest võrgust kasutaja üldse kuhugi . Vahemälu eest vastutab muutuja $mosConfig_cachepath.

Kuidas panna kaks komponenti korraga ühel lehel ilmuma

Ma ütlen teile kohe - kõik pole nii lihtne. Lõppude lõpuks pole see moodul. Seetõttu tasub esiteks otsida alternatiivi, s.t. Kindlasti on populaarse komponendiga kaasas moodulid, mis suudavad selle funktsioone korrata. Kui midagi sellist pole, on see valik. Seda saab teha moodulina või teoreetiliselt sisestada malli. Idee seisneb selles – komponendi kutsumine läbi index2.php (mida ja miks – loe kogu fakt). Need. saate luua iframe'i parameetriga src="index2.php?option=com_component&no_html=1" teise komponendi soovitud sisestuspunktis. Ja see kuvatakse seal. Teine asi on see, et funktsionaalsuse täielik tagamine on ebatõenäoline. Kuid sellest hoolimata on see väljapääs.

Või kasuta konstruktsiooni: mosLoadComponent("com_mycomp" ) ;

Kuid kui komponent on sel viisil käivitatud, peate mõistma, et see ei tea teie manipulatsioonidest ja töötab vastavalt oma $valikule ja $ülesandele.

Kuidas suurendada artikli pealkirja pikkust

Peate phpMyAdminis käivitama kaks järgmist käsku (SQL-päringute täitmiseks on spetsiaalne leht), lihtsalt asendage ###_ oma tegeliku tabeli prefiksiga. Maksimaalne võimalik arv on 255. Näites kasutatakse 200.

ALTER TABLE `###_content` CHANGE `title_alias` `title_alias` VARCHAR(200) NOT NULL; ALTER TABLE `###_content` CHANGE `pealkiri` `pealkiri` VARCHAR(200) NOT NULL;

Kuidas lisada oma RSS-kanalisse uudiste täistekste, mitte ainult pealkirju

Selleks tuleb failis /components/com_rss/rss.php asendada

$üksuse_kirjeldus = $rida ->introtekst ; $üksuse_kirjeldus = $rida ->täistekst ; Kuidas teha kaks Joomla saiti sama andmebaasi või samu faile kasutades?

Mis puutub ühe andmebaasi kasutamiseks, siis peate kahe mootori jaoks konfiguratsiooni.php-sse kirjutama ühe andmebaasi, kuid peate aru saama, mida teete. Kuna kasutajate seansside säilitamine on sel juhul väga problemaatiline, kuna domeenid on erinevad. Need. sisselogimiskirjed tabelis #__sessions kattuvad (võivad) kattuda.

Kui soovite kasutada samu faile ilma suurt distributsiooni kopeerimata, siis põhimõtteliselt saate Linuxis kasutada käsku “ln -s”, et luua sümboolseid linke olemasolevatele failidele ja mitte kopeerida neid uue saidi jaoks.

Kuidas luua virtuaalset lehekülge, millele on juurdepääs konkreetsel aadressil Joomla üldises kujunduses (http://site.ru/super_page)
  • Esimene võimalus on kasutada mingit SEF-komponenti, milles määrate staatilise lehe soovitud virtuaalse tee. Siin on miinus - see komponent hakkab kõiki teisi linke ümber tegema (ja üldiselt on need komponendid väga energianõudlikud ja nõuavad töötamiseks palju ressursse).
  • Looge sellisele lehele alias, kasutades mod_rewrite ja .htaccess. Selleks vajate:
    • Looge staatiline leht vajaliku tekstiga, uurige välja selle ID ja aadress (sellist lehte pole vaja luua, see võib juba olemas olla ja üldiselt on see lihtsalt suvaline komponent, mitte tingimata com_content)
    • Mõelge välja alias, olgu see "super_puper"
    • Avage fail .htaccess ja kirjutage enne rida "RewriteCond %(REQUEST_FILENAME) !-f":
RewriteRule ^(super_puper) index.php?option=com_content&task=view&id=12 RewriteCond %(REQUEST_FILENAME) !-f
    • Ja nüüd, eeldusel, et Joomla asub saidil site.ru, avaneb lingi http://site.ru/super_puper avamisel vajalik staatiline leht teie teabega. Link ise "index.php?option=com_content&task=view&id=12" võib olla mis iganes vaja, peaasi, et link ei oleks absoluutne (st http:/ /...-ga), vaid suhteline (peab algama indeksiga .php?...)
Kuidas keelata konkreetse artikli vahemälu

See võib olla vajalik, kui kasutate rd_addphp mamboti skriptide sisestamiseks, mis peaksid iga kord genereerima juhuslikke numbreid või juhuslikku teksti, olenemata Joomla vahemällu salvestamise süsteemist. Teatud üksuse vahemällu salvestamise keelamiseks peate välja selgitama selle ID (administraatori paneelil vaadake redigeerimisel aadressiriba, see ütleb umbes "...&id=123..."). Nii et 123 on meie artikli ID. Failis /components/com_content/content.php on vaja asendada umbes real 1600

$cache ->call ( "HTML_content::show" , $rida , $params , $juurdepääs , $leht ) ; if ($row ->id !="123" ) $cache ->call ( "HTML_content::show" , $row , $params , $access , $page ) ; else HTML_content::show ($rida, $params, $juurdepääs, $leht) ;

Kus 123 on vajalik artikli ID.

Installisin palju komponente, kuid administraatorimenüü komponentide loend näitab nende arvu vähendatud arvu ja seejärel ütleb "Veel komponente...". Kuidas kuvada kõiki komponente.

Failis /administrator/modules/mod_fullmenu.php on vaja rida

$topLevelLimit = 19 ;

asendatud

$topLevelLimit = 199 ; Kuidas installida komponendi koopiat

Peab ütlema, et ülesanne on äärmiselt raske. Kui te ei saa aru, kuidas komponent töötab, siis ärge isegi proovige. Neile, kes soovivad siiski põhipunkte tähele panna:

  • Nimetage XML-failis nimesildis komponendi nimi ümber
  • Järgmiseks peate kasutatavad tabelid ümber nimetama (esmalt XML-failis ja teiseks kõigis komponentfailides, kus iganes $database andmebaasiobjekti ja setQuery meetodit kasutatakse)
  • Nimeta ümber ka kõik teed komponentides. Teid saab kasutada viidetes iseendale või kaasatud failide nimedes. Enamasti taandub see alamstringi com_component nime otsimisele ja selle asendamisele uuega.

Kuid see meetod ei garanteeri midagi. Lihtsate puhul on see võimalik ja läheb üle, kuid keerukate puhul ei anna keegi garantiid.

Kuidas panna üks positsioon juhuslikult näitama ühte sellele määratud moodulitest
  • Valik 1 – häkkige funktsioon mosLoadModules. Malli kohta, kus on vaja kuvada üks N moodulist, kirjutame (pöörake tähelepanu kolmandale argumendile):
mosLoadModules("positsioon", kuva_seadistus,true);

Ja parandame veidi ülaltoodud funktsiooni ennast:

function mosLoadModules( $position ="left" , $style =0 , $show_random = false ) ( ... $allModules =& initModules() ; if (isset ( $GLOBALS [ "_MOS_MODULES" ] [ $position ] ) ) ( $moodulid = $GLOBALS [ "_MOS_MODULES" ] [ $positsioon ] else ( $moodulid = massiiv () ; ) //lisa siia if ($show_random && sizeof ($modules ) >0 ) ( $tmp = $moodulid [ rand (0 ,sizeof ($modules ) -1 ) ] $moodulid = massiiv ($tmp ) // lause lõpp if ( count ( $moodulid )< 1 ) { $style = 0 ; }

Lisasime sellele kolmanda argumendi (mida kasutatakse mallis, kus kirjutasime tõeseks) ja muutsime koodi.

  • Teine võimalus on valutum, muudame ainult malli. Aga töömahukam – peame looma mitu ametikohta. Esiteks loome mitu uut mooduli positsiooni, näiteks uus1 ... uus10. Salvesta. Enne funktsiooni mosLoadModules kutsumist malli õigesse kohta lisage vajalik kood:
$rand_num = rand (1 ,10 ) ;//alates 1 kuni 10 - nagu positsiooninimes mosLoadModules ( "new" .$rand_num , display_settings) ; Usun, et kausta /adminisrator/ ümbernimetamisega muudan oma saidi turvalisemaks

See valik pole standardvarustuses. Kuid tegelikult on Joomla failides otsingut korraldades võimalik asendada iga sellise sõna esinemine teie sõnaga - salajane. Mõnikord võivad hiljem ilmneda vead failidele juurdepääsu puudumise kohta, kuid teades faili ja rea ​​numbrit, saab need parandada. Seetõttu on probleem põhimõtteliselt lahendatav.

Sel kuul ei taha veakaevajad meid hellitada populaarsetes rakendustes uute kõrgetasemeliste rünnakutega. Loomulikult on tuntud firmade toodetes avaldatud palju nõuandeid, kuid väga vähesed neist sisaldavad loetavaid PoC koode. Meie ülevaates püüdsin koguda hiljuti kirjeldatud kõige olulisemad ja täielikumad haavatavused, nii et istuge rahulikult ja nautige lugemist.

PHP haavatavus HTTP Headi päringute töötlemisel Lühike

3. märtsil avastas teatud Adam Ivanyuk PHP tõlgis huvitava funktsiooni, mis ei töötle HEAD päringuid päris õigesti. Teadlane nimetas seda haavatavust "HTTP HEAD meetodi trikiks php-skriptides".

Paljud kodeerijad kujundavad oma PHP skripte lootes, et kõik nendesse kirjutatud juhised käivituvad edukalt ilma kuskilt keskelt purunemata (eriti lühikeste skriptide puhul). See juhtub siis, kui skripti taotleb lõppkasutaja, kasutades meetodeid GET, POST, PUT.

Kuid peaksite teadma, et on ka teisi HTTP-meetodeid – näiteks HEAD. Just selle meetodi PHP-s töötlemisel võib tekkida turvaauk.

Vaatame üht tõlgi allikat: ./main/SAPI.c, rida 315:

if (SG(request_info).request_method &&
!strcmp(SG(request_info).request_method, "HEAD"))
{
SG(päringu_info).ainult päised = 1;
...

Andmete saabumisel käivitatakse funktsioon php_ub_body_write. Järgmisena vaadake saidi main/output.c rida 699:

if (SG(request_info).headers_only) (
if(SG(päised_saadetud))
{
tagasi 0;
}
php_päis(TSRMLS_C);
zend_bailout();
}

Siin on näha, et esmakordsel printimisel ja HEAD meetodil funktsioon zend_bailout rikub skripti.

Kasutada

Nüüd pääseme sellele skriptile juurde HEAD-meetodi abil:

Nagu arvatagi võis, peatab meie külalisteraamat selle täitmise real “echo $data;”, seega lähtestatakse fail book.txt lihtsalt nulliks.
See näide on oma olemuselt pigem hävitav. Teises näites saame primitiivsel administraatoripaneelil autoriseerimisest mööda minna:

Selles skriptis on tavapäraste meetoditega sisselogimisel seansis määratud administratiivne muutuja. Seejärel, kui kasutaja sisestab vale parooli, lähtestatakse see muutuja ja kasutajast ei saa administraatorit.

Kui pääseme administraatori paneelile HEADi kaudu, siis selle täitmine katkeb koodilõigu juures, millel on "kaja", nii et haldusmuutujat ei lähtestata ja saame rakenduse suletud osas ohutult ringi uidata. Siinkohal tuleb meeles pidada, et enamikul veebiserveritel on väljundi puhverdusväärtuseks seatud 4096 baiti, nii et töötava näite puhul võib meil vaja minna stringi "Pikk string sisaldab umbes 4090 tähemärki".

Kasutada
  • PHP

    Siin sisaldab massiiv $check meie POST-andmeid ja muutuja $locked on serialiseeritud string, mis on hägustatud funktsiooni str_rot13() abil, mis on täielikult meie kontrolli all.

    Siinkohal tasub teha väike kõrvalepõige neil, kes pole ][-s vastavaid artikleid lugenud, ja lühidalt rääkida PHP võlumeetodites ilmnevast veast. Nii ilmus PHP versioonis 5 OOP-i programmeerimise põhikontseptsioon: konstruktor ja hävitaja. Konstruktor on realiseeritud meetodil "__construct" ja destruktor "__destruct" meetodil. Pärast töö lõpetamist ja funktsiooni unserialize() kaudu kutsumisel käivitab iga objekt oma __ hävitamismeetodi, kui see on koodis kirjutatud.

    Nüüd pöördume tagasi oma raamistiku juurde ja vaatame rakenduse klasside destruktorit failist ./libs/configure.php:

    funktsioon __destruct()
    {
    kui ($this->__cache)
    {
    $core = App::core("kook");
    unset($this->__paths);
    Vahemälu::write("dir_map", array_fi lter($this->__paths),
    "tort_core");
    Vahemälu::write("fi le_map", array_fi lter($this->__map),
    "tort_core");
    Vahemälu::write("object_map", $this->__objects,
    "tort_core");
    }
    }

    Ülaltoodud koodist näete, et vahemälu objektile suvaliste väärtuste kirjutamine võib seda meetodit kahjustada. Kõige huvitavam võti murdmiseks on 'file_map'. See haldab klasside ja vastavate PHP-failide vahelisi ühendusi ning seda kasutatakse ka täiendavate klasside laadimiseks skripti täitmise ajal.

    Tegelik klasside laadimise kood on veidi keerulisem, kuid see kõik taandub järgmisele koodile, mis pärineb rakenduse klassis olevast meetodist __load:

    Bingo! Asendades muutuja $ file, saame lisada oma PHP koodi! Veelgi enam, see on tõeline kaugfailide kaasamise viga - seega ei vaja me kohalike failide serverisse üleslaadimiseks täiendavaid nippe. Leitud haavatavuse autor pakub aga selle augu ärakasutamiseks LFI võimalust, kuna CakePHP kasutab failipõhist lokaalset vahemälu, mis asub serialiseeritud kujul ründajale teadaolevas kataloogis.

    Kasutada

    Väikese PoC-na mürgise serialiseeritud stringi genereerimiseks pakub felix järgmist koodi:

    Loomulikult peate esmalt lisama CakePHP-st vajalikud klassid. Samuti on olemas täisfunktsionaalne Pythoni eksploit, mille leiate aadressilt malloc.im/burnedcake.py.

    See ärakasutamine peaks töötama kõigis CakePHP-le ehitatud rakendustes, mis kasutavad turvamärkidega POST-vorme ja milles vahemälufailide standardset asukohta pole muudetud. Vaikimisi kuvab exploit andmebaasi konfiguratsiooni, mida saab hõlpsasti lisada, muutes sisseehitatud PHP kasulikku koormust.

    Sihtmärgid
    • CakePHP getState("fi lter_order_dir");
      $fi lter_order = JFilterInput::clean($fi lter_order, "cmd");
      $fi lter_order_dir =
      JFilterInput::clean($fi lter_order_dir, "word");
      // Peame saama nimekirja kõigist
      // antud kategoorias olevad veebilingid
      $query = "VALI *" .
      "#__veebilinkidest" .
      "KUS catid =". (int) $this->_id.
      "JA avaldatud = 1" .
      "JA arhiveeritud = 0".
      "TELLI". $fi lter_order "".
      $fi lter_order_dir .", järjestamine";
      tagasta $päring;
      }

      Siin näete, et muutujate $filter_order ja $filter_order_dir vastavust SQL-lausetele ei kontrollita ainult JFilterInput klassi standardse puhasmeetodi abil: