Решил написать, с какими проблемами и уязвимостями я столкнулся и как я их решал, писав свои скрипты. Думаю, будет полезно почитать всем. Авторизация, кукисы. { Подмена cookies Пример уязвимого кода: PHP: <? ... $mysql = mysql_fetch_array(mysql_query("SELECT * FROM `users` WHERE `id` = '".mysql_escape_string($_COOKIE['id'])."'")); if($_COOKIE['user'] == $mysql['user']) { include('edituser.php'); // или просто изменение юзера } ... ?> Обнаружение уязвимости: Если вы заметили, что в кукисах есть только ваш логин и возможно ID, то вероятно, что здесь есть уязвимость. Использование уязвимости: Конечно, кукисы можно подменять, и, использовав это, можно воспользоваться правами любого юзера. Ну а так же часто в таких случаях возможно провернуть SQL-инъекцию. Устранение уязвимости: Лучше в кукисы (если уж работа в кукисах) сохранять не только логин, но и хеш пароля, и сверять всё. Например: PHP: <? ... $mysql = mysql_fetch_array(mysql_query("SELECT * FROM `users` WHERE `id` = '".mysql_escape_string($_COOKIE['id'])."'")); if($_COOKIE['user'] == $mysql['user'] && $_COOKIE['hash'] = $mysql['pass']) { include('edituser.php'); // или просто изменение юзера } ... ?> Но если же вы не хотите, чтобы была возможность угнать кукисы, то лучше работать в сессиях. Обход капчи Пример уязвимого кода картинки: PHP: <? ... $imageCode = rand(10000,99999); setcookie('imageCode', md5($imageCode)); ... ?> Обнаружение уязвимости: Просмотрите все кукисы с данного сайта, если вы найдёте кукис вроди imageCode, то вероятно, что здесь есть уязвимость. Использование уязвимости: Пользуясь тем, что можно подменить кукисы, мы просто меняем этот кукис на хеш любого слова и в запросе уже используем это слово. Устранение уязвимости: В защищающих картинках лучше использовать сиссии, а после проверки сразу уничтожать её с помощью session_destroy(); PHP: <? ... $imageCode = rand(10000,99999); $_SESSION['imageCode'] = md5($imageCode); ... ?> Уязвимость благодаря недочёту в операторе if или elseif Пример уязвимого кода: PHP: <? ... $mysql = mysql_fetch_array(mysql_query("SELECT * FROM `admins` WHERE `name` = '".mysql_escape_string($_POST['name'])."'")); //Даже если нет SQL-инъекции if($_POST['password'] != $mysql['password'] && $_POST['login'] != $mysql['name']) exit('Вы ввели неверный пароль'); ... ?> Обнаружение уязвимости: С виду кажется, что здесь нет уязвимости, но это не так. Попробуйте ввести правильный логин, а пароль любой. Использование уязвимости: Если вы знаете правильный логин, то введя его и любой пароль, вы сможете, например войти в админку. Устранение уязвимости: Достаточно просто "&&" заменить на "||", так как "&&" - означает "И", а "||" - "ИЛИ". PHP: <? ... $mysql = mysql_fetch_array(mysql_query("SELECT * FROM `admins` WHERE `name` = '".mysql_escape_string($_POST['name'])."'")); if($_POST['password'] != $mysql['password'] || $_POST['login'] != $mysql['name']) exit('Вы ввели неверный пароль'); ... ?> } Чтение файлов и т.п.. { file_get_contents() /* Многие считают её инклудом, но это далеко не так * У readfile() такая же проблема, но читать файлы ей нельзя */ Пример уязвимого кода: PHP: <? ... echo file_get_contents($_GET['get']); ... ?> Обнаружение уязвимости: Если вы хотя бы новичёк, то вас должен привлечь запрос вида index.php?get=news.html, и подставив любое значение, можно увидеть ошибку, это значит, что вероятно, уязвимость здесь есть. Использование уязвимости: Есть возможность прочитать любой файл на сервере а так же получить cookies жертвы. Устранение уязвимости: Этот код должен выглядеть примерно так: PHP: <? ... $_GET['get'] = preg_replace('|([^A-Za-z0-9_-]+)|','',$_GET['get']); echo file_get_contents('http://'.$_SERVER["HTTP_HOST"].'/'.$_GET['get'].'.php'); ... ?> } Вот вроди бы и всё, если найду ещё, то обязательно напишу о них. (c) NOmeR1
1. с трудом представляю, что можно перепутать && и || . если конечно не быть совсем новичком (а новички скрипты такого типа не пишут) 2. аналогично 1. 3. не полностью безопасно, т.к. юзер может прочитать некоторые файлы, которые без использования данной функции ему будут forbidden.
Не понял как и второе, так и третье. А на счёт первого, бывает и такое, и у меня бывает, тем более там !=, а с ним геморойней чем с ==.
еще раз 2. это может и типичная ошибка, но только у новичков. может и не так, но это мое мнение 3. допустим, у нас на сервере есть файл admin.php, который становится доступен только после предварительной авторизации, а так его может выполнить любой желающий. хоть и редкий случай, но все же. ЗЫ я сам новичек в пхп. если я говорю неправильно, поправьте=)
>> Уязвимость благодаря недочёту в операторе if или elseif я так и не понял какие это недочеты в операторах if и elsif.. ) недочеты тока в моске прогера, который писал приведенный пример..
Я специально написал уязвимый код и не уязвимый, чтобы если не понятно что-то кому-то, то могли сравнить код и понять
Номер, непонятно зачем это, повторение-мать ученье?? помнишь статейка от задохлика на ха? ... а так молодец
угу по поводу file_get_contents - твой "фикс" - дыра) локальный инклуд. если magic_quotes_gpc 1, то можно прочитать любой php-файл (при наличии полного пути), при выключенных - %00 и вперед. вообще я бы не сказал, что все это - уязвимости пхп-функций, т.к. такое прокатит не всегда. уязвимости скорее возникают из-за кривых программистов
Спасибо, я знаю, что такое инклуд. Это что-то меняет? все равно код бажный, или теперь через file_get_contents нельзя ретривить какие-либо файлы? пс: я имел в виду уязвимость local inclusion, в народе локальный инклуд.
Уважаемый Нитрокс, вы в который раз неправы =) file_get_contents() и include() это две разные вещи. Через инклуд ты никогда не сможешь просмотреть пшп скрипт, а через file_get_contents() не сможешь его выполнить
Спайдер, я знаю. Вам перевести значение слова "include"? Тем не менее, это уязвимость и через чтение сорцов можно поиметь много чего полезного. Например, конфиг БД, знакомая ситуация? ЗЫ: открою секрет, иногда php-файлы выполняются как txt, это зависит от настроек сервера. так что не будь наивным, можно просмотреть при определенных настройках. Кстати, через file_get_contents тоже можно. Запись файла в переменную и eval().
я посмеялся))) как же ты выполнишь пшп скрипт с уязвимостью в include() если он выполняется как txt, а не php? Во вторых, я тебе это уже сотни раз говорил, любой проинклуденный файл выполняется как пшп код, хоть это exe, хоть jpg или iso к примеру. И это не зависит от настроек сервера никто не спорит что это уязвимость, но к инклуду она никаким боком, уж извините =\
"Кстати, через file_get_contents тоже можно. Запись файла в переменную и eval()." - )) порадовало высказывание
>Кстати, через file_get_contents тоже можно. Запись файла в переменную и eval(). Низя! eval'у не понравятся символы <? и ?>