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

PHPenetration

Zadoxlik (antichat.ru)

Хакер, номер #090, стр. 090-072-2


Однако почти всегда у аватар расширения не выходят за границы списка gif, jpg, jpeg, png, а у аттачей — zip, rar, doc. Но в переменной $ex, как правило, содержится что-то вроде .php или .inc.php. Так как же быть, если зловредный код у тебя в файле av132.gif, а расширение, прикручиваемое внутри index.php, неизвестно. В PHP есть такая вещь, как magic_quotes_gpc. Эта опция PHP разрешает слеширование (экранирование) всех входящих в запрос потенциально опасных символов. В их число входит апостроф, кавычка и другие. Вот смотри: если ты пошлешь в куках или же в GET-, POST-запросах строку antichat's_sniffer, то скрипт ее получит как antichat\'s_sniffer. Этот пасс иногда спасает криворуких программистов от взлома их скрипта. Однако опытным программистам эта функция доставляет больше хлопот, чем помощи. Как раз поэтому-то еще остались хостеры, которые не держат эту опцию включенной. Именно magic_quotes_gpc, установленная на OFF, позволит провести нам инъекцию. К числу потенциально опасных символов относится нулевой байт: он обозначает конец строки. Слеширование нулевого байта обезоруживает его, символ теряет свое значение. Однако без magic_quotes_gpc слешировать его вряд ли кто-нибудь захочет. Вот пример инъекции:

http://site.ru/index.php?id=forum/avatars/user/c20ad4d76fe97759aa27a0c99bff6710.gif%00&c=[COMMAND]

Здесь %00 - закодированный нулевой байт в формате URL. Строка, передаваемая функции include, имеет вид: forum/avatars/user/av132.gif[NULL].php. Как я отмечал выше, нулевой байт «отрезает» правую часть строки. Таким образом, прикручиваемое расширение не имеет значения, и ты можешь подставить в файл PHP фрагмент из аватары av132.gif. Правда, сейчас большинство хостеров устанавливают magic_quotes_gpc на ON, что защищает скрипты от трюка с нулевым символом. Но и на этот случай есть свои отмычки.

elseif, или что еще можно сделать

Помимо описанных выше действий, можно сотворить еще много всего, но каждый раз это зависит от конкретного примера. Допустим, у тебя есть такой фрагмент минимодульного движка.

error_reporting(0);

$ex=".php";

//$cat - папка с модулями

$umol4anie="main;

#папка с модулями#

if($_GET['cat']=='files')

$cat="files";

elseif($_GET['cat']=='docs')

$cat="docs";

else

echo "Неверный раздел";

if(@$_GET['id'])

$final=$_GET['id'];

else

$final=$umolchanie;

if(!eregi("[\.']", $final) && str_replace(chr(0),'f',$final)==$final)

include($cat."/".$final.$ex);

else

include("error404".$ex);

Здесь не проверяется существование файла. Если в GET-запросе значение параметра cat не удовлетворяет требуемым, ты, как не странно, получишь предупреждение о том, что раздел неверен. Однако дальнейшее исполнение скрипта будет продолжено. Ошибки автор скрыл через error_reporting(0), поэтому внешне выглядит, что все обработалось корректно. Я думаю, ты тоже парень не промах! Ведь можно передать в cat что-то вроде «http://othersite.ru» и положить на othersite.ru самопальный скрипт. Если на сервере включен register_globals (параметры из запроса соответствуют одноименным переменным в скрипте), то инъекция будет проведена успешно. В include (и аналоги) удаленно инъекцтировать можно не только по http, но и по ftp.

Назад на стр. 090-072-1  Содержание  Вперед на стр. 090-072-3
Hosted by uCoz