Некоторые уязвимости Php.
Решил написать, с какими проблемами и уязвимостями я столкнулся и как я их решал, писав свои скрипты. Думаю, будет полезно почитать всем.
Авторизация, кукисы.
{
Подмена 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
|