0
<< предыдущая заметкаследующая заметка >>
21 апреля 2011
Как взломать дневник

Интеллигентный вежливый лось хакер dePuff поломал мой дневник и получил админский доступ. И разместил, как некоторые заметили, свой пост: https://lleo.me/dnevnik/2011/04/05

Красота и элегантность данного хака вызывает полное умиление и восторг. Как оказалось (после объяснений dePuff) некоторые старые конфигурации PHP (сюрприз!) несут в себе опцию register_globals в состоянии on. Это очень архаичная редкая конфигурация, но на Зеноне она именно такая — очень старый хостинг, опцию здесь держат для совместимости, иначе посыпятся сайты старой выделки, которые это использовали.

В чем смысл опции? С нею все входящие переменные попадают в глобальное пространство имен. Например, переменные $_GET, $_POST, $_REQUEST, $_COOKIE. Например, стоит обратиться к скрипту как script.php?vasya=1 — и добрый PHP тут же создает тебе глобальную переменную $vasya, присваивая ей значение 1.

Я об этом понятия не имел (хотя, признаюсь, у меня были шансы догадаться — как теперь вспоминаю, один раз я лично заметил подозрительное попадание кук в глобальное пространство, но значения не придал и разбираться не стал). Поэтому переменные я не только не инициализировал, а наоборот, проверял всякие подключаемые модули именно значением переменных (как вы увидите чуть ниже).

Далее dePuff нашел в моем коде подходящий модуль /module/stat.php, начинавшийся такими словами:

<?php
if(!isset($admin_name)) die("Error 404");

$blogs="blogs.txt";

$l=file_get_contents($host_log.$blogs);

if(!isset($_GET['link'])) die("<pre>$l</pre>");

...

После чего dePuff вызвал напрямую /module/stat.php?admin_name=1&host_log=../config.php%00

Проверка на $admin_name провалилась, а $host_log с конечным символом %00 символизировало конец строки, остановив выполнение прочих строчных директив (есть у PHP и такая особенность). Так стала видна святая святых — содержимое config.php. Ну и дальше, понятно, админский доступ.

Очень красиво и очень поучительно. По словам dePuff, это заняло у него 15 минут. Глубочайший решпект перед великим мастерством!

Владельцы остальных движков могут не волноваться — я проверил, благотворная для данного хака особенность хостинга была только у меня и еще у одного человека (я с ним безуспешно пытался связаться все это время, но он не отвечал, пришлось мне самому использовать хак, чтобы обновить ему движок до последней версии — сорри за вторжение). Последняя версия движка лишена этого бага во всех файлах (я почистил всё), а чтобы наверняка отключить поганую опцию, можно добавить в .htaccess строчку:

php_flag register_globals off

Но хакера dePuff я теперь аццки боюсь, хотя он добрый, вежливый и пишет прекрасные посты ;) И вы бойтесь. Вот такая поучительная история.

Надо сказать, что за всю двухлетнюю историю развития моего движка это четвертая критическая уязвимость в коде. Одну я обнаружил сам, две — подсказали добрые люди, читавшие исходники, благо исходники открыты. Много это или мало для такого проекта, сделанного в одиночку — не знаю, думаю, что непростительно много. Обязуюсь над собой работать.

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок

Комментарии к этой заметке сейчас отключены, надеюсь на понимание.