Zranitelnost ve WordPress pluginu Fancybox-for-WordPress 3.0.2

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

Tato chyba vznikla obdobně jako chyba ve známém pluginu Mail Poet, která se objevila v létě - neošetřením hooku admin_init (příp. is_admin) + neošetřením potenciálních uživatelských vstupů.

Hook admin_init je se spouští při jakékoliv manipulaci s administrací, může být aktivován i voláním admin-post.php/admin-ajax.php - tento soubor může zprostředkovávat volání z frontendu do administrace pomocí formulářů nebo JavaScriptů v případě admin-ajax.php. V případě pluginu Mail Poet byl problém prakticky stejný.

Zdrojový kód zranitelné verze pluginu FancyBox for WordPress vypadá takto:

Vidíme zde funkci mfbfw_admin_options. Zde se načítá z tabulky prefix_options nastavení pojmenované mfbfw. Dále se testuje, zda byl předán v URL parametr page a zda obsahuje hodnotu fancybox-for-wordpress. Dále je zde parametr action, který může mít hodnotu update a reset. Update je pro nás zajímavý, protože trvale ukládá zaslané nastavení.

"Ochrana" uživatelského vstupu je zde udělána tak, že se na celé předané pole $_POST['mfbfw'] aplikuje PHP funkce stripslashes, která odstraňuje zpětná lomítka. Spíše než pro ochranu je to zde z důvodu odstranění zpětných lomítek, které do řetězců automaticky přidávají při zapnuté direktivě magic_quotes_gpc. Dále je všechny prvky pole již uložené v settings použita wordpress funkce convert_chars. Tato funkce opravuje některé neplatné Unicode znaky, odstraňuje tagy a <category>, nahrazuje opuštěné & za & a převádí některé nepárové tagy na validné XHTML tvar (<br /> na  <br />). Nelze tedy také hovořit o ochraně.</p><br /> <p>Funkce mfbfw_admin_options je spouštěna v hooku admin_init, který se spouští při práci s administrací - pokud tedy zavoláme metodou POST například admin-ajax.php?page=fancybox-for-wordpress, dojde k aktivaci a uložení námi zaslaných hodnot do nastavení.</p><br /> <p>Druhá část zranitelnosti je ve funkci  mfbfw_init, která nastavení načítá do frontendu přes proměnnou $settings:</p><br /> <p class="image center"><img alt="" height="148" src="/media/blog/fancy2.png" width="551" /></p><br /> </p><br /> <p>$settings jsou pak použity při generování obslužného javascriptu v HTML kódu:</p><br /> <p class="image center"><img alt="" height="113" src="/media/blog/fancy3-2.png" width="514" /></p><br /> <p>Je vidět, že uložené nastavení je přímo vypsáno, tak jak jsme ho poslali.</p><br /> </p><br /> <p>Pokud si tedy při dotazu na příslušnou adresu s pošleme mfbfw[padding]=Ahoj, tak ve vygenerovaném kódu pro uživatele uvidíme toto:</p><br /> <p class="image center"><img alt="" height="103" src="/media/blog/fancy4.png" width="262" /></p><br /> <p>Řetězec "Ahoj" je nyní uložen v databázi a ve zdrojovém kódu ho najdou všichni uživatelé. "Ahoj" žádnou škodu nezpůsobí, ale pokud by zaslaný řetězec vypadal například </script><script>zlá_funkce()</sript>, tak první uzavírací tag ukončí provádění skriptu (původní skript bude špatně ukončen = nebude fungovat, ale to útočníkovi nevadí), následuje správě otevřen a uzavřen zlý skript a zbytek původního skriptu opět útočníka nezajímá. Setkal jsem se škodlivými funkcemi, které do stránek vkládaly iframy, ale i s nebezpečnějšími skripty typu Beef.</p><br /> <p>Autoři ve verzi 3.0.3 provedli úpravu, že z této části kódu odstranili action='update' a pro action='reset' testují, zda požadavek přišel z příslušné stránky administrace - check_admin_referer( 'mfbfw-options-reset' ) - tato funkce nekontroluje pouze HTTP_REFERER (ten lze zfalšovat), ale testuje i správnou hodnotu <a href="http://codex.wordpress.org/WordPress_Nonces">wp_nonce</a> - zda byl formulář opravdu zaslán z administrace WP.</p><br /> <p>Vzhledem k populárnosti tohoto pluginu - má více než půl milionu stažení - se jedná bezpečnostní chybu s velmi velkým dopadem.</p><br /> <p>Pokud tedy používáte FancyBox  for WordPress (otevřete zdrojový kód stránky v prohlížeči a zkuste vyhledat řetězec Fancybox for WordPress, který bude v komentáři s verzí pluginu), zkontrolujte verzi a pokud není alespoň 3.0.3, okamžitě aktualizujte!</p><br /> <p>Nejčastěji jsem se setkal s tím, že útočník do kódu vkládá odkaz na nebezpečný flash soubor:</p><br /> <p class="image center"><a class="colorbox" href="/media/blog/napadeny-web.png"><img alt="" height="300" src="/media/blog/.small/napadeny-web.png" width="360" /></a></p><br /> <p>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 <a href="/web/wordpress">správu a aktualizace WordPress</a>u.</p><br /> <p>Pro zdokonalení vaší práce s WordPressem můžete také přijít na konferenci<a href="http://prague.wordcamp.org/2015/prednasejici/"> Wordcamp Praha 2015</a>, která se koná 28.2. v Praze.</p><br /> <p>Další podobné články:</p><br /> <ul><br /> <li><a href="https://lynt.cz/blog/zranitelnost-ve-wordpress-pluginu-wp-slimstat-3-9-5">Zranitelnost v pluginu WP Slimstat</a></li><br /> <li><a href="https://lynt.cz/blog/zranitelnost-ve-wordpress-pluginu-wordpress-video-gallery-2-7">Zranitelnost v pluginu WordPress Video Gallery</a></li><br /> <li><a href="https://lynt.cz/blog/zranitelnost-ve-wordpress-pluginu-mail-poet-2-6-8">Zranitelnost v pluginu Mail Poet</a></li><br /> <li><a href="https://lynt.cz/blog/zranitelnost-ve-wordpress-pluginu-slider-revolution-4-1-4">Zranitelnost v pluginu Slider Revolution</a></li><br /> </ul>

Štítky: ,

Napsat komentář

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


Lynt services s.r.o

Již 8 let vytváříme efektivnější kampaně, zrychlujeme weby a řešíme jejich bezpečnost. Kombinujeme marketing, vývoj a automatizaci.
poptávka služeb
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram