admin / 10.07.2018

[Квест] Как хакнуть форму? Sql инъекции.

SQL-Урок 1. Язык SQL. Основные понятия.

Для того, чтобы начать изучать SQL нам нужно сначала понять, что такое база данных.

1. Что такое База Данных

База данных (БД) — упорядоченный набор логически взаимосвязанных данных, используемых совместно, и которые хранятся в одном месте. Если коротко, то простейшая БД это обычная таблица со строками и столбцами в которой хранится разного рода информация (примером может служить таблица в Excel ). Так, часто, с БД нераздельно связывают Системы управления базами данных (СУБД), которые предоставляют функционал для работы с БД. Язык SQL как раз и является частью СУБД, которая осуществляет управление информацией в БД. Мы будем считать БД набором обычных таблиц, которые хранятся в отдельных файлах.

2. Что такое SQL

Итак, переходим к SQL.

SQL — простой язык программирования, который имеет немного команд и которой может научиться любой желающий. Расшифровывается как Structured Query Language — язык структурированных запросов, который был разработан для работы с БД, а именно, чтобы получать /добавлять /изменять данные, иметь возможность обрабатывать большие массивы информации и быстро получать структурированную и сгруппированную информацию. Есть много вариантов языка SQL, но у них всех основные команды почти одинаковы. Также существует и много СУБД, но основными из них являются: Microsoft Access, Microsoft SQL Server, MySQL, Oracle SQL, IBM DB2 SQL, PostgreSQL та Sybase Adaptive Server SQL. Чтобы работать с SQL кодом, нам понадобится одна из вышеперечисленных СУБД. Для обучения мы будем использовать СУБД Microsoft Access .

SQL как и другие языки программирования имеет свои команды (операторы), с помощью которых отдаются инструкции для выборки данных. Чтобы рассмотреть как работают операторы SQL, мы будем использовать мнимую БД с информацией о реализованной продукции:

Статьи по теме:

  • SQL-Урок 2. Выборка данных (SELECT)
  • Эта статья является статьёй-квестом. Мы желаем вам успехов в его прохождении. Итоги вашего прохождения будут опубликованы позже (следите за новостями в соц. сетях), а также всем прошедшим в дальнейшем будет выслан инвайт для регистрации на сайте.

    Ставьте лайки, делитесь с друзьями и коллегами, репостите в соц.сетях.

    Все программисты читали или по крайней мере слышали о методах взлома безопасности веб-сайта. Или даже столкнулись с этой проблемой. С другой стороны, бесконечна фантазия тех, кто хочет сломать сайт, поэтому все узкие места должны быть хорошо защищены. Вот почему я хотел бы начать серию коротких статей, где будут представлены основные методы и приемы взлома веб-сайтов.

    В первой статье я хотел бы описать и разъяснить некоторые общие методы взлома одного из самых уязвимых частей сайта — форм. Я буду подробно останавливаться на том, как использовать эти методы и как предотвратить атаки, а также расскажу о тестировании безопасности.

    SQL инъекции

    SQl-инъекция — это такая техника, когда злоумышленник вводит команды SQL в input поле на веб-странице. Этим imput`ом может быть что угодно — текстовое поле в форме, параметры _GET и _POST, cookies и т. д. Этот метод был весьма эффективным до появления фреймворков в мире PHP. Но этот способ взлома может быть по-прежнему опасен, если вы не используете ORM или какие-либо еще расширения для data object. Почему? Из-за способа передачи параметров в SQL запрос.

    "Слепые" инъекции

    Давайте начнем с классического примера SQL-statement`а, возвращающего пользователя по его логину и хешу от пароля (страница входа)

    Пример 1

    mysql_query('SELECT id, login FROM users WHERE login = ? and password = hash(?)');

    Я подставил вопросительные знаки в выражение из-за различных вариаций этого решения. Первый вариант, на мой взгляд, самый уязвимый:

    Пример 1а

    mysql_query('SELECT id, login FROM users WHERE login = "' . $login . '" and password = hash("' . $password . '")');

    В этом случае в коде нет проверки на ввод неправильных данных. Значения передаются прямо из формы ввода в SQL запрос. В самом лучшем случае пользователь введет здесь свои логин и пароль. Что случится в худшем случае? Давайте попробуем хакнуть эту форму. Это можно сделать, передав "подготовленные" данные. Попытаемся войти как первый пользователь из базы данных, а в большинстве случаев — это админский аккаунт. Для этого, передадим специальную строку вместо ввода логина:

    " OR 1=1; —

    Первая кавычка может быть и одинарной, поэтому одной попыткой взлома можно не обойтись. В конце стоят точка с запятой и два дефиса, чтобы всё, что идёт после превратилось в комментарий. В результате будет выполнен следующий SQL запрос:

    SELECT id, login FROM users WHERE login = “;” OR 1=1 LIMIT 0,1; – and password = hash(“;Some password”)

    Он вернет первого пользователя из базы данных и, возможно, залогинится под ним в приложении. Хорошим ходом будет добавить LIMIT, чтобы входить под каждым отдельным пользователем. Это единственное, что нужно, чтобы пройти по каждому значению.

    Более серьезные способы

    В предыдущем примере всё не так уж страшно. Возможности в админской панели управления всегда имеют ограничения и потребуется реально много работы, чтобы поломать сайт. А вот атака через SQL инъекции может привести к куда большим повреждениям системы. Задумайтесь, сколько приложений создаются с главной таблицей 'users' , и что будет, если злоумышленник введет такой код в незащищённую форму:

    My favorite login'; DROP TABLE users; —

    Таблица 'users' будет удалена. Это одна из причин почаще делать бэкапы баз данных.

     _GET параметры

    Все параметры, заполненные через форму, передаются на сервер одним из двух методов — GET или POST. Наиболее распространенный параметр, передаваемый через GET — id. Это одно из самых уязвимых мест для атак, при этом неважно, какого вида урл вы используете — «, или «, или «.

    Что произойдет, если мы подставим в урл следующий код?

    http://example.com/users/?id=1 AND 1=0 UNION SELECT 1,concat(login,password), 3,4,5,6 FROM users WHERE id =1; —

    Вероятно, такой запрос вернет нам логин пользователя и… хеш от его пароля. Первая часть запроса `AND 1=0` превращает то, что перед ним в false, соответственно никаких записей не будет получено. А вторая часть запроса вернет данные в виде prepared data. А так как первым параметром идет id, следующим будет логин пользователя и хеш его пароля и еще сколько-то параметров. Существует множество программ, с помощью брутфорса декодирующих такой пароль, как в примере. А так как пользователь может использовать один и тот же пароль для разных сервисов, можно получить доступ и к ним.

    И вот что любопытно: от такого способа атаки совершенно невозможно защититься методами вроде `mysql_real_escape_string`, `addslashes` и.т.

    д. В принципе, нет способа избежать такой атаки, поэтому, если параметры будут передаваться так:

    'SELECT id, login, email, param1 FROM users WHERE id = ' . addslashes($_GET['id']);'

    проблемы не исчезнут.

    Экранирование символов в строке

    Когда я был новичком в программировании, мне было тяжело работать с кодировками. Я не понимал, в чем между ними различие, зачем использовать UTF-8, когда нужно UTF-16, почему база данных постоянно устанавливает кодировку в latin1. Когда я наконец начал всё это понимать, то обнаружил, что проблем станет меньше, если хранить всё в одном стандарте кодирования.

    SQL-Урок 1. Язык SQL. Основные понятия.

    Разбираясь со всем этим, я заметил также и проблемы безопасности, возникающие при преобразовании из одной кодировки в другую.

    Проблем, описанных в большинстве предыдущих примеров, можно избежать, используя одинарные кавычки в запросах. Если вы используете , атаки через SQL-инъекции, построенные на использовании одинарных кавычек, экранируемых обратным слэшем, потерпят неудачу. Но такая атака может пройти, если просто подставить символ с кодом 0xbf27 , преобразует его в символ с кодом 0xbf5c27 – а это вполне валидный символ одинарной кавычки. Другими словами, `뼧` пройдет через , а потом маппинг MySQL конвертирует его в два символа 0xbf (¿) и 0x27 (‘).

    "SELECT * FROM users WHERE login = '"; . addslashes($_GET['login']) . ";'";

    Этот пример можно хакнуть, передав в поле логина в форме. Движок SQL сгенерит конечный запрос так:

    SELECT * FROM users WHERE login = '¿' OR 1=1; —

    И вернет первого пользователя из БД.

    Защита

    Как же защитить приложение? Есть куча способов, применение которых не сделает приложение совсем неуязвимым, но хотя бы повысит его защищенность.

    Использование mysql_real_escape_string

    Функция ненадежна, так как не предусматривает многие случаи взлома. У mysql_real_escape_string нет таких проблем

    Использование MySQLi

    Это расширение для MySQL умеет работать со связанными параметрами:

    $stmt = $db->prepare('update uets set parameter = ? where id = ?'); $stmt->bind_param('si', $name, $id); $stmt->execute();

    Использование PDO

    Длинный способ подстановки параметров:

    $dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', $user, $password); $stmt = $dbh->prepare('INSERT INTO REGISTRY (name, value) VALUES (:name, :value)'); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // insert one row $name = 'one'; $value = 1; $stmt->execute();

    Короткий способ:

    $dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', $user, $password); $stmt = $dbh->prepare('UPDATE people SET name = :new_name WHERE id = :id'); $stmt->execute( array('new_name' => $name, 'id' => $id) );

    Использование ORM

    Используйте ORM и PDO и связывайте (используйте bind) параметры. Избегайте SQL в коде, если вы видите в коде SQL, значит, с ним что-то не так.

    ORM позаботится о безопасности в самых узких местах в коде и о валидации параметров.

    Выводы

    Цель этой серии не предоставить полное руководство по взлому сайтов, а обеспечить безопасность приложения и предотвращение атак из любого источника. Я постарался написать эту статью не только для программистов — они должны быть в курсе любых угроз в коде и знать пути, как предотвратить их, но также и для инженеров по качеству — потому, что их работа заключается в том, чтобы отследить и сообщить такие моменты.

    phpsecuritysql injection

    2017-11-02irulПоделиться:

    • Автор: М. Грабер
    • год издания: 2010
    • язык: русский
    • учебник объемом: 228стр.
    • формат: PDF
    • размер файла: 5.2Mb

    Учебник по SQL написан очень понятным и простым языком и отлично подходит новичкам. Он изобилует пояснительными примерами с подробнейшим объяснением. Изучить язык запросов SQL не составит большого труда, описываются различные версии SQL.

    Прежде всего, вы получите представление о реляционных базах данных, узнаете о SQL, который является структурированным языком запросов. Этот специальный язык позволяет создавать и управлять реляционными базами данных, являющихся таблицами, содержащими кластеры связанной информации.

    Учебник по SQL позволит научиться свободно оперировать значениями, запросами в базах данных, в т.ч. оперировать переменными с неявными областями значений и связанными подзапросами, выполнять сложные решения. Рассматривается «вложенный SQL»: совмещение SQL с другими языками программирования.

    Иллюстрированный самоучитель по SQL для начинающих

    В учебнике вы найдете приложения: по типам SQL данных, синтаксису и командам, нестандартным особенностям языка запросов.

    скачать учебник SQL: DepositfilesTurbobit

    Основы программирования на платформе 1С

    Эти видеоуроки могут осваивать люди, мало знакомые с программированием, они для новичков. Их цель — научить основам программирования на платформе 1С.

    подробнее…

    Язык запросов 1С-программирования

    Ускоренное изучение языка запросов 1С на платформе 8.3. Уроки научат извлекать данные из базы в удобном виде, они продуктивны и имеют четкую конкретику.

    подробнее…

    Основы Java для начинающих

    Видео по Java и объектно-ориентированному программированию. Представлена осязаемая конструкция языка Java и правильная модель программирования.

    подробнее…

    Базы данных в Java

    Любому программисту необходимо уметь работать с базами данных. Вы узнаете, как используются БД и запросы SQL в Java. Уроки подходят новичкам.

    подробнее…

    Создание и монетизация приложений Android

    Видео по созданию мобильных приложений для Android для абсолютных новичков. Планирование архитектуры будущего приложения с учетом требований рынка.

    подробнее…

    Программирование на Java для детей, родителей .. (PDF)

    Учебник по программированию на Java предназначен для новичков, что явствует из его красноречивого названия, он отлично иллюстрирован.

    подробнее…

    Язык C в 21 веке (PDF)

    Книга по программированию на языке C, в которой читатель найдет все новшества, необходимые для разработки эффективных и передовых приложений.

    подробнее…

    Путь программиста (PDF)

    Это справочник по эффективному построению карьеры программиста.

    Он научит дорого продавать свои услуги на рынке информационных технологий.

    подробнее…

    Заинтересованному кругу лиц и друзьям:

    SQL-запросы для начинающих

    О чем курс

    Язык SQL будет использоваться Вами, какую бы профессию в IT вы не выбрали. Базу данных используют в своей работе разработчики сайтов и приложений, системные администраторы.

    Прослушав Курс «Основы SQL» Вы получите универсальные знания о работе с базами данных. Если Вы захотите использовать другие системы управления базами данных (например такие как PostreSQL, Oracle, mySql, Microsoft SQL server и другие) — Вам достаточно будет освоить их специфику. Дополнительные возможности, расширяющие базовый SQL.

    На курсе «Основы SQL» Вы научитесь:

    • Как правильно проектировать базу данных;
    • Как получить выборку из одной или нескольких таблиц;
    • Создавать аналитические отчеты при помощи групповых функций;
    • Добавлять удалять и изменять данные таблиц;
    • Создавать таблицы и другие объекты базы данных.

    На занятиях для изучения языка SQL Вы будете использовать базу данных Posgre SQL, которая является самой мощной из распространяемых по лицензии GPL.

    Для кого курс

    Курс «Основы SQL» необходим для разработчиков приложений, администраторов баз данных, разработчиков отчетов и бизнес-аналитиков. После завершения курса Вы сможете использовать такое мощное средство, как быстрое и эффективное хранилище информации, в своих программах.

    Для изучения материала курса никаких начальных знаний в области баз данных не требуется. Если у Вас ранее не было опыта программирования, рекомендуем Вам сначала пройти обучение на «Курсе молодого бойца».

    FILED UNDER : IT

    Submit a Comment

    Must be required * marked fields.

    :*
    :*