Zranitelnost ve WordPress pluginu WordPress Video Gallery 2.7

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

SQL injection ve WordPress Video Gallery byla možná díky nedotaženému ošetření vstupů, přestože na něj vývojář evidentně myslel. Chyba byla ukrytá v souboru videogalleryrss.php, který má za úkol připravit RSS kanál s videi.

switch ( $type ) {

    case 'video':

        $thumbImageorder = 'w.vid ASC';

        $vid             = filter_input(INPUT_GET,'vid');  

        $where           = 'AND w.vid ='.$vid;

        $TypeOFvideos    = $contusOBJ->home_thumbdata( $thumbImageorder , $where , $dataLimit );

    break;

}

Pomocí funkce filter_input do proměnné $vid načteno ID požadovaného videa a je dále posláno v proměnné $where do funkce home_thumbdata(). Můžeme si všimnout, že autor používá funkci filter_input, nicméně je zde použita bez dalších volitelných parametrů a prakticky tedy nic nedělá (odpovídá to tedy $vid = $_GET['vid']). Funkci home_thumbdata() můžeme najít v souboru front/controllers/videohomeController.php, kde jsou parametry přímo předány funkci get_thumbdata():

function home_thumbdata( $thumImageorder, $where, $dataLimit ) {            

            return $this->get_thumdata( $thumImageorder, $where, $dataLimit );

        }

V souboru front/models/videohome.php nalezneme funkci get_thumbdata(), kde jsou předané parametry přímo vloženy do SQL dotazu:

public function get_thumdata($thumImageorder, $where, $dataLimit) {

            $query = 'SELECT distinct w.*,s.guid,s.ID,p.playlist_name,p.pid,p.playlist_slugname 
                    FROM ' . $this->_videoinfotable . ' w
                    LEFT JOIN ' . $this->_wpdb->prefix . 'hdflvvideoshare_med2play m ON m.media_id = w.vid

                    LEFT JOIN ' . $this->_wpdb->prefix . 'hdflvvideoshare_playlist p ON p.pid=m.playlist_id

                    LEFT JOIN ' . $this->_wpdb->prefix . 'posts s ON s.ID=w.slug

                    WHERE w.publish=1 AND p.is_publish=1 ' . $where . ' GROUP BY w.vid
                    ORDER BY ' . $thumImageorder . ' LIMIT ' . $dataLimit;
                    echo $query;

            return $this->_wpdb->get_results ( $query );

        }

Co to tedy může způsobit?

Pokud se použije šikovný dotaz na RSS kanál, lze získat z databáze zajímavé informace. Místo platného ID můžeme zadat takové, které víme, že neexistuje (např. -1), připojit si do dotazu vlastní union select se správným počtem sloupců a zakomentovat zbytek dotazu:

/wp-admin/admin-ajax.php?action=rss&type=video&vid=-1 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39 FROM wp_users ;--

Výsledkem je nám XML, kde již stačí vypsaná čísla nahradit za pole, která nás zajímají:

Lze tak jednoduše získat uživatelská jména, e-mailové adresy a hashe uživatelských hesel, které lze pak možné lámat hrubou silou bez dotazů na webové stránky. Ve verzích WordPressu pod 3.7 byla velmi populární změna hesla uživatele útočníkem díky funkci obnovení hesla - útočník jednoduše požádal o změnu hesla a z databáze si tímto způsobem získal user_activation_key (který regulérnímu uživateli přišel e-mailem) a díky tomu mohl heslo změnit a přihlásit se a založit si svého admin uživatele. V novějších verzích je tento klíč již šifrovaný.

Jak byla chyba opravena?

Autor vydal novou verzi 2.8 a opravil chybu lepším ošetřením onoho vstupu:

//videogalleryrss.php řádek 47

$vid             = intval(filter_input(INPUT_GET,'vid')); 

Tímto způsobem zajistí, že se do proměnné nedostane nic jiného, než celé číslo.

Druhá možnost ošetření mohla být pomocí parametru FILTER_SANITIZE_NUMBER_INT funkce filter_input. Odlišné od intval je to, že pouze odstraňuje nečíselné znaky - pro vstup 05.5e vrátí intval 5 a filter_input 055.

Pokud se podobná chyby v některém pluginu objeví, velmi rychle ji začnou zneužívat zlí boti. Alespoň základní obranou proti těmto masivním automatizovaným je změna defaultního prefixu databáze WordPressu _wp. Tím jednoduchý útok robota selže, nicméně živý útočník si zvládne prefix zjistit dotazy do information_schema.columns.

Nejedná se o první chybu v tomto pluginu, v lednu 2015 byla v tomto pluginu zranitelnost typu LFI , která dovolovala útočníkovi stáhnou libovolný zdrojový soubor na webu - např. wp-config.php (podobně jako kritická chyba v pluginu Slider Revolution).

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