Наверное, ты не раз
сталкивался с такой проблемой, как поиск
доступной на запись папки. Допустим, у тебя есть
sql-инъекция с file_priv, а куда заливать шелл —
пока непонятно.
Что же делать в таком случае?
К сожалению, ничего кардинального, позволяющего
со 100% вероятностью найти такую папку, нет, но
вот облегчить поиск я тебе помогу.
1. Для начала осматриваем
ресурс на наличие загрузок. Картинки, аватарки,
еще какие-нибудь файлы. Если такая возможность
существует, грузим то, что разрешено, и смотрим,
куда это сохранилось. Скорее всего, папка, в
которую мы смогли загрузить картинки, как раз и
будет доступна на запись.
2. Неплохо было бы
просканировать сайт каким-нибудь сканером
директорий и обратить внимание на такие
каталоги, как cache, caches, uploads, download,
avatars, images, tmp, temp и т.д. Вообще, такие
папки надо просматривать в первую очередь (они
присутствуют довольно часто и нередко как раз
доступны на запись ). Вот парочка
онлайн-сканеров, которые тебе в этом помогут:
3. Если сканер ничего не
обнаружил, а ресурс крутится на паблик движке,
то можно скачать исходник и выяснить, куда там
что грузится.
4. Особое внимание стоит
обратить на форумы (если они имеются). Если
аватары хранятся не в базе, то папка под них
также даст возможность залить шелл.
5. Если у тебя имеется
инклуд или исполнение кода, то найти директорию
под запись, конечно, гораздо проще, но многие и
тут умудряются попасть в тупик. Давай посмотрим,
что можно сделать. Допустим, у тебя eval или
preg_replace c модификатором /e. То есть, чистое
исполнение кода. Если админ нам ничего не
выключал, то у нас есть возможность выполнять
системные команды, и как ты понимаешь, мы можем
легко воспользоваться поиском. Находим в текущей
директории папки с правами на запись:
system(‘find . -perm -2 -type d -ls’);
Бывает, что какие-то функции отключены
(смотри phpinfo(), раздел disable_ functions).
Помни, что системные команды можно выполнять не
только через system(), так же отлично подходит
passthru(),shell_exec() и т.д.
6. Есть еще одна штука —
magic_quotes_gpc. Она многим портит жизнь. Если
выполнить «system(ls)» можно при любых
значениях, то «system(ls -la)» просто так не
осуществить. В этом случае многие забывают такую
классную штуку, как chr.
system('ls -lia') ===
system(chr(108).chr(115).chr(32).
chr(45).chr(108).chr(105).chr(97))
С инклудом ситуация полностью аналогична.
Допустим, у тебя LFI и возможность проинклудить
environ. Что мы делаем? Посылаем такой запрос:
file.php?file=../../../../../../../../../../../proc/
self/environ
User-Agent: <?php system(‘ls -lia’); ?>