SQL injection avancée: Blind SQL injection (partie 3)

Après les deux premiers tutoriaux au sujet des attaques de type SQL Injection, le billet d’aujourd’hui sera dédié à un vecteur d’attaque un peu particulier, si vous ne connaissez pas les principes d’une injection sql, je vous invite vivement à lire les deux premiers articles avant de passer à la suite ;)

Je rappelle que la série de ces tutoriaux est dans le but de donner une idée sur les différents aspects et vecteurs d’attaque d’une injection SQL, j’espère que ça vous aidera à mieux vous protéger et percevoir les risques en codant, n’hésitez pas à me faire part de vos remarques ;)

Qu’est ce que Blind SQL Injection?

Blind SQL Injection est un vecteur d’attaque dont l’approche est très différente de celle des injections classiques, elle permet comme ses ascendants d’injecter des données à partir d’une base d’une application vulnérable. Repérer une faille de ce type n’est pas toujours facile et demande une série de tests.

Les Injections blind se caractérisent par l’absence d’un message d’erreur (qui généralement permet de repérer la faille), ce qui impose une serie de tests « à l’aveuglette » afin d’identifier la présence d’une faille (ou pas) !

Prenant un exemple :

On considère une application web avec une page profile.php avec le code ci-dessous :

[code lang=’php’]
//…
$user_id = $_GET[‘user_id’];
while(stristr($user_id, ‘#union#i’)) $user_id = stri_replace(‘union’,”,$_GET[‘user_id’]);
$query = “SELECT * FROM profile WHERE user_id = $user_id” ;
if([email protected]_query($query)){
echo “Ce membre n’existe pas”;
}
else{
//Affichage des données du profil
}
[/code]

Ce code semble sécurisé contre les injections classiques puisqu’il remplace le mot clé « union », donc pas de possibilité de sélectionner une nouvelle ligne et détourner la requête, toute-fois un attaquant malveillant peut l’exploiter!

Analysons cette requête :

profile.php?user_id=1

Cet appel affichera le profile de l’utilisateur ayant l’id 1 (généralement l’administrateur du site)

Que se passera t’il avec :

profile.php?user_id=1 AND 1=2

Logiquement 1 != 2, si le script n’affiche pas le profil c’est que la condition rajoutée a été exécutée dans la requête, on peut vérifier ça on rajoutant une condition qui retourne toujours true (profile.php?user_id=1 AND 4=4). Si avec cet appel le profil de l’utilisateur ayant user_id=1 s’affiche, c’est que le script est vulnérable à une injection de type “Blind SQL Injection”, alors là! La bonne nouvelle c’est que l’attaquant ne voit aucune information affichée, la mauvaise c’est qu’il peut facilement bruteforcer l’information en rajoutant des conditions dans l’url. Ainsi suivant l’affichage ou le non-affichage du profil, l’attaquant peut comprendre si la condition qu’il a mis est remplie, et enfin extraire les informations caractère par caractère

Exemple permettant de vérifier que la version de mysql est 5:

profile.php?user_id=1 AND version() MATCH 5

Voyant ce qu’un attaquant malveillant peut faire pour exploiter cette faille :

profile.php?user_id=1 and length(password)=32

Cet appel illuste un test sur la longueur du champ password, généralement les passes sont cryptés en md5, si c’est le cas le profil s’affiche et ça facilite à l’attaquant la poursuite de son exploitation ! Un md5 est une chaine de caractère en hexadécimal [09-af] donc 16 possibilités pour chaque caractères, du coup le nombre des possibilités n’est pas énormes, 16 tests au maximum peuvent permettre d’injecter un caractère du champ password, ce qui donne 16×15 = 512 requêtes maximum en total pour extraire le hash md5 de l’utilisateur ayant user_id = 1

Exemple :

profile.php?user_id=1 AND substr(password,0,1)= 0x66

Pour tester si le premier caractère est un « f » (0x66 correspond au code hexadécimal de la lettre f) ainsi selon l’affichage (ou non) du profil utilisateur l’attaquant peut facilement extraire le reste de la chaine de caractère du mot de passe, évidement sans aucun message d’erreur affiché sur son écran !

Pour résumer: Une Blind SQL Injection est toujours exploitée grâce à un bruteforce à l’aveuglette en se servant d’une page vulnérable qui affiche une donnés X, selon l’affichage ou non de cette dernière on peut deviner les données se cachant derrière.

Comment sécuriser son application ?

Les bonnes pratiques à adopter pour éviter de se faire pirater son site sont généralement les mêmes que j’ai cité dans les deux premier tutoriaux : de manière générale : Ne jamais se contenter de cacher les messages d’erreur, pensez toujours à filtrer les entrées, rajouter toujours les « signles quotes » aux variables que vous usez dans vos requêtes SQL et filtrer toujours avec la fonction mysql_real_escape_string

Le réseau des sites web Renault piraté

Le réseau des sites web de la célèbre marque Renault, l’un des plus grands acteurs du marché automobile, a été piraté lundi 17 mai 2010 par un groupe de hackers s’intitulant “v4 Team”. Ces derniers ont pu avoir accès sur le serveur principale hébergeant toutes les extensions des domaines renault y compris renault.co.ma.

Suite à cette attaque massive, 52 sites officiels de renault ont été défigurés, affichant un message “by Q8 H4x0r renalut 0wn3d”, les attaquant semblent exploiter une faille au niveau du serveur IIS6 tournant sous Windows 2003.

Liste des sites piratés:

  • renault.uz
  • www.renault.co.uz/v4.asp
  • renault.com.pk/v4.asp
  • www.renault.com.pr/v4.asp
  • www.renault.eu/v4.asp
  • renault.sg/v4.asp
  • www.renault.tg/v4.asp
  • www.nouveautes-entreprise.renault.fr/v4.asp
  • www.megane-hatch-fleet.renault.co.uk/v4.asp
  • empresas-novidades.renault.pt/v4.asp
  • megane-sport-tourer-empresas.renault.pt/v4.asp
  • www.scenic-empresas.renault.pt/v4.asp
  • www.nuevo-megane-sport-tourer-empresas.renault.es
  • renault.com.tj
  • renault.co.ma
  • www.renault.co.tt/x.asp
  • www.renault.cg/x.asp
  • www.renault.ec/x.asp
  • www.nouveau-scenic-entreprises…
  • www.renault.com.ly/x.asp
  • www.renault.mobi/x.asp
  • www.renault.my/x.asp
  • www.renault.com.py/v4.asp
  • renault.com.ro/v4.asp
  • www.renault.gen.in/v4.asp
  • renault.hn/v4.asp
  • renault.la/v4.asp
  • http://megane-estate-entreprises.renault.fr/v4.asp
  • http://nouveautes-entreprises.renault.com/v4.asp
  • renault.com.az/x.asp
  • www.renault.co.in/x.asp
  • renault.cm/x.asp
  • renault.gy/x.asp
  • www.renault.hk/x.asp
  • www.renault.mq/x.asp
  • www.renault.kg/x.asp
  • www.renault.sn/x.asp
  • www.renault.asia/x.asp
  • http://new-models-fleet.renault.co.uk
  • renault.co.th/x.asp
  • renault.com.pt/x.asp
  • renault.co.ve/x.asp
  • new-models-fleet.renault.co.uk
  • megane-sport-tourer-fleet.rena…
  • www.renault.biz
  • http://nueva-gama-empresas.renault.es/x.asp
  • renault.ht/x.asp

  • http://nuevo-megane-berlina-empresas.renault.es/x.asp
  • http://www.megane-berlina-empresas.renault.pt/x.asp
  • renault.bo/x.asp
  • nuevo-scenic-empresas.renault.es/x.asp
  • renault.vn/x.asp

Joomla! 1.5: Comment modifier le fil d’ariane

Joomla breadcrumbsFil d’Ariane ou “chemin de fer” appelé aussi “breadcrumbs” est l’un des éléments indispensables dans un site web, il est souvent présent avant le contenu de toute page web et permet d’indiquer aux utilisateurs leur emplacement à l’intérieur du site. dans Joomla! 1.5 le fil d’Ariane est géré par un module “mod_breadcrumbs”, ce dernier est géré principalement à partir de la partie “Menus” dans l’interface d’administration. Dans ce tuto on verra comment personnaliser ce dernier en ajoutant/modifiant ou supprimant des éléments.

Ajouter un élément en fin du fil d’Ariane

[code lang=”]$breadcrumbs =& $mainframe->getPathWay();
$breadcrumbs->addItem(JText::_(‘NOM_ELEMENT’) , JRoute::_(‘URL_ELEMENT’));[/code]

Ajouter un élément au début du fil d’arian

[code lang=’php’]$breadcrumbs =& $mainframe->getPathWay();
$breadcrumsNames = $breadcrumbs->_pathway ;
$new_menu = new stdClass();
$new_menu->link = JRoute::_(‘URL_ELEMENT’);
$new_menu->name = JText::_(‘JNOM_ELEMENT’);
array_unshift($breadcrumsNames,$new_menu);
$breadcrumbs->_pathway = $breadcrumsNames ;[/code]

A la ligne 2, la variable $breadcrumsNames permet de récupérer l’ensemble des éléments du fil d’Ariane dans un tableau qui contient , chaque élément est un object stdClass contient deux propriétés (link et name) qui correspondent respectivement au nom de l’élément et à l’url correspondant. Si on souhaite rendre l’élément du menu rajouté non-cliquable il suffit de mettre la propriété link à null, ainsi vous pouvez manipuler tous les éléments du tableau comme ça vous chante et par la suite l’assigner à $breadcrumbs _pathway (ligne 7)

J’espère que ce petit tuto vous sera utile, n’hésitez pas à poser des questions!