Introduction à Yahoo! Query Language (YQL)

Yahoo! Query Language

Yahoo! Query Language

Yahoo! Query Language, baptisé YQL est un nouveau langage développé par Yahoo, semblable à SQL, ce dernier permet d’effectuer des requêtes, ordonner, filtrer et combiner des données en provenance de tout le réseau internet et “Web Services” ! Ces informations sont récupérées sous format XML ou JSON !

En effet, pour développer une application qui utilise un WEB service, les développeurs sont souvent amenés à reconnaitre les bons URL d’APIs et recourir à la documentation pour faire appel à chacun de ces derniers , sans oublier de rester prévisible à une future modification de ces derniers, d’où l’intérêt de YQL ;)

L’idée derrière la création de ce nouveau langage est de faciliter aux développeurs l’accès aux services web, ainsi ils peuvent accéder et récupérer facilement les données via un seul langage sans se référer aux différents APIs, notre ami Yahoo s’occupera des mises à jours si il y en aura!

Les fichiers de base de données YQL sont en fait de gros fichiers XML qu’on peut interroger facilement via une seule ligne, et comme c’est ouvert tout utilisateur peut proposer sa base YQL!

J’ai eu le temps de faire un tour sur le site de YQL, et ce que je trouve avantageux dans ce nouveau langage est sa facilité d’utilisation du fait qu’il est basé sur des instructions similaires à SQL comme SELECT, DESC, SHOW..

Quelques exemples de commande YQL:

Récupérer les informations géographiques de la ville de Rabat (Maroc):

[code lang=’sql’]select * from geo.places where text=”Rabat”[/code]

Récupérer les références des photos sur flickr contant le text “Maroc”

[code lang=’sql’]select * from flickr.photos.search where has_geo=”true” and text=”Maroc”[/code]

Pour interroger une base YQL externe il suffit de l’appeler avec la command use !

Exemple pour récupérer les derniers twitts de mcherifi:

[code lang=’sql’]use ‘http://github.com/spullara/yql-tables/raw/a2f518a10ccdca99658f14bee9101b77d7b4cf08/twitter/twitter.user.status.xml’ as twittertable;
select * from twittertable where id=’mcherifi’;[/code]

On définit la source de la base YQL distance avec la commande “use”, on donne un alias à cette dernière grâce à “AS” et on effectue notre sélection, à noter que le nom des champs n’est pas toujours le même et on peut le connaitre avec la commande : DESC nom_table

Il est également possible de faire des jointures et utiliser des sous requêtes, par exemple cette requête recherche tous les événements depuis Yahoo Events dont le texte contient “Morocco”

[code lang=’sql’]select name,start_date from upcoming.events where woeid in (select woeid from geo.places where text=”Morocco”) | sort(field=”start_date”)[/code]

Yahoo a également introduit les commandes de manipulation de données (INSERT/UPDATE/DELETE) que je détaillerai dans un prochain billet.

Vous pouvez vous amuser à découvrir ce nouveau langage en vous rendant sur la console YQL sur cette adresse : http://developer.yahoo.com/yql/console/

Je vous invite également à visiter le site de YQL, qui est à mon avis un projet prometteur qui fera évoluer le web!

MD5Spider, Reversing d’un hash MD5

Parmi les grands avantages de l’algorithme de hachage MD5 est le fait qu’il est irréversible, autrement dit à sens unique, du coup même si on connais la sortie, il est difficile de trouver l’entrée qui a produit cette sortie.

C’est pour cette raison que la fonction MD5 est fréquemment utilisée pour sécuriser les mots de passes dans les bases de données! en effet plusieurs CMS réputés ,comme Joomla/Drupal/OsCommerce etc.. , l’utilise comme solution de cryptage de mot de passes des utilisateurs.

La recherche autour du reversing de l’algorithme de hashage MD5 est toujours active, or à ce jour, on a pas encore parvenu à le casser! par contre il existe des outils qui permettent de bruteforcer un password, d’où le brutfeorcing est un type d’attaque qui a pour principe de tenter toutes les combinaisons possibles jusqu’à ce qu’il tombe sur le bon passe! du coups ça risque de prendre des jours voir des années si le passes est long ou contient des caractères spéciaux.

Parmi les outils que je vous recommande :

Les tests de performances on été effectués sur une machine avec un processeur Quad Core QX6700 (2.66Ghz) supporté par 4Go de RAM DDR2, une carte graphique Nvidia 8800GTX le tout sur carte mère basée sur un chipset Intel P45.

Et comme on a pas toujours le temps de bruteforcer des passwords et que ça demande un matériel puissant pour plus de rapidité, des “MD5 Reverse Databases (MD5RDB)” sont apparus sur la toile, leurs principe est de rassembler un nombre immense de correspondances (plaintext/hash) dans une table remplie à partir d’un dictionnaire, des passes déja crackés ou de mots contenu dans une page web, le remplissage est souvent automatisé comme il peut se faire manuellement par les utilisateurs, ainsi on peut questionner la base de données sur un md5 et cette dernière nous retourne son plaintext si il est connu.

il existe sur internet beaucoup de site MD5RDB qui offrent ce service gratuitement qui deviennent de plus en plus nombreux, la raison pour laquelle j’ai conçu MD5Spider: un petit script en PERL qui permet d’interroger une bonne dizaines de sites offrant ce service et récupérer le plaintext du hash si il existe dans leurs bases de données, ça vous permettra de gagner du temps avant de penser au bruteforcing de vos passes .

Voici à quoi ça ressemble son éxecution en ligne de commande :

md5spider

Ci-dessous le code source :
[code lang=’perl’]#!/usr/bin/perl

print q(
/—————————————————\
| MD5 Spider 1.0 |
| Mohammed CHERIFI – [email protected] |
\—————————————————/
);

use IO::Socket;

sub findme()
{
my $md5 = $_[0];
my $host = $_[1];
my $uri = $_[2];
my $pdata = $_[3].$md5;
my $regexp = $_[4];
$datalen = length $pdata ;

syswrite STDOUT, “\n\n\tRecherche sur $host”

my $sock = new IO::Socket::INET (
PeerAddr =”$host”,
PeerPort =80,
Proto =”tcp”
);

if(!$sock){
print ” [!] Connection time out : $!\n”;
return false;
}
else
{

print $sock “POST /$uri”.”$md5″.” HTTP/1.1\n”;
print $sock “Host: $host\n”;
print $sock “Referer: $host\n”;
print $sock “Accept-Language: en-us\n”;
print $sock “Content-Type: application/x-www-form-urlencoded\n”;
print $sock “User-Agent: MorX-Zilla\n”;
print $sock “Connection: Keep-Alive\n”;
print $sock “Cache-Control: no-cache\n”;
print $sock “Content-Length: $datalen\n\n”;
print $sock “$pdata\n”;

while ($answer = <$sock>)
{
if ($answer =~ /$regexp/ )
{
print “Cracked ! \n\n\n\t”
sleep(1);
print “Le plaintext est : “.$1.”\n\n\t”;
print “[+] Merci $host :P Enjoy ;) \n\n”;
exit(0);
}
}
close($sock);
}
}

print q(
Etrez le hash MD5
Example : b2f3d1e0efcb5d60e259a34ecbbdbe00
hash MD5: );
$hash=$_1;
chomp ($hash);
unless($hash =~ /[0-9a-fA-Z]{32}/) {die “n’est pas un md5 :-/ !\n”};
print “Recherche en cours ….\n”;

@sites = (
[“passcracking.ru”,”/index.php?xD=”,”datafromuser=”,”lor=#FF0000>(.*?)<\/td>.*?<\/td><\/"], ["md5.benramsey.com","/md5.php?hash=","","TA.(.*?)..><\/s"], ["md5.noisette.ch","/md5.php?hash=","","TA.(.*?)..><\/s"], ["gdataonline.com","qkhash.php?mode=xml&hash=","","t>(.*?)<\/re"], ["md52.altervista.org","index.php?md5=","","d: .*?ed\">[^\[](.*?)<\/font><\/b"] ); $siteindex = 0; foreach (@sites){ $site = $sites[$siteindex][0]; $uri = $sites[$siteindex][1]; $pdata = $sites[$siteindex][2]; $regex = $sites[$siteindex][3]; findme($hash,$site,$uri,$pdata,$regex); $siteindex++; } print "\n\nash introuvable! John est ton ami ;)\n\n"; [/code] Télécharger md5spider.pl

Comment contourner un .htaccess?

L’objectif de ce tutorial est d’expliquer une faille qui a été découverte dans les .htaccess, cette faille qui affecte un nombre importants de sites qui utilisent les fichiers .htaccess comme solution afin de restreindre l’accès à certains fichiers sensibles!

Apache c’est quoi?

Apache HTTP Server, souvent appelé Apache, est un logiciel de serveur HTTP produit par l’Apache Software Foundation. il permet tout simplement d’héberger un site web, il peut évidement tourner sur plusieurs plateformes, sur un total de 182 millions de sites, Apache est utilisé pour 91,5 millions, contre 62,8 millions pour Microsoft IIS.

Un .htaccess à quoi ça sert?

un .htacces est un fichier interprété par le serveur apache qui agit sur le répertoire dans-lequel il se trouve, il est généralement utilisé pour protéger l’accès à un répertoire ou un fichier par un mot de passe, définir les pages d’erreurs personnalisées, gérer la réécriture d’url, définir les mime-type et encore plus…, mais ce qui nous intéresse le plus dans ce tutoriel, c’est restriction d’accès à un répertoire ou un fichier.

Problème :

Parmi les utilités d’un .htaccess, il existe la directive LIMIT qui permet de restreindre l’accès à certains parties sur un site web, en effet cette protection peut facilement être contournée si elle n’est pas correctement mise en place

Exemple :

On considère que nous avons un serveur web local et qu’on veut restreindre l’accès au répertoire /sercret/ , on y met un .htaccess contenant le code suivant :

[code lang=’plain’]AuthUserFile /repertoire/de/votre/fichier/.htpasswd
AuthName “Accès protégé”
Require valid-user
AuthType Basic[/code]

Ce fichier permet d’indiquer à Apache de refuser toute requête GET ou POST si l’utilisateur n’est pas identifié avec un login et un mot de passe apparaissant dans le fichier .htpasswd

Pour accéder à ce dossier, nous appelons l’url http://localhost/secret/ via un navigateur web .
La requête envoyée ressemblera à :

[code lang=’plain’]GET /secret HTTP/1.1
Host: localhost
Connection: close[/code]

on aura le prompt qui nous demandera les identifiant pour accéder au dossier, jusque là tout est normale, le serveur apache ne fait qu’interpréter la requête qu’on lui demande.

maintenant imaginons qu’on envoie une requête différente de GET et POST

Exemple :

[code lang=’plain’]AuthUserFile /repertoire/de/votre/fichier/.htpasswd
AuthName “Accès protégé”
Require valid-user
AuthType Basic
Deny from all
[/code]

Dans ce cas Apache interprétera la requête et n’affichera aucune erreur, bien qu’on a pas utilisé GET ou POST qui sont restreint grâce à la directive LIMIT, apache agira gentiment et nous affichera le contenu du répertoire /secret/ ;)

Logiquement apache est censé interdire l’accès à tout ficher dans le répertoire concerné, le soucis c’est que cette protection est appliqué seulement si le navigateur appelle la page via GET ou POST, par defaut nos navigateurs appellent implicitement les page avec des recettes GET, pour contourner cette protection, il suffit de se servir d’un outil comme NetCat ou bien LiveHttpHeaders (Extension Firefox) on modifiant le GET par n’importe koi et vous hop vous aurez le contenu de la page qui s’affichera :)

Comment se protéger ?

c’est assez simple, n’utilisez pas la directive LIMIT dans vos .htaccess pour restreindre l’accès à vos fichiers sensibles, virez les lignes <Limit> … </Limit> de tous vos fichiers .htaccess, ça vous évitera ce genre de problèmes