![]() |
Пишем Php скрипты без багов
Пишем PHP скрипты без багов.
Автор: Dr.Z3r0 Написанно специально для antichat.ru 0.INTRO Для начала хотелось бы рассказать вкратце о чем эта статья. В этой статье будут описаны все функции неверное использование которых может привести к уязвимостям в ваших скриптах, также будут рассмотрены функции которые могут защитить от уязвимостей, к каждому пункту буду стараться приводить самый простой пример. Здесь не будут рассмотрены любые шаманства с php.ini, .htacsess-ами и прочее так это совсем другая тема. Для усвоения данной информации вам бы не помешало бы иметь следующее: что нибудь в голове (имеется ввиду серое вещество, а не пустота ;) ), знание PHP и желательно прямые руки. Ну что же начнем… 1.SQL injection Опасные функции: mysql_query() mssql_query() и др. Описание: Сейчас многие скрипты будь то форумы, гостевые, портальные системы в своем большинстве при работе используют базы данных (Чаще всего MySQL, MsSQL, PostgreSQL, OracleSQL). Принцип этой работы основывается на запросах к этой БД. Что то типа SELECT * FROM tables WHERE column='[value]'. Так вот SQL injection это бага при котором взломщиком модифицируется оригинальный запрос к БД таким образом чтобы при выполнении запроса была выведена нужная ему информация из БД. Рассмотрим пример: Код:
<?phpКод:
SELECT * FROM news WHERE id='-1' UNION SELECT 1,login,password,4,5,6 FROM admins /* 'Защита: Использовать функцию mysql_escape_string() Пример: Код:
<?php2. PHP-including Опасные функции: include() include_once() require() require_once() Описание: Данные функции позволяют включить в тело выполняемого скрипта какой нибудь файл с php-кодом. Отсутствие фильтрации либо плохая фильтрация символов может привести к так называемому инклудингу файлов. Пример: Код:
<?phpЗащита: Самое простое это функция basename(). Она извлекает из пути файла его имя. Плюс, не побоюсь этого слова, обрезание расширения, либо удаление точки. Пример: Код:
<?phpОпасные функции: fopen() file() readfile() show_source() highlight_file() Описание: Ну думаю понятно что это за бага из ее названия ;). Рассмотрим пример: Код:
<?phpЗащита: Тоже самое как и при инклудинге: Код:
<?phpОписание: Все что называется данной багой рассмотреть просто не возможно, но некоторые вещи я опишу. Очень часто программисты допускают "детские" уязвимости, например после прохождения авторизации в адресную строку дописывается переменная которая говорит о том что пользователь успешно прошел авторизацию и в остальных скриптах проверяется существует ли такая переменная, например http://site/script.php?auth=1. Разумеется так делать нельзя. Либо вот такая ошибка: Код:
<?phpОчень часто встречаются незапароленные админки, которые почему-то запрещены к индексации поисковиками в файлике robots.txt. Это не значит, что не надо вписывать незапароленные админки в этот файлик, это значит, что нужно писать авторизацию. Люди не ленитесь пишите проверку на авторизацию! Не так уж это и сложно… 5. Выполнение произвольного кода в командной строке. Опасные функции: exec() shell_exec() system() passthru() Описание: Очень-очень редкая бага встретить практически которую просто невозможно. Блин даже придумать не могу как и где ее можно использовать. Но думаю понятно к чему это может привести. Защита: Использовать функцию escapeshellcmd(). 6. Выполнение php кода Опасные функции: eval() Описание: Ну как вам известно эта функция интерпретирует переданный ей параметр как php код. Ну вот допустим пример (функция для объявления переменных если register_globals=off, еле-еле придумал что сюда можно написать ;) ): Код:
<?phpЗащита: Использование слеширования опасных символов функцией addslashes(). Пример: Код:
<?phpОписание: Данная уязвимость возникает при загрузки файла на сервер при отсутствии, либо неполной фильтрации типа загружаемого файла. Например: Код:
<?phpЛибо проверка присутствует но она проходит по его mime типу получаемому от браузера который можно легко подделать. Пример Код:
<?phpРешением будет использование вот такого кода: Код:
<?phpХотелось бы сказать поподробнее о двойных расширениях. Дело в том что файл blaa.php.rar будет интерпретирован как php-файл если последнее расширение не внесено в mime.types. Только к сожалению данный способ не спасет от загрузки php кода с разрешенным расширением, что при наличии инклудинга может привести к взлому вашего сайта. 8. Раскрытие пути Описание: Данную багу трудно назвать багой, но это порой необходимая вещь при взломе. Благодаря ей взломщик может узнать путь от корня сервера до папки где находится сайт. Собственно возникает она при отображении ошибок. Защита: В самом начале скрипта вписать error_reporting(0); скроет отображение всех ошибок, причем лучше писать сам код скрипта так чтобы никаких ошибок не появлялось, а эту директиву вписывать на всякий случай. 9. Перезапись переменных Опасные функции: import_request_variables() extract() parse_str() Описание: Эти функции - почти замена включенной директиве register_globals. И все они позволяют переписать любые переменные объявленные раньше будь то простая переменная либо переменная из массивов _SESSION, _SERVER и т.д. Что приводит к непредсказуемым последствиям ;). Ну вот пример: Код:
<?phpЗащита: Использовать функцию extract с флагом EXTR_SKIP вот пример: Код:
<?phpОписание: Cross Site Scripting (Межсайтовый скриптинг). Собственно принцип этой баги заключается в выводе значения нефильтрованной переменной с целью изменения исходного кода страницы. В основном это вписывание java скрипта отправляющего cookies пользователя на сниффер взломщика. Но на самом деле применений этой баги много. Пример: Код:
<?phpЗащита: Использовать функцию htmlspecialchars() с флагом ENT_QUOTES. Пример: Код:
<?php11. Подбор пароля Описание: Во многих форумах и портальных системах есть возможность подобрать пароль какого-нибудь юзера через форму авторизации либо через cookies(про cookies очень часто кодеры забывают), то есть при проверке пароля/логина нет, допустим, картинки с числом или задержки между неверным вводом пароля. Защита: Прикрутить временную задержку между неверными вводами пароля и неверных авторизаций с помощью cookies. Плюс банить тех кто неверно регестрировался больше определнного количества раз. Спасибо groundhog за совет... 12. Соц. инженерия Описание: Не знаю как назвать правильно ;). Нигде еще ни читал о таком методе атаки. Вообщем вспоминаем те форумы/cms где допустим можно сменить пароль в профиле без ввода старого, либо вспоминаем про панель администратора где для авторизации достаточно только cookies. Рассмотрим на примере: Код:
<?phpКод:
<form name='abra' action='http://site/script.php?action=changepass' method='post'>Защита: Использовать индетификатор юзера. Примеры Код:
<?phpКод:
<?php13. OUTRO Старайтесь по мере возможности проверять переменные на то: 1) Существуют ли они? (empty() is_set()) 2) Подходит ли тип переменной? (is_int() is_str() is_array()) Используйте error_reporting(0) -полезная вещь. Проверяйте значение referer, пусть можно и подделать, но это доставит неприятность взломщику. Вот я думаю и все. Я надеюсь эта статья вам чем то помогла. Ну что много уязвимостей нашли у себя в скриптах по прочтению ;) ? Надеюсь, нет. P.S. Машину глючит, а человека тем более, поэтому буду рад услышать объективные комментарии по теме. |
Пишем PHP скрипты без багов. Оно тебе надо Что бы без багов?
|
Ну так интереснее ломать будет))
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Перед функциями работы с MySQL ставьте '@'. Даже если где-то упустите какой-то параметр, ломать вслепую хакеру доставит мало удловольствия.
|
!empty($var) - проверяет на непустоту! И ненадо лохматить бабушку. Если переменной $var не существует это спровоцирует Warning. Например, empty вернёт true когда переменная существует и она пуста - скажем строка (""), или целое число, но оно 0.
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Расскажи мне... Я везде юзаю эту функцию со включенным отображением ошибок... и че то нигде до сих пор не видил варнинга по этому поводу...
|
| Время: 01:08 |