Articles

Oprava chyby WordPressu: „Volání nedefinované funkce get_header()“

♦ Posted by Jeff Starr in PHP, Zabezpečení
January 11, 2019

Pozoruji velký nárůst útoků botů zaměřených přímo na soubory témat. Nejprve získají adresu URL do adresáře vašeho tématu. Existuje mnoho způsobů, jak může bot tuto informaci získat. Například většina témat obsahuje aktiva, jako jsou soubory CSS a JavaScript, a odkaz obsahuje celou adresu URL. Jakmile tedy získají adresu URL motivu, budou zlí boti provádět přímé požadavky na známé soubory šablon motivů, například index.php a header.php. Přímé vyžádání souborů šablon může odhalit možné chyby zabezpečení, což je zřejmě stále oblíbenější vektor útoku. Vyvolává také chyby typu „Volání nedefinované funkce get_header()“ (a podobné). Naštěstí existuje snadná náprava.

Je váš web terčem útoku?

Chcete-li zjistit, zda je váš web zasažen přímými požadavky na soubory šablony, můžete zkontrolovat protokoly přístupů/chyb webu. Zde je několik příkladů z mých vlastních protokolů, které by měly pomoci ukázat, na co se zaměřit:

Poznámka: V následujících záznamech protokolů jsou všechny cesty k souborům změněny na příkladové adresy URL, aby se zabránilo procházení a hlášení chyb společností Google. Ve skutečných souborech protokolu chyby obsahují cesty k souborům, nikoli adresy URL. P.S. Je nanejvýš směšné, že robot Google prochází informace o cestách v prostém textu, neméně uvnitř značek <pre>.
2018-12-30 17:54:07 ErrorAH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function get_header() in https://example.com/wp-content/themes/digwp/index.php:1Stack trace: #0 {main} thrown in https://example.com/wp-content/themes/digwp/index.php on line 1'2018-12-30 12:53:55 ErrorAH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function get_header() in https://example.com/wp-content/themes/digwp/404.php:1Stack trace: #0 {main} thrown in https://example.com/wp-content/themes/digwp/404.php on line 1'2018-12-30 12:53:55 ErrorAH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function esc_url() in https://example.com/wp-content/themes/digwp/header.php:8Stack trace: #0 {main} thrown in https://example.com/wp-content/themes/digwp/header.php on line 8'

Jestliže je tedy váš web cílem útoků s přímým šablonováním, uvidíte HODNĚ těchto typů chyb. V těchto příkladech se jedná o požadavky na index.php, 404.php a header.php. Z mých analýz vyplývá, že většina požadavků na šablonu se týká těchto tří souborů, ale můžete se setkat i se skenováním dalších známých souborů WordPressu, například:

/archive.php/wp-includes/rss-functions.php ..various theme template files..various files in the WP Media Library

V zásadě platí, že jakýkoli přímý požadavek na soubor jádra, tématu nebo zásuvného modulu WordPressu s největší pravděpodobností vyvolá chybu, pokud nejsou předem přijata vhodná opatření. Později se například podíváme na jednoduchý způsob, jak zastavit chybu „nedefinované funkce“, což zase pomůže ušetřit drahocenné prostředky serveru a zlepšit celkové zabezpečení webu.

Pochopení chyby

Takže jak je to s fatálními chybami „volání nedefinované funkce“? Dochází k nim proto, že jádro WordPressu není načteno pro přímo načtené soubory šablon.

Příklad pokud si přímo vyžádáte soubor header.php, žádné funkce jádra, jako například esc_url(), nejsou k dispozici, protože soubor je vyžádán mimo WordPress.

Co se stane, když neuděláte nic? No, vaše téma již může mít implementovanou podobnou techniku, nebo také ne. Jaké je riziko? V závislosti na tom, jak je vaše téma nakódováno, může být možné, že špatní aktéři spustí kód mimo kontext, což může odhalit potenciální vektory útoku.

Jak opravit

Nejjednodušší způsob, jak zabránit tomuto typu chyby, je jednoduše ukončit skript, pokud WordPress není k dispozici. Jedná se o starou, ale účinnou techniku PHP, která se používá k zamezení přímého přístupu k souboru:

<?php if (!defined('ABSPATH')) exit; ?>

Jednoduše říká: Pokud není definována konstanta ABSPATH, ukončete skript. To funguje, protože ABSPATH je definována pouze při načítání WordPressu. Takže když přijde zlý bot a začne požadovat šablony vašeho tématu, jednoduše dostane od serveru prázdnou stránku (prázdnou odpověď).

Při svých cestách WordPressem jste se možná s podobným kódem setkali. Zabránění přímému přístupu ke skriptům je důležitou součástí zabezpečení PHP. Nechcete, aby útočníci/boti spouštěli skripty mimo kontext, když k tomu nejsou oprávněni a podobně.

Příklad

Pro implementaci této techniky otevřete všechny soubory témat, které jsou cílem, a na začátek souboru vložte řádek. Například mnoho šablon témat obsahuje hlavičku před jakýmkoli jiným kódem, vypadá takto:

<?php get_header(); ?>

Po přidání úryvku „bez přímého přístupu“ budete mít něco jako:

<?php if (!defined('ABSPATH')) exit;get_header(); ?>

Jakkoli se rozhodnete kód formátovat, je to v pořádku, jde o to, abyste řádek ABSPATH zahrnuli před voláním jakýchkoli jiných funkcí.

Profesionální tip: Chcete zastavit další zlé roboty? Podívejte se na můj bezplatný doplněk pro WordPress Blackhole for Bad Bots, který je k dispozici v adresáři zásuvných modulů WP.

Bonus

Chcete-li jít ještě dál, můžete citlivé informace o souborech chránit zakázáním zobrazení adresářů. Pokud například v prohlížeči navštívíte nadřazený adresář svého tématu, co uvidíte? Pokud jsou povolena zobrazení adresářů, zobrazí se propojený seznam všech souborů. To není dobré. Měli byste vidět buď prázdnou bílou obrazovku, nebo nějakou jinou odpověď serveru. Víte, abyste mohli informace o svých souborech udržet v bezpečí.

Existuje řada způsobů, jak zobrazení adresářů zakázat. Způsob pro WordPress je vytvořit nový (prázdný) soubor index.php v tom adresáři, který chcete chránit.

Důležité! Nový soubor index.php vytvářejte pouze v případě, že v adresáři již žádný neexistuje. To znamená, že nepřepisujte žádné existující indexové soubory.

Poté do adresáře index.php přidejte následující kód:

<?php // Silence is golden.

Jádro aplikace WordPress používá tuto techniku v různých adresářích. Zakázáním zobrazení otevřených adresářů zabráníme útočníkům získat informace o tom, které soubory na serveru existují. Prospívá to tedy bezpečnosti a je to doporučený postup pro všechny veřejné adresáře, pokud to nemáte ošetřeno pomocí .htaccess, nebo snad nemáte důvod postupovat jinak a nechat pohledy pro konkrétní adresář povolené.

Závěrečné myšlenky

Jednoduché techniky popsané v tomto článku jsou osvědčenými bezpečnostními opatřeními, která zabrání nebezpečnému spouštění kódu a zabrání tomu, aby chyby plnily vaše protokoly. To znamená lepší výkon a zabezpečení vašeho webu. I když se nesetkáváte s typem chyb popsaných v tomto článku, ochrana souborů tématu a zásuvných modulů před přímým přístupem je pro bezpečnost dobrá.

Jeff Starr

O autorovi
Jeff Starr = Designer. Vývojář. Výrobce. Spisovatel. Editor. atd.

.