Stará zranitelnost WordPress pluginu Slider Revolution 4.1.4

✍️ Vláďa Smitka
📅 21. 02. 2015

Slider Revolution je jedním z nejpopulárnějších prémiových pluginů na CodeCanyon. Díky své popularitě je velmi často zahrnován i do různých prémiových šablon (např. X Theme, The7, Newspaper). Plugin ve starších verzích neměl možnost jednoduché aktualizace a to je důvod, proč ho stále často nalézáme v jeho starších verzích. Pokud byl součástí prémiové šablony, tak pro jeho aktualizaci je třeba aktualizovat celou šablonu. Bohužel autoři šablon své straší šablony často zanedbávají. Palčivějším problémem však jsou tvůrci webů, kteří upravují samotnou zakoupenou šablonu a update tak ani není možný... Správný postup by měl být vytvořit zděděnou šablonu (child theme) a v ní úpravy provádět - rodičovskou je tak možné stále udržovat aktualizovanou. Za závažnost důsledků chyby v tomto pluginu může samozřejmě i to, že díky své oblíbenosti je asi jedním z nejvíce nelegálně používaných pluginů.

Pokud vám tvůrce webu řekne, že nesmíte svůj web aktualizovat, je něco špatně!

Zranitelné jsou verze pluginu 4.1.4 a nižší. Jakou verzi používáte můžete zjistit několika způsoby:

a) z informací ve správci pluginů:

b) z patičky v nastavení RevolutionSlideru, zde najdete i možnost provést update pluginu ručně nahráním zip souboru s novou verzí:

c) z changelogu pluginu:

http://domena/wp-content/plugins/revslider/release_log.txt

u novějších verzí:

http://domena/wp-content/plugins/revslider/release_log.html

Někdy také není plugin ve složce revslider, ale revolution-slider, případně podobných.

Chyba typu LFI způsobuje, že útočník může získat libovolný (zdrojový) soubor z vašeho webu - nejčastěji wp-config.php, kde získá přihlašovací údaje do databáze a šifrovací klíče. Pokud je webhosting špatně zabezpečen, může získat citlivé informace i z dalších webů na hostingu. Není to jediná chyba, které se v tomto pluginu objevila, do verze 3.0.95 mohl útočník nahrát na server libovolný soubor a tím web zcela ovládnout. Obě chyby vycházejí z podobné příčiny - špatné ošetření vstupů a zpřístupnění některých funkcí i neprivilegovaným uživatelům.

Čím je chyba způsobena?

Podívejme se tedy na to, čím byla chyba ve verzích 4.1.4 a nižších způsobena. Ze zdrojových kódů jsem získal celý řetězec funkcí a očistil je od kódu, který pro nás nyní není podstatný:

//inc_php/framework/base_admin.class.php - řádek 30

public function __construct($mainFile,$t,$defaultView){

  self::addActionAjax("show_image", "onShowImage");

}
//inc_php/framework/base_admin.class.php - řádek 457

protected static function addActionAjax($ajaxAction,$eventFunction){
  self::addAction('wp_ajax_'.self::$dir_plugin."_".$ajaxAction, $eventFunction);

  self::addAction('wp_ajax_nopriv_'.self::$dir_plugin."_".$ajaxAction, $eventFunction);

}


//inc_php/framework/base.class.php - řádek 263
public static function onShowImage(){

  $imageView->showImageFromGet();

}

//inc_php/framework/image_view.class.php - řádek 542
public function showImageFromGet(){

  $imageFilename = UniteFunctionsRev::getGetVar("img");

  $this->showImage($imageFilename,$maxWidth,$maxHeight,$type);
}


//inc_php/framework/base.class.php - řádek 294
protected static function getGetVar($key,$defaultValue = ""){

  $val = self::getVar($_GET, $key, $defaultValue);

  return($val);

}

//inc_php/framework/base.class.php - řádek 319
protected static function getVar($arr,$key,$defaultValue = ""){

  $val = $defaultValue;

  if(isset($arr[$key])) $val = $arr[$key];

  return($val);

}


//inc_php/framework/image_view.class.php - řádek 468
private function showImage($filename,$maxWidth=-1,$maxHeight=-1,$type=""){

  $filepath = $this->pathImages.$filename;

  $this->outputImage($filepath);

}


//inc_php/framework/image_view.class.php - řádek 142
private function outputImage($filepath){

  $contents = file_get_contents($filepath);

  echo $contents;

}

Plugin funguje tak, že ve svém konstruktoru volá funkci svojí addActionAjax, kde si registruje na "klíčové slovo" show_image  ajaxové volání funkce onShowImage. Můžete si všimnout, že funkce addActionAjax registruje volání jak v privilegovaném módu (z administrace), tak z frontendu webu pro běžné uživatele. Tímto způsobem vznikla předchozí chyba, která zaregistrovala volání revslider_ajax_action, pomocí kterého bylo možné přes parametry client_action = update_plugin a update_file =  nahrávaný soubor nahrát do webu soubor libovolnému uživateli díky registraci pomocí wp_ajax_nopriv.

Plugin tedy pomocí ajaxu zavolá funkci onShowImage. V této funkci je volána další funkce showImageFromGet(), která má jméno obrázku z GET parametru img dodaného v adrese. Jak to provede můžete vidět ve funkcích  getGetVar() a getVar(), kde není žádné ošetření vstupů.  Jméno obrázku je dále předáno funkci showImage(). Ta složí celou cestu k obrázku na serveru a zavolá funkci outputImage(), které předá cestu k souboru, který je následně přímo načten a pomocí echo vypsán uživateli. Ani zde není žádná kontrola, zda se se opravdu jedná o obrázkový soubor.

V důsledku toho lze tento plugin vrátí při dotazu

http://domena /wp-admin/admin-ajax.php?action=revslider_show_image&img=../wp-config.php

celý konfigurační soubor, díky kterému může útočník získat přístup do databáze.

Co dělat pokud máte zranitelnou verzi Slider Revolution?

  • Aktualizujte na novou verzi. Pokud máte SliderRevolution integrovaný v šabloně, aktualizujte jí. Pokud jste provedli úpravy v originální šabloně a update není možný, tak stáhněte aktuální verzi a najděte v ní soubory slider revolution, které nahraďte ve své verzi. Pokud update není k dispozici, kupte si licenci pro Slider Revolution zvlášť a soubory ve vaší šabloně. Pokud nemáte přístup k aktualizacím, požádejte svého tvůrce webu, ať vám zašle aktualizované soubory - neměl by pro něj být problém stáhnout je z CodeCanyon/ThemeForest, odkud má licenci.
  • Změňte heslo do databáze - nemůžete si být jistí, že nikdo zranitelnost nezneužil. Nové údaje vyplňte v souboru wp-config.php.
  • Změňte šifrovací klíče ve wp-config.php. Na adrese https://api.wordpress.org/secret-key/1.1/salt/ si nechte vygenerovat nové a nahraďte jimi příslušnou sekci ve wp-config.php. Pomocí těchto klíčů by mohl být útočník schopen vygenerovat si cookie pro trvalé přihlášení do administrace. Změna klíčů způsobí, že všichni uživatelé, kteří zapnuli trvalé přihlášení se budou muset přihlásit znovu.
  • Zkontrolujte, zda nejsou vytvořeni noví uživatelé, které neznáte - útočníci si často vytváří vlastní administrátorský účet, který má podobné jméno jako jiný uživatel, nebo je uživatelské jméno např. pouze mezera.
  • Nechte si proskenovat web, zda v něm není škodlivý kód, např. pomocí Sucuri Site Check.

Pokud je pro vás bezpečnost Vašeho WordPress webu důležitá a nechcete se o ni starat sami, můžete nás poptat na správu a aktualizace WordPressu.

Pro zdokonalení vaší práce s WordPressem můžete také přijít na konferenci Wordcamp Praha 2015, která se koná 28.2. v Praze.

Další podobné články:

Štítky: ,

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *


Lynt services s.r.o

Již 11 let vytváříme efektivnější kampaně, zrychlujeme weby a řešíme jejich bezpečnost. Kombinujeme marketing, vývoj a automatizaci.
poptávka služeb