Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #65, МАЙ 2004 г.

Почувствуй себя багоискателем

Докучаев Дмитрий aka Forb

Xakep, номер #065, стр. 065-060-3


Но, по сути, это лишь мелкая недоработка, которая даст тебе минимум дополнительных привилегий. А я уже говорил, что польза должна быть большой. Поэтому копаем дальше. Как я ни извращался (подставляя нул-бит %00 после 1 и дописывая имя к новому документу и т.п.), я не смог получить хоть какую-то нестандартную реакцию. И что-то меня подтолкнуло опять вернуться к изучению сорцов...

Второй раунд

Меня заинтересовал сценарий обработки потока. Он был выполнен в виде отдельной процедуры params(), а не стандартным CGI.pm. Открой wtbext.cgi и убедись в этом. Скудные комментарии на русском языке позволили мне немного ориентироваться в коде. Первое, что бросилось в глаза - заполнение хеша %inip. Когда я изучал wtboard.cgi, то видел, что этот хеш используется в качестве поглотителя переменных из потока. Это же имя юзалось для запоминания системных переменных. Это меня даже не насторожило, скорее удивило.

Заполнение системного хеша

# ini-данные конференции

%inip=(%inip,

addip=>'off',

adviseans=>'on',

advisenew=>'on',

allowgreetings=>'on',

allowroot=>'on',

allrestrict=>0,

alwayscity=>'off',

alwaysemail=>'off',

answerlabel=>'* ',

archive=>'archive.htm',

);

Далее я убедился, что хеш %inip действительно юзается для поглощения потока. Это доказывала строчка $inip{$a1}=$a2, где $a1 была пропарсенная переменная, а $a2 - ее значение. Несколькими строками выше я увидел регулярное выражение, которое удаляло из $a1 посторонние символы, как, например $, @, ' и прочие. Идем дальше. Вроде бы ничего интересного, а я уже дошел до середины сценария... И тут меня привлек поразительный код следующего содержания:

sub initiate

{my($s1,$s2);

while(($s1,$s2)=each%inip)

{$s2=~s/([\'\\])/\\$1/g;

eval "\$$s1='$s2';";

}

}

Грамотный программист сразу поймет назначение этой процедуры. Она интерполирует все переменные из хеша %inip в реальные. С учетом того, что этот хеш поглощает поток данных, можно попробовать подставить в него системную переменную, которая затем будет интерполирована в реальную и заменит ее прежнее значение! Но это в теории, а на практике может не подтвердиться, но, во всяком случае, попробовать стоит, тем более что я не видел никаких ограничений на новые элементы хеша.

Пробуриваем дыру

Я надеюсь, ты еще не закрыл окно форума, потому что сейчас самое время протестировать уязвимость. Для этого подставим какую-нибудь системную переменную в качестве дополнительного параметра, например, $data. Дописывай &data=/ в строку браузера и жми enter. Получаем довольно нестандартное сообщение: "Error: cannot open user base //wtbnames.txt.*". В общем-то, все верно, сценарий интерполировал переменную $inip{data} в реальную $data и заменил ее значение корневым каталогом. Таким образом, скрипт попытался открыть $data/wtbnames.txt.* и обломался :). Такая вот чудесная интерполяция, товарищи. Кто-то, наверное, уже стал возмущаться: ну заменили мы одну переменную, и что с того? Я отвечу, что для более осязаемого результата необходимо включить соображалку и составить свой собственный алгоритм, после применения которого цель будет достигнута. В этой статье я покажу, как с помощью данной интерполяции писать сообщения на форум от определенного логина, не зная его пароля. В теории это в принципе невозможно, так как даже подстановка похожих русских букв проверяется и заменяется родными английскими. Но прежде чем составлять хакерский алгоритм, я упомяну о принципе работы аутентификации форума. Все юзеры вписываются в единую текстовую базу cgi-bin\wtb\data\wtbnames.txt.pag. В более ранних версиях это был просто wtbnames.txt, но сути это не меняет. Все данные по новому логину заносятся туда. Это происходит в случае регистрации (получения первой мессаги от определенного имени). После каждого поста проверяется пароль для указанного логина. Если он неверный - сообщение не размещается. Наша задача обойти такую проверку. Обходить будем следующим путем: переопределим переменную $wtbnames на произвольное значение. К примеру, на ../../../../../../wtbnames.txt. Важно помнить, что открывать скрипт будет $data$wtbnames, а не просто $wtbnames. Видно, что после такой пластической операции сценарий будет обращаться к f:/soft/web/apache/cgi-bin/wtb/data/../../../../../../wtbnames.txt, что соответствует /wtbnames.txt. Все эти изощрения связаны с тем, что переменную $data нельзя менять, так как в этом случае скрипт не сможет открыть конфигурационный файл wtboard.txt. Приступим к действию. Вначале зарегистрируйся под новым пользователем xakep с паролем xak. Отправь от него какое-нибудь сообщение (например, "hacked!!!"). Теперь попробуем создать ответ на это сообщение, якобы не зная пароля хакера. Прежде чем читерить, попробуй заменить в логине xakep букву "e" русской и послать ответ. Ты убедишься в том, что скрипт отклонит твою махинацию и погрозит тебе пальчиком :). Но это так, лишняя проверка. Настало время для более серьезных действий.

Назад на стр. 065-060-2  Содержание  Вперед на стр. 065-060-4