sql >> Database teknologi >  >> RDS >> Mysql

SQL Injection-angreb - Hvad gør dette?

Hvad angrebet egentlig gør

Der er en subtil, men smart detalje ved dette angreb, som andre besvarere gik glip af. Bemærk fejlmeddelelsen Duplicate entry ':sjw:1:ukt:1' for key 'group_key' . Strengen :sjw:1:ukt:1 er faktisk resultatet af et udtryk evalueret af din MySQL-server. Hvis din applikation sender MySQL-fejlstrengen tilbage til browseren, så kan fejlmeddelelsen lække data fra din database.

Denne form for angreb bruges i tilfælde, hvor forespørgselsresultatet ellers ikke sendes tilbage til browseren (blind SQL-injektion), eller når et klassisk UNION SELECT-angreb er kompliceret at udføre. Det virker også i INSERT/UPDATE/DELETE-forespørgsler.

Som Hawili bemærker, skulle den oprindelige særlige forespørgsel ikke lække nogen information, det var blot en test for at se, om din applikation er sårbar over for denne form for injektion.

Angrebet ikke mislykkes som MvG foreslog, hvilket forårsager denne fejl er formålet med forespørgslen.

Et bedre eksempel på, hvordan dette kan bruges:

> 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'

Hvorfor fejlen er rejst

Hvorfor forespørgslen forårsager denne fejl i MySQL er noget af et mysterium for mig. Det ligner en MySQL-fejl, da GROUP BY formodes at håndtere duplikerede poster ved at aggregere dem. Hawilis forenkling af forespørgslen forårsager faktisk ikke fejlen!

Udtrykket FLOOR(RAND(0)*2) giver følgende resultater i rækkefølge, baseret på det tilfældige startargument 0:

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

Fordi den 3. værdi er en duplikat af den 2., opstår denne fejl. Enhver FROM-tabel med mindst 3 rækker kan bruges, men information_schema.tables er en almindelig. COUNT(*)- og GROUP BY-delene er nødvendige for at fremkalde fejlen 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'
 

Denne fejl opstår ikke i den PostgreSQL-ækvivalente forespørgsel:

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

(Beklager at svare 1 år for sent, men jeg faldt lige over dette i dag. Dette spørgsmål er interessant for mig, fordi jeg ikke var klar over, at der er måder at lække data på via fejlmeddelelser fra MySQL)



  1. Android Room:Sådan migreres kolonneomdøbning?

  2. Oracle:Fuldtekstsøgning med betingelse

  3. Kodedækningsstatistikker

  4. Hvilket format er dette?