Большая дыра в маленьком форуме Master-lame-master Xakep, номер #066, стр. 066-048-2 Первые успехи Недолго думая, взломщик скопировал wtbadmin.txt, находящийся в cgi-bin/data, в корень диска c:\. После этого нехитрого действия он подставил в запрос к wtbedit.cgi (полный листинг смотри выше) строчку «&data=../../../../../../..» и получил форму администрирования. Вот только все значения параметров были покоцанными. Это объяснялось инкапсуляцией $data, поскольку, помимо wtbadmin.txt, в data/ находились и другие файлы конфигурации, к которым по понятным причинам сценарий не смог обратиться. Но хакер был почти у цели. Подправив переменную на wtbadmin и дописав “../wtbadmin.txt” в значение, взломщик наконец-то получил полноценный доступ к администраторской панели. Но этот вариант взлома прокатывал, только если у хакера существует локальный доступ на сервер. При текущем раскладе никакого акцесса не было, поэтому взломщик продолжал думать. Бегло проанализировав ситуацию, наш герой начал усердно вспоминать, в какие файлы он может записать информацию. Дело в том, что если хакер каким-то образом создаст файл со строкой вида “admin;;admin;;a” и скормит его имя в переменную $wtbadmin, то функция verifyadmin() честно пропарсит конфиг и допустит взломщика к скрипту администрирования. Вначале у сетевого партизана созрела идея написать публичное сообщение и оставить параметры для функции в обычном html-документе, однако этот способ не прокатил (да и палить себя никакого желания не было). Но потом, после тщательного просмотра каталога data/, взломщик обнаружил занятный журнал под названием wtwrong.txt. Открыв его, хакер понял, что в этот лог заносятся сведения о неудачных попытках обращения к админскому интерфейсу. Ничего странного в этом не было, если бы не приятный синтаксис журналирования. Он выглядел следующим образом: BDADM FID=0; Time=23:56:15 20/03/2004; Log=root; Pwd=root; Host=127.0.0.1; Email=; Misc= Захват борды После минутного размышления злоумышленник догадался, что после «FID=» следует не что иное, как идентификатор борды. На практике подтвердилось, что fid может принимать не только числовое, но и символьное значение. Пожалуй, хакер располагал всеми данными и был готов к применению собственного алгоритма. Злоумышленник решил задать значение fid равным «root;;root;;a;;». Действительно, после этого в логе зарисуется строчка «BDADM FID= root;;root;;a;;...», скушав которую, verifyadmin() даст полный доступ к администрированию. Чтобы создать лог в общедоступном месте, взломщик должен всего-навсего задать значение data равным «../../../../../../tmp» (чем больше «../», тем лучше ;)). В итоге, наш герой обошелся двумя простыми запросами и получил доступ к wtbedit.cgi. Вот они: http://www.sonet.to/cgi-bin/wtb/data?fid=root;;root;;a;;&oper=admininterface&login=root&pass=root&data=/tmp; http://www.sonet.to/cgi-bin/wtb/data?fid=root;;root;;a;;&oper=admininterface&login=BDADM FID=root&pass=root&wtbadmin=../../../../../../../../../../../../tmp/wtwrong.txt. Для тех, кто в танке, еще раз объясню: первый запрос создает свежий лог в /tmp с одной-единственной строкой известного содержания. Второй реквест подменяет переменную wtbadmin, устанавливая ее значение равным пути к этому логу. В итоге функция-парсер получает в качестве логина «BDADM FID=root», а в качестве пароля «root» и допускает хакера к админке. |