Почувствуй себя багоискателем Докучаев Дмитрий 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" русской и послать ответ. Ты убедишься в том, что скрипт отклонит твою махинацию и погрозит тебе пальчиком :). Но это так, лишняя проверка. Настало время для более серьезных действий. |