RFI (Remote File Inclusion) — та самая уязвимость, которая позволяет хакеру залить свой shell в твой блог на php-движке. За ней стоит фича, которая появилась в PHP начиная с пятой версии: автоматическая подгрузка классов. Она позволяет не включать каждый класс в скрипты через include
и require
— вместо этого применяется magic-функция autoload. С примером будет яснее.
<?php
function __autoload($class_name) {
include $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
Как видишь, здесь нет описания обоих классов. Но как только мы обращаемся к ним при создании объектов, происходит вызов __autoload
с именем неизвестного класса. Далее совершается попытка загрузить этот класс (с добавлением в конец .php). Удобная возможность.
Несмотря на то что теоретически имя класса может содержать только ограниченный набор символов (буквы, цифры, нижнее подчеркивание и слеш), до версий PHP 5.4.24 и 5.5.8 (не включительно) не имелось проверки на «нестандартные» символы, которые передавались функции autoload
. В результате если атакующий мог контролировать имя класса, то он мог выполнить в приложении классический Remote или Local File Inclusion. Для этого ему необходимо было иметь возможность передать имя класса в одну из функций (не считая передачи через оператор new
).
class_exists()
interface_exists()
method_exists()
property_exists()
is_subclass_of()
class_implements()
Это не весь перечень функций — другие проверки подвержены той же уязвимости. Вот как это работает:
Продолжение доступно только подписчикам
Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте
Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке
Вариант 2. Купи один материал
Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.
Уже подписан?