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
<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>
<p>Druhá část zranitelnosti je ve funkci mfbfw_init, která nastavení načítá do frontendu přes proměnnou $settings:</p>
<p class="image center"><img alt="" height="148" src="/media/blog/fancy2.png" width="551" /></p>
</p>
<p>$settings jsou pak použity při generování obslužného javascriptu v HTML kódu:</p>
<p class="image center"><img alt="" height="113" src="/media/blog/fancy3-2.png" width="514" /></p>
<p>Je vidět, že uložené nastavení je přímo vypsáno, tak jak jsme ho poslali.</p>
</p>
<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>
<p class="image center"><img alt="" height="103" src="/media/blog/fancy4.png" width="262" /></p>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<p>Další podobné články:</p>
<ul>
<li><a href="https://lynt.cz/blog/zranitelnost-ve-wordpress-pluginu-wp-slimstat-3-9-5/">Zranitelnost v pluginu WP Slimstat</a></li>
<li><a href="https://lynt.cz/blog/zranitelnost-ve-wordpress-pluginu-wordpress-video-gallery-2-7/">Zranitelnost v pluginu WordPress Video Gallery</a></li>
<li><a href="https://lynt.cz/blog/zranitelnost-ve-wordpress-pluginu-mail-poet-2-6-8/">Zranitelnost v pluginu Mail Poet</a></li>
<li><a href="https://lynt.cz/blog/zranitelnost-ve-wordpress-pluginu-slider-revolution-4-1-4/">Zranitelnost v pluginu Slider Revolution</a></li>
</ul>