30 votes

Le site a été piraté via SQL Injection

Récemment, mon site a été piraté par injection SQL. Le pirate a utilisé la requête suivante pour obtenir mon nom de base de données. Je ne peux pas comprendre cette requête qu'ils ont écrite.

Question:

 =-999.9%20UNION%20ALL%20SELECT%20concat(0x7e,0x27,Hex(cast(database()%20as%20char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536--
 

Une fois la requête exécutée, elle affiche un résultat entier, quelque chose comme " 74545883 ".

Pouvez-vous expliquer le fonctionnement de la requête?

17voto

sethvargo Points 10560

Cela ressemble à une attaque par dépassement. Ils UNION-ed avec votre requête existante. le remplacement de tous vos %20 avec (espace) depuis son url-encodé rendements:

=-999.9 UNION ALL SELECT CONCAT(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536-

décomposer:

  1. l' =-999.9 est juste pour la résiliation de votre requête
  2. 0x31303235343830303536 est NULL - , ils sont juste correspondant au nombre de colonnes dans votre requête existante. Si vous aviez SELECT * FROM users et users a 4 colonnes, l' UNION doit également avoir 4 colonnes. En conséquence, ils ont juste utilisé des valeurs NULL pour remplir ces colonnes.
  3. la vraie confusion dans l' CONCAT(). Ils sont combinant 126, 39, nom de base de données comme valeur hexadécimale, 39, 126 et
  4. -- est une base de données mysql commentaire - il ignore le reste de votre requête après

À en juger par cette attaque, je soupçonne que vous n'êtes pas d'emballage d'entrée en mysql_real_escape_string(), ce qui a permis à attaqué à sauter hors de votre requête et d'exécuter leurs propres.

Voir owasp.org pour plus d'informations.

5voto

Sarwar Erfan Points 11946

Ce n'est pas la requête complète, en fait d'entrée de la personne dans cette chaîne de votre application web.

Maintenant, tout d'abord remplacer %20 avec un espace vide dans l'union de la partie, vous obtenez:

SELECT concat(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536--

Semble à l'utilisateur de placer la corde dans un endroit où vous vous attendiez à un nombre. Donc, vous voyez qu'il y a d'abord un certain nombre (999.9) pour valider l'état d'origine de la requête. Ensuite, une partie de l'UNION est ajouté. Enfin, après l'UNION de la partie, le commentaire de l'ajout de caractères ( -- ), de sorte que, le reste de la requête (qui peuvent être ajoutés par votre système) est court-circuité.

On peut formater le code pour mieux comprendre:

SELECT 
    concat
    (
        0x7e,
        0x27,
        Hex(cast(database() as char)),
        0x27,
        0x7e
    ),
    0x31303235343830303536,
    0x31303235343830303536,
    0x31303235343830303536

Maintenant, la sous-chaîne de la première colonne du résultat contiendra l'hexagone forme codée de votre datbase nom. En fait, il doit être entouré de guillemets simples (0x27), puis de nouveau entouré par ~ (0x7e)

3voto

astander Points 83138

La requête a retourné le nom de Base de données à l'aide de la BASE de données() , il est ensuite converti en une valeur hexadécimale à l'aide de HEx() fonction.

Une fois qu'ils avaient ce qu'ils pourraient utiliser UNHEX fonction

Jetez un oeil à l' UNHEX exemples

mysql> SELECT UNHEX('4D7953514C');
        -> 'MySQL'
mysql> SELECT 0x4D7953514C;
        -> 'MySQL'
mysql> SELECT UNHEX(HEX('string'));
        -> 'string'
mysql> SELECT HEX(UNHEX('1267'));
        -> '1267'

Il est bon de savoir comment ils sont arrivés, mais dans l'ensemble, vous avez besoin de réparer votre code afin d'éviter l'Injection SQL.

1voto

Eric Fortis Points 6226
 -999.9 UNION ALL SELECT 
CONCAT('Hex(cast(database() as char))'),
0x31303235343830303536,
0x31303235343830303536,
0x31303235343830303536
 

Je pense que vous devez avoir d'autres entrées dans votre journal, sinon il savait d'avance que vous avez 3 colonnes.

1voto

Name Points 11

C'est un exemple de l'injection à l'aide de Havij Le 0x7e et 0x27 correspondent à ~ et ' qui sera utilisé pour cadre l'affichage HTML comme id=999999.9+union+all+select+0x31303235343830303536,(select+concat(0x7e,0x27,unhex(Hex(cast(sample_tbl.name+as+char))),0x27,0x7e)+from+test.sample_tbl+Commande+en+id+limite+0,1)+-- Cette requête sera rendu ~'Alfred'~ qui est la valeur du champ de la colonne nom de la table sample_tbl dans le test de la table

~'r3dm0v3_hvj_injection'~ est la Havij signature de code unhex 0x7233646D3076335F68766A5F696E6A656374696f6e selon http://www.string-functions.com/hex-string.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X