weblinks php inkomen. Layer Cake en com_weblinks Joomla. Andere bestanden die in componenten worden gebruikt

Laag taart

We zullen het hebben over de com_weblinks component en de html-opmaak van de Joomla-pagina. Over hoe u eenvoudig en eenvoudig een directory met links op een Joomla-website kunt maken.

Dit CMS is gemaakt voor interactief werken met een geregistreerde gebruiker, zonder directe codering. Hoewel de ontwikkelingstrend van Joomla ertoe leidt dat de com_weblinks-component als volledig nutteloos op de site wordt verlaten en eenvoudigweg extra gewicht (meer dan 100 kb - 90 bestanden) wordt toegevoegd aan een toch al “zwaar” systeem. Maar voorlopig is dit onderdeel nog steeds aanwezig in de distributie en wordt het door sommige programmeurs gebruikt.

De op het scherm zichtbare Joomla-websitepagina is een laagcake, waarbij bij de constructie veel blokken (en dus veel sjablonen) tegelijkertijd betrokken zijn. Dit is waar de Joomla-filosofie in het spel komt: het bouwen van grote blokken sites. Elk blok moet zijn eigen HTML-opmaaksjabloon (lay-out) hebben.

Belangrijkste blokken:

De hoofdpaginasjabloon (site_template/index.php), die met zijn html-opmaak de posities voor modules en componenten definieert en deze modules en componenten weergeeft.
- paginasjabloon
- modulesjablonen
- componentsjablonen

Elk van deze grote blokken is beschikbaar voor bewerking (wijzigingen). Dat wil zeggen dat u bijvoorbeeld de sjabloon van elke module of component afzonderlijk kunt bewerken, zodat deze er nieuw uit zal zien op de pagina. Hetzelfde geldt voor het paginasjabloon.

Het kan voor een beginnende programmeur moeilijk zijn om te begrijpen dat de eerste regel in het inhoudsgedeelte van de pagina wordt weergegeven als de paginatitel en wordt bewerkt op de bewerkingspagina van het menu-item dat naar deze pagina verwijst. Dat de tweede regel is afgeleid van de componentsjabloon com_content of com_weblinks. En strings in sjablonen zijn meestal stringvariabelen en hun initialisatie en lokalisatie wordt uitgevoerd in taalbestanden, zoals taal\ru-RU\ru-RU.mod_weblinks.ini en dergelijke.

Soms staat een beginner perplex: welk sjabloon heeft deze of gene regel geproduceerd, die op de schermpagina lijkt op een logische voortzetting van hetzelfde verhaal. Het blijkt dat één regel zich in de ene sjabloon bevindt, een andere in de tweede sjabloon en een derde in de derde. En de onderstaande tabel met tabbladen is de uitvoer van de mod_tabform-modulesjabloon.

Soms worden modulesjablonen lay-outs genoemd. Maar dit is een kwestie van terminologie. De essentie is hetzelfde: het is “kleding” voor de inhoud. Het zou juister zijn om te zeggen: markering. De opmaak van één schermpagina bevindt zich dus in verschillende Joomla-directorybestanden.

Menu

Veel nieuwe Joomla-programmeurs begrijpen vaak niet dat menu-items verschillende typen kunnen hebben. Met andere woorden, menu-items kunnen verwijzen naar Joomla-objecten van verschillende typen. Dit kunnen verschillende objecten zijn, zoals: componenten (stemmen, zoeken, linkdirectory, etc.).

Een type menu-item selecteren:

Contacten (com_contact)
Lijst met contactcategorieën (categorieën)
Lijst met contacten van een bepaalde categorie (categorie)
Contact
Favoriete contacten (uitgelicht)

Materialen (com_content)
Archiefmaterialen (archief)
Materiaal (artikel)
Lijst met alle categorieën (categorieën)
Blogcategorie
Lijst met materiaalcategorieën (categorie)
Uitgelichte materialen
Materiaal maken

Slim zoeken (com_search)
Zoekopdracht

Hallo wereld! (com_helloworld)
Bericht (hallo wereld)

Nieuwsfeeds (com_newsfeeds)
Lijst met alle nieuwsfeedcategorieën (categorieën)
Lijst met nieuwsfeeds in categorie (categorie)
Nieuwsfeed

Zoeken (com_search)
Zoekformulier en lijst met zoekresultaten (zoeken)

Gebruikersbeheer (com_users)
Machtigingsformulier (inloggen)
Gebruikersprofiel (profiel)
Gebruikersprofiel wijzigen
Registratieformulier
Herstel van gebruikersnaam (herinnering)
Het wachtwoord wijzigen (resetten)

Wikkelaar (com_wrapper)
Wikkel

Zoals u kunt zien, zijn hier alle menutypen componenten. Met zijn naam geeft het menu-itemtype feitelijk de naam aan van de sjabloon van zijn componenttype. En componentsjablonen bevinden zich in de views-mappen:

joomla\components\com_weblinks\views\categorieën
joomla\components\com_weblinks\views\category
joomla\components\com_weblinks\views\weblink
joomla\components\com_users\views\login

Zoals u kunt zien, zijn de namen van de linktypen in het menu en de namen van de sjablonen in de vews-mappen hetzelfde.

De ontwikkelaar heeft de mogelijkheid om nieuwe niet-standaard sjablonen (lay-outs) voor componenten te maken. Deze nieuwe lay-outs worden ook weergegeven als nieuwe menutypen in het selectievenster voor menutypen. Dit is een apart onderwerp.

Demo-inhoud voor Joomla-distributie

Laten we eens kijken hoe de hiërarchie van de menu-items "Over Joomla" is opgebouwd om de com_weblinks component weer te geven op de standaard demo-inhoud (Beez2 - standaard) Joomla-sjabloon.

Laten we naar het beheerderspaneel gaan om de component com_weblinks te bewerken: Componenten->Links. We zien dat in de demo-inhoud die bij de distributie wordt geleverd, vijf categorieën zijn gemaakt voor de com_weblinks-component. Dit betekent dat de links in vijf categorieën worden verdeeld. Alle aangemaakte categorieën worden opgeslagen in de databasetabel #_categories. Categorieën voor andere componenten worden ook in dezelfde tabel opgeslagen.

Voorbeeldgegevens-weblinks
|-Parkkoppelingen
|-Joomla! Specifieke koppelingen
|-|-Andere bronnen
Niet gecategoriseerd

In het Over Joomla-menu (in de menu-editor) is dienovereenkomstig een hiërarchie van menu-items gemaakt:

Hiërarchie van menu-items:

Met behulp van Joomla! (soort: materiaal)
|-Extensies gebruiken (type: lijst met alle categorieën):: lijst met categorieën in materialen
|-|-Componenten (type: categorie blog) :: categorie in materialen
|-|-|-Weblinks Component (type: materiaal)
|-|-|-|-Verzend een weblink (type: link maken) :: in de component Links
|-|-|-|-Weblinks enkele categorie (type: lijst met links in een categorie) :: in de component Links
|-|-|-|-Weblinkscategorieën (type: lijst met linkcategorieën) :: in de component Links

We zien dat sommige menu-items de volgende typen hebben: lijst met categorieën, lijst met links in een categorie en link maken.
De "Lijst met linkcategorieën" specificeert de topcategorie waaruit de hiërarchie wordt weergegeven.
De "Lijst met links in een categorie" specificeert de categorie waarvan de links worden weergegeven.
In het item “Link aanmaken” wordt een formulier weergegeven dat de geregistreerde gebruiker moet invullen.
Zo ziet de link naar dit formulier er trouwens uit in de editor (het uiterlijk verandert in de adresbalk):

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

Sommige menu-items kunnen alleen aan geregistreerde gebruikers worden getoond! Een menu-item met het type "Link maken" is bijvoorbeeld alleen zichtbaar voor geregistreerde gebruikers. Deze functie is speciaal gemaakt zodat geregistreerde gebruikers links kunnen maken die op de pagina worden geplaatst.

De component com_weblinks biedt dus een goede manier om een ​​pagina interactief te vullen met interessante links. Bovendien hebben alle links die op zo'n pagina worden geplaatst een redirect, dat wil zeggen dat ze niet als extern worden geïndexeerd. Mogelijk heb je dergelijke links op forums gezien. Wanneer u met uw muis over een dergelijke link beweegt, ziet u het adres van uw site en pas nadat u erop hebt geklikt, wordt u doorgestuurd naar het door u opgegeven adres.

De mogelijkheid voor de gebruiker om links naar externe sites toe te voegen is het belangrijkste voordeel en de betekenis van de com_weblinks component, evenals de mogelijkheid voor de gebruiker om nieuwe inhoud toe te voegen - artikelen, afbeeldingen, videobestanden, enz.

Een geregistreerde gebruiker met rechten toestaan ​​de site te vullen met inhoud zonder directe codering is de basisfilosofie van CMS Joomla.

Niet gecategoriseerd
Voorbeeldgegevensartikelen
|- Joomla!
|-|- Extensies
|-|-|- Componenten
|-|-|- Modules
|-|-|-|- Inhoudsmodules
|-|-|-|- Gebruikersmodules
|-|-|-|- Displaymodules
|-|-|-|- Nutsmodules
|-|-|-|- Navigatiemodules
|-|-|- Sjablonen
|-|-|-|- Atoom
|-|-|-|- Beez20
|-|-|-|-Beez 5
|-|-|- Talen
|-|-|- Plug-ins
|- Parksite
|-|- Parkblog
|-|- Fotogalerij
|-|-|- Dieren
|-|-|- Landschap
|- Fruitwinkelsite
|-|-Telers
|-|- Recepten

Er lijken niet te veel categorieën voor inhoud te zijn!
U kunt ook de hiërarchie van categorieën in materialen bekijken met behulp van een query naar de categorietabel in de database:

SELECTEER * VAN `#_categories` WAAR `extension` = "com_content"

Er staat een suggestie in het bestand /includes/joomla.php in de cleanText functie om de regel te vervangen

$text = strip_tags($text); " ) ;

$text = striptags ($text, "

Deze hack is alleen bedoeld voor afbeeldingen die als normale afbeeldingen worden ingevoegd. Voor afbeeldingen die zijn ingevoegd door een mambot (mosimage), zal deze hack niet werken.

Hoe u een directe link kunt laten verschijnen in de component com_weblinks

In weblinks.html.php moet je de regel vervangen:

Ten eerste is het hele punt van het probleem dat Joomla alle afbeeldingen en CSS-bestanden (hun paden in de sjabloon) weergeeft ten opzichte van de variabele $mosConfig_live_site - het basisadres van de site dat tijdens de installatie is ingevoerd. En als iemand er toegang toe probeert te krijgen met een ander adres, verandert er niets in de logica van de werking ervan: het basisadres wordt uit het configuratiebestand gehaald. Als de configuratie bijvoorbeeld aangeeft dat Joomla zich op localhost bevindt, zal toegang vanaf het lokale netwerk, zelfs tot een correct geconfigureerde Apache die naar het adres 192.168.0.1 luistert, niets daarin veranderen - de src van de afbeeldingen zal nog steeds beginnen met "localhost", die voor andere machines al zijn eigen localhost zal hebben. De focus van oplossingen voor dergelijke gevallen is het vervangen van de variabele $mosConfig_live_site voor de gevraagde host, zodat alle functies de juiste links kunnen geven en de gebruiker er al naartoe kunnen leiden. een of andere virtuele site (geef de juiste basispaden naar afbeeldingen en basispaden naar adressen). Er is een Auto live site mambot die dit kan automatiseren. Als het u op de een of andere manier niet bevalt, kan het in principe worden herhaald ; hiervoor moet je in configuratie.php, in plaats van de $mosConfig_live_site-definitie, de jouwe code schrijven als:

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

anders $mosConfig_live_site = "host2.ru" ;

Het is noodzakelijk om op te letten dat als u een cache gebruikt, u ook twee verschillende caching-directory's voor twee hosts moet hebben, omdat links naar verschillende hosts elkaar in de cache kunnen kruisen, en dan komt een gebruiker uit het verkeerde netwerk helemaal nergens. . De variabele $mosConfig_cachepath is verantwoordelijk voor de cache.

Hoe u twee componenten tegelijkertijd op één pagina kunt laten verschijnen

Ik zal het je meteen vertellen - niet alles is zo eenvoudig. Het is tenslotte geen module. Daarom is het in de eerste plaats de moeite waard om naar een alternatief te zoeken, d.w.z. Een populair onderdeel wordt ongetwijfeld geleverd met modules die de functionaliteit ervan kunnen repliceren. Als dat niet het geval is, is dit een optie. Het kan als module worden gemaakt of, in theorie, in een sjabloon worden ingevoegd. Het idee is dit: de component aanroepen via index2.php (wat en waarom - lees het hele feit). Die. je kunt een iframe maken met src="index2.php?option=com_component&no_html=1" op het gewenste invoegpunt voor de tweede component. En het zal daar worden tentoongesteld. Een ander ding is dat het onwaarschijnlijk is dat het mogelijk zal zijn om de functionaliteit volledig te garanderen. Maar toch is dit een uitweg.

Maar als de component op deze manier wordt uitgevoerd, moet u begrijpen dat deze niet op de hoogte is van uw manipulaties en zal werken volgens zijn $optie en $taak.

Hoe u de lengte van de titel van een artikel kunt vergroten

U moet de volgende twee opdrachten uitvoeren in phpMyAdmin (er is een speciale pagina voor het uitvoeren van SQL-query's), vervang gewoon ###_ door uw echte tabelvoorvoegsel. Het maximaal mogelijke aantal is 255. In het voorbeeld wordt 200 gebruikt.

ALTER TABEL `###_content` WIJZIG `title_alias` `title_alias` VARCHAR(200) NIET NULL; ALTER TABEL `###_content` WIJZIG `titel` `titel` VARCHAR(200) NIET NULL;

Hoe u volledige nieuwsteksten in uw RSS-feed kunt opnemen, niet alleen de koppen

Om dit te doen, moet u in het bestand /components/com_rss/rss.php vervangen

$item_description = $row ->introtekst ;

$item_description = $rij ->volledige tekst; Hoe kan ik twee Joomla-sites maken die dezelfde database gebruiken of dezelfde bestanden gebruiken?

Wat betreft het gebruik van één database: u moet één database schrijven in configuratie.php voor twee zoekmachines, maar u moet wel begrijpen wat u doet. Omdat het onderhouden van sessies voor gebruikers in dit geval zeer problematisch zal zijn, omdat de domeinen verschillend zijn. Die. login-items in de #__sessions-tabel zullen (mogelijk) overlappen.

Als je dezelfde bestanden wilt gebruiken zonder een grote distributie te kopiëren, dan kun je in Linux in principe het commando “ln -s” gebruiken om symbolische links naar bestaande bestanden te maken en deze niet voor de nieuwe site te kopiëren.
  • Hoe u een virtuele pagina kunt maken die toegankelijk is op een specifiek adres in het algemene Joomla-ontwerp (http://site.ru/super_page)
  • De eerste manier is om een ​​soort SEF-component te gebruiken, waarin je het gewenste virtuele pad voor een statische pagina specificeert. Er is hier een minpuntje: dit onderdeel zal alle andere links opnieuw gaan maken (en over het algemeen zijn deze componenten erg energieverslindend en vereisen ze veel middelen om te werken).
    • Maak een alias voor zo'n pagina met mod_rewrite en .htaccess. Om dit te doen heb je nodig:
    • Maak een statische pagina met de tekst die je nodig hebt, ontdek de ID en het adres ervan (het is niet nodig om zo'n pagina te maken, deze bestaat mogelijk al en is in het algemeen slechts een onderdeel, niet noodzakelijkerwijs com_content)
    • Verzin een alias, laat het "super_puper" zijn
Open .htaccess en schrijf vóór de regel "RewriteCond %(REQUEST_FILENAME) !-f":
    • En nu, op voorwaarde dat Joomla zich op site.ru bevindt, wordt de vereiste statische pagina met uw gegevens geopend als u de link http://site.ru/super_puper opent. De link zelf "index.php?option=com_content&task=view&id=12" kan alles zijn wat je nodig hebt, het belangrijkste is dat de link niet absoluut is (d.w.z. met http:///...) maar relatief (moet beginnen met index .php?...)
Hoe caching voor een specifiek artikel uit te schakelen

Dit kan nodig zijn als u de rd_addphp mambot gebruikt om scripts in te voegen die elke keer willekeurige getallen of willekeurige tekst moeten genereren, ongeacht het Joomla caching-systeem. Om het cachen van een bepaald item uit te schakelen, moet je de ID ervan achterhalen (kijk in het beheerderspaneel tijdens het bewerken naar de adresbalk, er staat zoiets als "...&id=123..."). Dus 123 is onze artikel-ID. Het is noodzakelijk om het bestand /components/com_content/content.php ongeveer op regel 1600 te vervangen

$cache ->call ("HTML_content::show" , $row , $params , $access , $page ) ;

if ($row ->id !="123" ) $cache ->call ("HTML_content::show" , $row , $params , $access , $page ) ;

else HTML_content::show ($row, $params, $access, $page) ;

Waarbij 123 de artikel-ID is die u nodig heeft.

Ik heb veel componenten geïnstalleerd, maar de lijst met componenten in het beheerdersmenu toont een kleiner aantal en vervolgens staat er "Meer componenten...". Hoe alle componenten worden weergegeven.

Je hebt een regel nodig in het bestand /administrator/modules/mod_fullmenu.php

$topLevelLimit = 19;

vervangen door

  • $topLevelLimit = 199; Hoe u een kopie van een component installeert
  • Het moet gezegd worden dat de taak buitengewoon moeilijk is. Als u niet begrijpt hoe het onderdeel werkt, moet u het niet eens proberen. Voor wie de belangrijkste punten nog wil noteren:
  • Hernoem in het XML-bestand de naam van de component in het naamplaatje

Vervolgens moet u de gebruikte tabellen hernoemen (eerst in het XML-bestand en ten tweede in alle componentbestanden, waar het databaseobject $database en de setQuery-methode worden gebruikt)

Hernoem ook alle paden in componenten. Paden kunnen worden gebruikt in verwijzingen naar zichzelf of in de namen van opgenomen bestanden. Meestal komt dit neer op het zoeken naar de subtekenreeks com_component naam en deze vervangen door een nieuwe.
  • Optie 1: hack de mosLoadModules-functie. In de sjabloon, op de plaats waar het nodig is om een ​​van de N-modules weer te geven, schrijven we (let op het derde argument):
mosLoadModules("positie", display_setup,true);

En we corrigeren de bovenstaande functie zelf enigszins:

function mosLoadModules( $position ="left" , $style =0 , $show_random = false ) ( ... $allModules =& initModules() ; if (isset ($GLOBALS [ "_MOS_MODULES" ] [ $position ] ) ) ( $modules = $GLOBALS [ "_MOS_MODULES" ] [ $position ] ) else ( $modules = array () ; ) //voeg hier toe als ($show_random && sizeof ($modules ) >0 ) ( $tmp = $modules [ rand (0,groottevan ($modules) -1)] $modules = array ($tmp) // einde van de instructie if (count ($modules)< 1 ) { $style = 0 ; }

We hebben er een derde argument aan toegevoegd (dat wordt gebruikt in de sjabloon, waar we true hebben geschreven) en de code aangepast.

  • Optie twee is pijnlozer, we passen alleen de sjabloon aan. Maar arbeidsintensiever: we moeten verschillende posities creëren. Eerst creëren we verschillende nieuwe moduleposities, bijvoorbeeld new1 ... new10. Redden. Voeg op de juiste plaats in de sjabloon, voordat u de functie mosLoadModules aanroept, de benodigde code toe:
$rand_num = rand (1,10);//van 1 tot 10 - zoals in de positienaam mosLoadModules ("new" .$rand_num, display_settings) ; Ik geloof dat door het hernoemen van de map /adminisrator/ ik mijn site veiliger zal maken

Deze optie is niet standaard aanwezig. Maar in feite is het mogelijk, door een zoekopdracht in Joomla-bestanden te organiseren, om elk voorkomen van zo'n woord te vervangen door het jouwe - geheim. Soms kunnen er later fouten optreden over het onvermogen om toegang te krijgen tot bestanden, maar als u het bestands- en regelnummer kent, kunnen deze worden gecorrigeerd. Het probleem is dus in principe oplosbaar.

Deze maand willen buggravers ons niet verwennen met nieuwe spraakmakende exploits in populaire applicaties. Natuurlijk zijn er veel adviezen gepubliceerd in producten van bekende bedrijven, maar slechts weinig daarvan bevatten leesbare PoC-codes. In onze review heb ik geprobeerd de meest significante en volledige kwetsbaarheden te verzamelen die onlangs zijn beschreven, dus leun achterover en lees veel.

PHP-kwetsbaarheid bij het verwerken van HTTP Head-verzoeken Kort

Op 3 maart ontdekte een zekere Adam Ivanyuk een interessante functie in de PHP-interpreter, die HEAD-verzoeken niet helemaal correct verwerkt. De onderzoeker noemde deze kwetsbaarheid “HTTP HEAD-methodetruc in php-scripts.”

Veel programmeurs ontwerpen hun PHP-scripts in de hoop dat alle instructies die erin zijn geschreven succesvol zullen worden uitgevoerd zonder ergens in het midden te breken (vooral in korte scripts). Dit is wat er gebeurt als het script door de eindgebruiker wordt opgevraagd met behulp van de GET-, POST-, PUT-methoden.

Maar u moet weten dat er andere HTTP-methoden zijn, bijvoorbeeld HEAD. Juist bij het verwerken van deze methode in PHP kan er een veiligheidslek ontstaan.

Laten we eens kijken naar een van de tolkbronnen: ./main/SAPI.c, regel 315:

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

Wanneer er gegevens binnenkomen, wordt de functie php_ub_body_write uitgevoerd. Kijk vervolgens naar main/output.c, regel 699:

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

Hier kunt u zien dat de eerste keer dat het op het scherm wordt afgedrukt en bij gebruik van de HEAD-methode, de functie zend_bailout het script verbreekt.

Uitbuiten

Laten we nu dit script openen met behulp van de HEAD-methode:

Zoals je zou verwachten, zal ons gastenboek de uitvoering ervan stoppen bij de regel “echo $data;”, dus het bestand book.txt wordt eenvoudigweg op nul gezet.
Dit voorbeeld is nogal destructief van aard. In het tweede voorbeeld kunnen we de autorisatie in het primitieve beheerderspaneel omzeilen:

In dit script wordt bij het inloggen via de gebruikelijke methoden een administratieve variabele in de sessie ingesteld. Als de gebruiker vervolgens een onjuist wachtwoord invoert, wordt deze variabele opnieuw ingesteld en wordt de gebruiker geen beheerder.

Als we via HEAD toegang krijgen tot het beheerderspaneel, wordt de uitvoering ervan onderbroken bij het stukje code met “echo”, zodat de administratieve variabele niet wordt gereset en we veilig door het gesloten deel van de applicatie kunnen dwalen. Het ding om in gedachten te houden is dat de uitvoerbufferwaarde van de meeste webservers is ingesteld op 4096 bytes, dus in een werkend voorbeeld hebben we mogelijk de string "Een lange string bevat ongeveer 4090 tekens" nodig.

Uitbuiten
  • PHP

    Hier bevat de array $check onze POST-gegevens, en de variabele $locked is een geserialiseerde string die wordt versluierd met behulp van de functie str_rot13(), die volledig onder onze controle staat.

    Op dit punt is het de moeite waard om een ​​kleine uitweiding te maken voor degenen die de overeenkomstige artikelen in ][ niet hebben gelezen, en kort te praten over de bug die zich manifesteert in de magische methoden van PHP. Dus in PHP versie 5 verscheen het basisconcept van OOP-programmeren: constructor en destructor. Een constructor wordt geïmplementeerd met behulp van de "__construct" -methode en een destructor wordt geïmplementeerd met behulp van de "__destruct" -methode. Na voltooiing van zijn werk en wanneer het wordt aangeroepen via de functie unserialize(), voert elk object zijn eigen __ destruct-methode uit, als deze in de code is geschreven.

    Laten we nu teruggaan naar ons raamwerk en kijken naar de App-klassedestructor uit het bestand ./libs/configure.php:

    functie __destruct()
    {
    if ($dit->__cache)
    {
    $core = App::core("taart");
    unset($this->__paden);
    Cache::write("dir_map", array_fi lter($this->__paths),
    "taart_kern");
    Cache::write("bestand_map", array_fi lter($this->__map),
    "taart_kern");
    Cache::write("object_map", $this->__objects,
    "taart_kern");
    }
    }

    Uit de bovenstaande code kun je zien dat deze methode kan worden aangetast door willekeurige waarden naar het Cache-object te schrijven. De meest interessante sleutel om te kraken is 'file_map'. Het beheert de verbindingen tussen klassen en de bijbehorende PHP-bestanden, en wordt ook gebruikt om extra klassen te laden tijdens de uitvoering van scripts.

    De daadwerkelijke code voor het laden van klassen is iets complexer, maar het komt allemaal neer op de volgende code van de __load-methode in de App-klasse:

    Bingo! Door de variabele $file te vervangen, kunnen we onze eigen PHP-code toevoegen! Bovendien zal dit een echte Remote File Inclusion-bug zijn - we hebben dus geen extra trucjes nodig bij het uploaden van lokale bestanden naar de server. De auteur van het gevonden beveiligingslek biedt echter een LFI-optie om dit gat te misbruiken, omdat CakePHP een op bestanden gebaseerde lokale cache gebruikt, die zich in geserialiseerde vorm bevindt in een map die bekend is bij de aanvaller.

    Uitbuiten

    Als een kleine PoC voor het genereren van een giftige geserialiseerde string biedt felix de volgende code:

    Uiteraard moet je eerst de benodigde klassen van CakePHP opnemen. Er is ook een volledig functionele Python-exploit, die je kunt vinden op malloc.im/burnedcake.py.

    Deze exploit zou moeten werken in elke applicatie die op CakePHP is gebouwd, waarbij gebruik wordt gemaakt van POST-formulieren met beveiligingstokens, en waarin de standaardlocatie van de cachebestanden niet is gewijzigd. Standaard geeft de exploit de databaseconfiguratie weer; andere handige functies kunnen eenvoudig worden toegevoegd door de ingebouwde PHP-payload te wijzigen.

    Doelstellingen
    • CakePHP getState("fi lter_order_dir");
      $fi lter_order = JFilterInput::clean($fi lter_order, "cmd");
      $filter_order_dir =
      JFilterInput::clean($fi lter_order_dir, "woord");
      // We hebben een lijst van allemaal nodig
      // weblinks in de opgegeven categorie
      $query = "SELECTEER *" .
      "VAN #__weblinks" .
      "WAAR catid = ". (int) $dit->_id.
      "EN gepubliceerd = 1" .
      "EN gearchiveerd = 0".
      "BESTEL DOOR". $filter_order "".
      $filter_order_dir .", bestellen";
      retourneer $query;
      }

      Hier kun je zien dat de variabelen $filter_order en $filter_order_dir niet worden gecontroleerd op strikte naleving van SQL-instructies; de controle wordt alleen uitgevoerd met behulp van de standaard opschoningsmethode uit de klasse JFilterInput: