sql_imgHello,
Aujourd’hui je vous parlerai d’un vecteur d’attaque très répondu sur internet, c’est SQL Injection, le sujet est très riche, j’ai donc décidé de le répartir en trois parties:

  • Les injections SQL basiques
  • SQL Injection avancée
  • Blind SQL Injection

Dans ce billet, j’expliquerai le concept d’une Injection SQL basique, les différentes formes sous lesquelles elle peut se présenter dans une application WEB, illustrées par des exemples concrets, ainsi que des solutions pour sécuriser son code et prévoir ce genre d’attaques!

Comme vous le savez tous, SQL (Structured Query language), est un langage de bases de données qui constitue le cœur des applications WEB qui interagissent avec un SGBD, sachant que le concept d’une Injection SQL est commun pour tous les types de SGBD (avec quelques petites variations), dans toute la série de ces tutoriaux, je vais considérer qu’on travaille sur une base de données MySQL qui tourne sur un serveur LAMP!

Alors c’est parti =)

SQL Injection, c’est quoi ?

SQL Injection est parmi les vecteurs d’attaques les plus connus sur la toile!, son principe est de modifier une requête SQL grâce à un champ mal filtré dans le but d’exécuter une requête non prévue par l’application, l’exploitation d’une injection SQL peut avoir des conséquences désastreuses sur un site, elle peut permettre à un attaquant de :

  • Bypasser une authentification
  • Lire des données sensibles depuis les tables mySQL
  • Injecter le nom et le schéma de la base de données
  • Lire et écrire dans le système de fichier et potentiellement exécuter du code PHP

Comment repérer une injection SQL?

Une Injection SQL est souvent repérée par un attaquant grâce aux messages d’erreurs, le test est assez facile à faire, il suffit d’insérer un caractère spéciale (un signle quote « ‘ » le plus souvent), ou modifier le type d’une variable utilisée dans une requête SQL, si la variable est mal filtrée l’exécution de la requête est interrompue et il y a de fortes chances que cette dernière est faillible à une Injection

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

Et oui! c’est ça, merci mysql_error =)

Et si on passe aux exemples?

Assez de blabla, là on passe aux exemples, et on commence par l’un des plus classiques :

Bypasser une identification:

Stanislas: un développeur en herbe a conçu un formulaire d’identification, qui permet de poster le nom d’utilisateur et le mot de passe dans une page PHP, cette dernière vérifie si c’est les bons et affiche un message selon le résultat:

Code :

// page processlogin.php
$username = $_POST['username'];
$password = $_POST['password'];
$sql = mysql_query("SELECT * FROM users WHERE username = '$username' AND password = '$password'") or die(mysql_error());
if(mysql_num_rows($sql) == 1)
{
echo "Bienvenue $username dans votre espace membre!";
}
else
{
echo "Nom d'utilisateur et/ou mot de passe incorrecte";
}

Maintenant imaginons qu’un attaquant se connecte avec comme login : admin’–, la requête devient :

SELECT * FROM users WHERE username = ‘admin’–‘ AND password = ‘$password’

La requête SQL va aboutir, le single quote permettra de fermer le délimiteur de la chaine admin et les deux tirées servent à mettre le reste de la requête en commentaire, du coup la vérification du mot de passe sera ignorée ;) , Bienvenue admin dans votre espace membre!

C’est juste un exemple! l’attaque peut se présenter différemment selon la requête SQL :

Exemple 2:

//...
$sql = mysql_query("SELECT * FROM users WHERE ( username='$username' AND password = '$password' )");

Dans ce cas, pour bypasser l’identification il y a plusieurs possibilités, l’une est d’utiliser comme login: admin’)–
ou encore, comme login : admin’) or (‘a’='a, le principe est de toujours forcer la requête à retourner true :)

Injecter des données depuis une table

On dit souvent que l’union fait la force! c’est le cas pour les injections SQL car là on arrive aux choses sérieuses!

la commande UNION, elle existe depuis MySQL 4.0 et permet de combiner le résultat de plusieurs requêtes SELECT en une seule. Pour l’UNION, les champs des différents SELECT doivent avoir le même nombre et le même type!

Prenant l’exemple d’un petit forum, on considère une page profile.php qui affiche le profil d’un utilisateur donné à partir de son ID récupéré par $_GET

Code :

mysql_connect("localhost","root","");
mysql_select_db("test");
$user_id = $_GET['id'];
$sql = mysql_query("SELECT usernamen, nom, prenom, email FROM users WHERE user_id = $user_id") or die(mysql_error());
if(mysql_num_rows($sql) > 0)
{
$data = mysql_fetch_object($sql);
echo "
<fieldset>
<legend>Profile de ".$data->username."</legend>
<p>Nom d'utilisateur : ".$data->username."</p>
<p>Nom et prénom : ".$data->nom." " .$data->prenom ."</p>
<p>Adresse email : ".$data->email."</p>
</fieldset>";
}

Sans connaitre le code qui s’exécute derrière un attaquant peut détecter la présence d’une injection sql en essayant d’interrompre la requête en accèdent à la page : profile.php?id=1′, le fameux message d’erreur s’affiche, l’attaquant passe à l’étape suivante, qui est l’identification de nombre des champs utilisés dans le SELECT

La technique la plus courante est l’utilisation de la clause « ORDER BY », en incrémentant l’indice petit à petit jusqu’à ce que la page affiche une erreur

  • profile.php?id=1 order by 1 [OK]
  • profile.php?id=2 order by 2 [OK]
  • profile.php?id=3 order by 3 [OK]
  • profile.php?id=4 order by 4 [OK]
  • proile.php?id=5 order by 5 [ERREUR]

A ce stade là, l’attaquant peut savoir que la requête contient 4 champs dans le SELECT, et peut donc utiliser la clause UNION pour injecter des données!

profile.php?id=-1 UNION SELECT 1,2,3,4–

là on peut bien voir les chiffres s’afficher au lieu des données vu que l’id -1 n’existe pas dans la base, du coup les champs sélectionné dans l’UNOIN seront retourné (1,2,3,4), à la place de ces derniers l’attaquant peut sélectionner des données de n’importe quelle table sur laquelle l’utilisateur sql courant a les droits

Exemple :

profile.php?id=-2 UNION SELECT version(), user(), password, null FROM users
profile.php?id=-2 UNION SELECT host, user, password, database() FROM mysql.user

Il est facile pour un attaquant de deviner le nom des tables, d’ailleurs il existe des listes de tables sensibles susceptibles d’exister sur une base de données genre (login, users, auth, membres..), et depuis mysql 5 il est possible d’injecter les noms des tables à partir de la base information_schema! je reviendrai dans le billet de cette série (SQL Injection avancée) avec plus de détails sur cette partie là!

Il est également possible d’injecter des données depuis les autres bases sur-lesquelles l’utilisateur mysql courant a des droits!

Comment se protéger?

Maintenant que vous avez conscience du danger qu’une injection SQL classique pourrait engendrer lorsqu’elle est exploitée voici les bonnes pratiques pour sécuriser son application :

Pour notre cas par exemple : la solution est de filtrer l’input $_GET['id'] on conservant que la partie entière de sa valeur, pour ce faire :

$user_id = intval($_GET['id']);

et voilà le tour est joué :) , s’il s’agissait d’un nombre à virgule flottante on utilisera floatval() et ainsi de suite..

Pour les chaines de caractères, pensez toujours à utiliser mysql_real_escape_string, cette fonction permet de filtrer tous les caractères spéciaux et vous facilitera la vie! Et si vous avez le malheur de ne pas les utiliser dans vos requêtes, alors c’est bien le moment ;)

Donc voilà les classiques pour les injections SQL! Dans le prochain billet, on passera à la vitesse supérieur! J’exposerai des méthodes d’exploitation plus avancées, des erreurs à ne pas commettre ainsi que des solutions pour prévenir à ce genre d’attaques!

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap

Regular expression injectionSalut à tous!

Aujourd’hui je vous parlerai de la sécurité des expressions régulières, appelées aussi expressions rationnelles, ou tout simplement REGEX pour les intimes! Si vous en usé dans vos codes, ce billet est pour vous!

Les expressions rationnelles permettent de manipuler une chaine de caractère de façon très puissante, elles sont souvent utilisées pour la validation des données, le parsing du bbcode dans les forums, également dans les commandes unix comme grep et sed, mais ce n’est pas notre sujet aujourd’hui!

Où est le problème?

Dans une expression rationnelle, il est possible d’utiliser un modificateur « e » qui permet d’évaluer le code contenu dans la chaine de remplacement, donc exécuter du code php!

Dans le language Perl ainsi que dans tous les technologies qui utilisent la librairie PCRE (Perl-compatible regular expressions), y compris PHP, ces derniers supportent l’utilisation de ce modificateur, un attaquant malveillant peut injecter du code si l’entrée n’est pas correctement filtrée!

Exemple :

Voici un code qui parse une chaine de caractère et remplace tous ce qui existe entre [b] et [/b] par <strong>CHAINE</strong>, on le mettant en majuscule!

$nom = "toto";
$chaine = "Hello my name is [b]".$nom."[/b]";
$pattern = "#\[b\](.*)\[/b\]#e" ;
$replacement = "'<strong>'.strtoupper('$1').'</strong>'";
$display = preg_replace($pattern , $replacement, $chaine);
echo $display  ;

Que se passera t’il si toto s’appelle ainsi :

  • ‘.phpinfo().’
  • ‘.exec(\$_GET[cmd]).’
  • ‘.include($_GET[backdoor]).’

Dans toutes les versions PHP < 5.0.5 La chaine de remplacement deviendra : <strong>’.strtoupper(‘\\1‘.phpinfo().’‘).’ »</strong> est le code php sera exécuté ! du coup, un attaquant peut injecter un code malveillant !

Comment se protéger?

Si jamais vous êtes amenés à utiliser des expressions rationnelles avec le modificateur « e », pensez à filtrer vos variables en utilisant la fonction escapeshellcmd, d’où notre code deviendra :

$nom = "simo.'phpinfo().'"; // test d'injection
$chaine = "Hello my name is [b]".$nom."[/b]";
$pattern = "#\[b\](.*)\[/b\]#e" ;
$replacement = "'<strong>'.strtoupper(escapeshellcmd('$1')).'</strong>'";
$display = preg_replace($pattern , $replacement, $chaine);
echo $display  ;

Sinon Le plus simple est d’utiliser une version récente de PHP > 5.0.5 est le tour est joué ;)

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap

En javascript, parfois on a besoin de récupérer le texte sélectionné par le client, c’est souvent utilisé si vous développez votre propre éditeur wysiwig afin de mettre un texte en gras ou placer un lien hypertexte autour de votre sélection!

Bref voici une fonction cross-browser qui vous permet cela!

Code :

getSelectedText = function(){
    selectedText = '';
    // Gecko, Webkit
    if (window.getSelection) {
        selectedText = window.getSelection();
    }
    // Si IE
    else if (document.selection) {
        selectedText = document.selection.createRange().text;
    }
    return selectedText ;
}

Et si on fait un test !

Sélectionnez un texte quelconque dans le blog, et cliquez sur le bouton ci dessous!


voilà c’est aussi simple que ça!

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap

MozillaContent Security Policy, baptisé CSP, est une nouvelle technologie créée par la fondation Mozilla dans le but de se protéger contre les attaques XSS!
Dans les trois dernière années, l’exploitation des attaques XSS et CSRF Injection a connu une très grande croissance, on a vu pas mal d’incidents et des hackages de sites populaires et de grands comptes comme facebook , imageshack, domaintools, godady…, les ingénieurs de mozilla security team ont pensé à une solution et nous ont inventé CSP!

CSP, c’est quoi au juste?

En principe, les attaques XSS sont possibles car toutes les données chargées depuis un serveur http sont interprétées par le navigateur avec les droits que le client possède, le code JavaScript et tout le contenu chargés (y compris les scripts externes) sont combinés dans un même conteste de sécurité (Policy) et permettent l’accès à la totalité du DOM. Content Security Policy nous apporte un mécanisme pour indiquer explicitement au navigateur quel contenu est légitime, de cette façon le navigateur pourra interrompre l’exécution et restreindre l’accès au DOM de tout contenu non autorisé et sans perdre des fonctionnalités dans le site!

CSP est destiné aux web designers et administrateurs système afin de designer la façon avec laquelle les données doivent interagir avec leurs sites, son implémentation permettra la détection des attaques de type XSS et injection de code HTML et minimiser les risques d’une potentielle exploitation d’un de ces deux vecteurs d’attaque

Comment ça marche ?

Le principe de CSP est d’appliquer un ensemble de restrictions sur l’exécution des scripts et les autoriser seulement à partir d’une liste blanche créée par le webmaster, ainsi tout exécution de script ou de code chargé depuis un site non figurant cette liste sera bloqué, on pourra par exemple autoriser seulement les scripts provenant de Google API, et Youtube et restreindre l’accès à tout autre domaine externe!

Voici une liste de quelques actions bloquées par CSP:

  • les balise <script>
  • les URI javascript:fonction()
  • les évènements placés dans les attribut (<a onclick= »return foo() »>)
  • les fonctions avec le constructeur var f = new Function(« code malveillant… »)
  • data URI genre : data:text/plain;base64,ZXZpbGNvZGU=

Une liste complète de restrictions est disponible sur le wiki officiel de mozilla

Comment activer CSP sur son site?

Pour activer cette protection sur votre site, il vous suffit d’ajouter X-Content-Security-Policy dans l’entête HTTP de vos pages, voici un exemple simple pour autoriser l’exécution des scripts seulement depuis le même domaine :

X-Content-Security-Policy: allow 'self'

Un exemple pour autoriser le chargement des images depuis tous les domaines et les scripts seulement depuis api.google.com:

X-Content-Security-Policy: allow 'self'; img-src *; \
script-src api.google.com

Notifications

L’avantage de CSP c’est qu’il possède un mécanisme de notification permettant de notifier le webmaster lors de la violation d’une règle, la notification est sous forme d’un rapport que le navigateur envoie via une requête HTTP POST en XML, et contient les entêtes HTTP de la requête effectuée par le client, l’url bloqué, la directive violée et le site de provenance! de cette façon administrateur du site pourra détecter les défaillances et d’éventuels problèmes de sécurité qui peuvent menacer son site!

Voici le schéma d’une requête de notification :

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="csp-report">
<xs:complexType>
<xs:sequence>
<xs:element name="request" type="string" use="required" />
<xs:element name="request-headers" type="string" />
<xs:element name="blocked-uri" type="string" />
<xs:element name="violated-directive" type="string" use="required" />
<xs:element name="original-policy" type="string" use="required" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Exemple de rapport lors de l’appellation d’un script depuis un domaine non autorisé (attacker.ltd)

<csp-report>
<request>GET /page.php HTTP/1.1</request>
<request-headers><![CDATA[
Host: domain.ltd
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr-fr,fr;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
]]></request-headers>
<blocked-uri>http://attacker.ltd/evilscript.js</blocked-uri>
<violated-directive>script-src self</violated-directive>
<original-policy>allow none; script-src *, allow self; script-src self</original-policy>
</csp-report>

On peut placer l’entête dans une balise méta dans le <head>:

<meta http-equiv="X-Content-Security-Policy" content="listedesrestrictions" />

en PHP

Header("X-Content-Security-Policy: listedesrestrictions");

CSP est une très bonne initiative pour luter contre les attaques XSS, il est nativement implémenté dans la navigateur Firefox à partir de la version 3, c’est principalement conçu pour nous assurer une meilleure sécurité, tout de même il ne faut pas penser que c’est la fin des XSS! il y aura sans doute des méthodes pour le contourner CSP, sinon je trouve que c’est bien pensé de la part des équipes Mozilla, c’est du beau boulot!

Viva Firefox ;)

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap

Enchainer plusieurs animations avec jQuery

Posted: 23rd septembre 2009 by Mohammed CHERIFI in Tutoriaux
Tags: , ,

Bonjour à tous!

Savez vous qu’avec jQuery il est possible d’enchainer plusieurs animations à la fois dans une seule instruction? alors la réponse est OUI, on peut même aller plus loin avec un peu d’imagination et c’est vraiment très facile à mettre en œuvre! En fait chaque méthode dans jQuery retourne l’objet lui-même, ainsi on peut enchaîner à une autre méthode :

Exemple :

<script type="text/javascript">// <![CDATA[
jQuery(window).ready(function(){
$('#testcode1').click(function(){
$('#mondiv').animate({width:'200px', fontSize: "18px", borderWidth:'3px', marginLeft:'100px', opacity:'0.8', padding:'10px'},2000)
.animate({width:'120px', marginLeft:'0', fontSize: "12px", borderWidth:0, opacity:'1', padding:'0'},2000);
return false;
});
});
// ]]></script>
<a id="testcode1">Tester le code</a>
<div id="mondiv" style="border: 1px solid #ffffff; background: #077f2e none repeat scroll 0% 0%; width: 120px; height: 120px;">Un div de test</div>


Resultat
Tester le code

Un div de test

La fonction animate() est une fonction native en jQuery, elle permet d’animer les propriétés CSS d’un objet jQuery dans une durée bien déterminée , la syntaxe comme dans l’exemple si-dessus est très simple!

On peut animer une seule, ou plusieurs propriétés CSS à la fois! Par exemple pour animer la largeur d’un div ayant l’id test et la mettre à 300px sur 2secondes le code sera :

$('#test').animate({width':'300px'},2000);

Ainsi on peut enchainer autant qu’on veux, le reste dépend de votre imagination ^^, à noter que la durée de l’animation (2000) est en millisecondes, d’où 1 seconde = 1000 ms

Un autre Exemple d’enchainement d’animation

Dans cette exemple, on va animer un div ayant un arrière plan rouge, et une image d’étoile pour construire le drapeau du maroc à la fin de l’animation

Voir le resultat

Code

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
<!-- 	www.mcherifi.org -->
	jQuery(window).ready(function(){
		$('#animationlink').click(function(){
			$('#mondiv').animate({left:'400px', opacity:'0.3', width:'40px', height:'70px', borderWidth:'20px'}, 1500)
				.animate({top:'300px', opacity:'0.8', left:'100px', width:'70px', height:'70px', borderWidth:'7px'}, 1500)
				.animate({top:'160px', opacity:'0.4', left:'500px', width:'170px', borderWidth:'3px'}, 1200)
				.animate({top:0,  opacity:'0.2',  left:0, width:'200px', height:'200px', borderWidth:'1px'}, 700)
				.animate({opacity:'1', borderWidth:'2px'}, 1000);

			$('#monetoile').css('opacity', 0).animate({left:'500px', top:'400px', opacity:'0.5', height:'80px', width:'100px'}, 1300)
				.animate({left:'260px', top:'250px', opacity:'0.8'}, 1000)
				.animate({left:'100px', width:'0', opacity:'0.2'}, 1200)
				.animate({width:'154px', top:'100px', left:'150px', opacity:'0.5'}, 1000)
				.animate({left:'30px', height:'135px', width:'154px', top:'30px', opacity:'1'}, 1200);

			return false;
		});
	});

</script>
<title>Mohammed CHERIFI - Enchainement d'une animation sous jQUery</title>
<style type="text/css">	

	#contenaire{
		position:relative;
		margin:10px;
	}

	#mondiv{
		background:#f00;
		width:150px;
		height:150px;
		border:1px solid #077F2E;
		position:absolute;
	}

	#monetoile{
		position:absolute;
		display:none;
	}

</style>
</head>
<body>

	<a href="#" id="animationlink">Animaer</a><br />

	<div id="contenaire">
		<div id="mondiv"></div>
		<img id="monetoile" src="star.gif" alt="I Love Morocco" width="154" height="135"/>
	</div>

</body>
</html>

Télécharger le code source de l’amination

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap

Aid moubarak said à tous!

Posted: 21st septembre 2009 by Mohammed CHERIFI in Actualités
Tags: ,

Bonjour à tous!

Il fait beau aujourd’hui, j’ai pas dormis pendant toute la nuit, une nuit blanche à attendre l’arrivé du jour pour sortir acheter un demi kilo de beignets marocains, voir le sourire sur les visages des petits enfants, s’échanger le salut avec mes voisins et savourer ces instants de félicité et de bonheur, enfin chez soit! toutes les familles se rassemblent, tous les êtres chers sont là: c’est aîd alfitr!

Et oui! un jour pas comme les autres, c’est la fin du RAMADAN, c’est le retour du rythme habituel! on voie clairement la joie sur tous les visages! certains attendais ce jour avec impatience.. pour enfin se permettre de faire la fête! Il est évident que c’est également le jour des meilleurs ventes d’alchool dans les supermarchés ^^ , d’autre part les gentils se sont réveillés tôt pour la prière de l’aîd!

Bref! Que vous soyez parmis les gentils ou les « zehwanis » , joyeuse fêtes à vous tous ! faut pas faire la fête tous les jours ^^

AID MOBARAK SAID!

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap

mysql column truncation

Hello les amis !

Aujourd’hui, je vous parlerai d’un nouveau type de faille, il s’agit de MySQL column truncation!

Pendant que les failles du types SQL Injections restent parmi les vecteurs d’attaque les plus discutés sur le Web, il existe un autre genre qui a été discuté pour la première fois par Stefan Esser, ce dernier a illustré son exploitation dans un bug reporté sur bugtraq affectant wordpress!

Comment ça marche ?

Par défaut, la comparaison de deux chaine de caractère dans MySQL ne se fait pas en mode binaire, ceci se fait en « relaxed mode », ce mode compare deux chaines on ignorant les espaces et les caractères nuls de la fin de la chaine, du coup, pour mysql, la chaine de caractères ‘admin’ est égale à ‘admin ‘! .

De ce fait mysql refusera d’enregistrer un nouvel utilisateur qui essaie de s’incrire avec ‘admin ‘ (admin+espace) ce qui est tout à fait logique!

Ou est le problème?

Pour illustrer le problème on immagine l’application suivante:

  • Un forum de discution ou un blog ou tous le monde peut s’enregistrer
  • Le champs username de la table utilisateurs est limité à 16 caractères
  • L’administrateur du forum est ‘admin’
  • MySQL est utilisé dans le mode par défaut
  • Pas de vérification sur la longueur du nom d’utilisateur

Qu’est ce qui se passe si on essaie de créer un compte avec comme nom d’utilisateur ‘admin xD’ (admin+11 espaces+xD) et un mot de passe ‘p455wd’:

MySQL va cherche si il existe un utilisateur avec comme username ‘admin xD’, et comme aucun utilisateur ne l’as pris l’application va l’accepter et continuera pour inserer le nouvel utilisateur dans la base.

La chaine du nom d’utilisateur fait 18 caractères (admin+11 espaces+xD), mySQL va automatiquement tronquer les deux dernier caractères (xD) car le champ username est limité à 16 caractères, ce qui donnera ‘admin ‘ (admin+11 espaces), ce dernier sera accepté par l’application et inséré dans la table d’utilisateurs, on aura donc deux utilisateur avec le même login ‘admin’ (rappellez vous que la comparaison en mysql dans le mode par défaut ne prends pas en compte les espaces!).

Dans ce cas, un problème de sécurité potentiel peut affecter l’application, en dépendance de la façon dont elle traite le champ username!

Exemple d’une application vulnérable:
Connexion :

if(!empty($_POST['username']) && !empty($_POST['password']){
$username = $_POST['username'];
$password= $_POST['password'];
if(login($username,$password)){
$userdata = getUserInfoByLogin($username);
}
}

la fonction getUserInfoByLogin()


function getUserInfoByLogin($username){

$query = mysql_query("SELECT * FROM utilisateurs WHERE username = '$username");

$userinfo= mysql_fetch_array($query);

return $userinfo ;

}

Espace membre


if($userdata['username'] == 'admin'){

//espace privé : console d'administration

}

else{

// espace membre!

}

Resultat:

Puisque l’attaquant a un compte avec le login ‘admin ‘, il pourra se connecter à ce dernier avec le passe ‘p455wd’ ! et puisque l’enregistrement du vrai administrateur est le premier en base, celuila sera retourné ! et l’attaquant aura accès à l’espace administrateur du forum!

Ceci est juste une illustration, la faille peut se présenter différemment sur une application web,je cite là wordpress qui était le premier victime de ce type de vulnérabilités!

Comment sécuriser mon application?

Toujours vérifier la longueur des champs sensibles (comme username dans notre exemple), et interrompre l’exécution de votre application si cella dépasse la longueur maximale configurée dans votre table mysql!

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap

Ruben Unteregger

Ruben Unteregger

Ruben Unteregger vient de publier le code source de Peskyspy, un cheval de troie pour Skype, le trojan permet le monitoring de tout appel entrant ou sortant d’une machine infectée, d’enregistrer ces conversations et les convertir au format MP3, puis les crypter et les envoyer au serveur de le l’attaquant!

Pendant 7 ans, Ruben Unteregger travaillait en tant qu’ingénieur logiciel pour une société suisse (ERA IT Solutions) , son job était de programmer un malware pour pénétrer des ordinateurs privés et espionner les communications VOIP, étant couvert par le gouvernement suisse, Ruben Unteregger est légalement resté le propriétaire des droits du code source du trojan, et a décidé de le rendre publique.

Comment Peskyspy procède-t’il?

Une fois exécuté sur la machine, PeSkyspy injecte un composant (Skype-TAP) dans Skype, ce composant utilise les API Windows qui se chargent de la gestion des entrées/sorties audio, ainsi ce dernier peut capturer l’ensemble des données audio transitant entre le processus Skype.exe et les périphériques audio sous-jacents, ces données seront extraites au format PCM (Pulse Code Modulation) puis convertis au format MP3, et finalement transmises au serveur de l’attaquant, ce dernier se connectera à son serveur et récupèra les fichiers MP3 de toutes les conversations enregistrées!

En effectuant l’écoute directement sur les périphériques audio du système d’exploitation, la capture des données audio reste indépendante du protocole utilisé par Skype, même si ce dernier change de méthode de cryptage de conversation le trojan reste toujours fonctionnel ;)

Code Source :

Entièrement codé en C++, le code source de PeSkyspy a été publié sur le site megapanzer. Comme a précisé son auteur, le code est d’une extrême simplicité et reste une bonne référence pour les apprentis! cependant sa publication peut représenter un danger réel pour les entreprises utilisant Skype comme moyen de communication avec l’extérieur, notamment les société d’off-shoring!

Voilà! je vous laisse avec le code source de PeSkyspy, bonne lecture !

Télécharger ici le code source de PeSkyspy

Lien alternative

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap

Retour des flammes: La police australienne piratée

Posted: 22nd août 2009 by Mohammed CHERIFI in Actualités

La police fédérale australienne vient de traverser une crise de sécurité, au sein d’un combat « titanesque » contre un groupe de pirates. Lancée sur les traces d’un site regroupant des milliers de personnes autour de technique de « hacking », la police a fini par mettre la main sur de nombreuses preuves, mais a du subir un retour de flammes conséquent.

Le site en question est le forum « r00t-y0u », célèbre dans le monde des pirates puisqu’on y trouve des outils et des techniques pour permettre différentes fraudes via Internet notamment. Tout récemment, les habitués du forum ont eu la surprise de voir un message sur la page d’accueil : un joli texte écrit par la police elle-même et déclarant que le site était sous la surveillance des forces de l’ordre et que les adresses IP des membres avaient été enregistrées. Au moment de la publication du message, les identifications étaient en cours. Bien entendu, le forum n’était plus accessible.

74607-hackers
Mais selon des informations révélées par The Age, les pirates ont réagi. Peu de temps après la saisie du forum, un hacker s’est introduit dans les ordinateurs de la police, et c’est là que les choses deviennent « amusantes ». L’AFP (Australian Federal Police) a indiqué qu’il n’y avait eu qu’une seule machine touchée, mais l’auteur de la manipulation s’en est clairement donné à cœur-joie au rayon moquerie.

Passablement excité/agacé/vexé/amusé, le hacker ne serait autre que l’administrateur de r00t-y0u, un dénommé H1t3m, très connu dans le monde du piratage informatique. Il s’est introduit dans l’un des serveurs de l’AFP et leur a littéralement ri au nez en se moquant de leur configuration Windows mal paramétrée et surtout de leur base de données MySQL… qui ne possédait aucun mot de passe.

Via un site de publication anonyme de documents (Pastebin.com), le hacker a lancé un message de la police leur indiquant qu’il n’y avait pas de quoi parader après le blocage du forum r00t-y0u : au lieu d’une communauté internationale de pirates chevronnés, ils avaient surtout pris quelques « script kiddies » dans leurs filets, autrement dit des pirates débutants. Dans un autre message, il fournissait des captures d’écran prouvant qu’il avait bien pénétré le serveur de la police.

Pour la police, il n’y a aucun danger. Le serveur en question était apparemment un pot de miel, c’est-à-dire un leurre pour attirer les pirates. Les données contenues dans la base n’étaient que d’anciennes fausses identités ou des informations relatives à d’anciens cas de piratages. Mais cela n’a pas empêché le hacker de continuer à rire, indiquant qu’il ne lui avait fallu que 30 à 40 minutes pour entrer dans le serveur et se servir dans la base de données.

Actuellement, les identifications de l’AFP sont toujours en cours et les accusations officielles restent à déposer. Pour l’instant, H1t3m, si c’est bien lui, court toujours.

Source : PCIntact

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap

Un framework JavaScript c’est quoi?

javascriptUn framework JavaScript est un ensemble d’applications et de fonctionnalités regroupés, c’est une sorte de boite à outils qui contient toutes les tâches répétitives et courantes, grâce aux frameworks, vous pouvez gagner beaucoup de temps dans vos développements, vous pouvez facilement manipuler le DOM, faire des requêtes AJAX, des animations et des effets superbes sur vos pages, et vous aurez tout le temps de vous concentrer sur des taches plus complexes et assez intéressantes ;)

Actuellement il existe plus de 500 frameworks JavaScript , ces frameworks qui ne cessent d’évoluer depuis l’apparition du WEB2.0

Faire du WEB2.0!

Il faut savoir que le WEB2.0 est concrètement basé sur le JavaScript du point de vue technique! particulièrement grâce à sa capacité de faire des appels asynchrones vers les serveurs WEB via l’objet XMLHttpRequest, inventé par Microsoft en 2001, ce dernier permet aux visiteurs d’accéder aux nouveaux contenus sans avoir à cliquer ou rafraichir la page, cette fonctionnalité a été implémenté dans le DHTML pour donner naissance au WEB2.0.

Cette expérience a permis de donner une nouvelle vision au WEB, qui est devenu de plus en plus dynamique, réactif et innovant

Pallier aux déficiences des navigateurs actuels

S’assurer que son code javascript est compatible avec tous les navigateurs modernes est l’une des tâches les plus pénibles pour un développeur WEB (cross-browsing), d’où le grand avantage des frameworks javascript: vous n’avez plus à gérer les dépendances entre les différents navigateurs (sélecteurs, gestion des évènements, méthodes de manipulation DOM..), votre framework javascript le fera à votre place et vous facilitera la vie ;)

Quel framework JavaScript utiliser?

Voici une liste des frameworks JavaScript les plus populaires :

Vu la qualité des outils proposés par les différents frameworks, il est difficile de recommander un en particulier, mais personnellement je préfère jQuery puis mootools grâce à leurs qualité de documentation, leurs communautés très large, et leurs simplicité!

Vous pourriez préférer d’autres mais je vous invite à les essayer tous et utiliser celui avec lequel vous vous sentez plus à l’aise!

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap