Kévin Subileau

Espace personnel

eclipse-super-lune

Eclipse totale de Super-Lune du 28 septembre 2015

Dans la nuit du 27 au 28 septembre, entre 3 h et 7 h (heure française, UTC+2), une éclipse totale de Super-Lune s'est produite. Cet événement est le résultat d'une rare combinaison de deux phénomènes. D’une part, le Soleil, la Terre et la Lune étaient alignés sur le même axe. Cette situation plonge la Lune dans l’ombre de la Terre, provoquant une éclipse totale de Lune. Mais d’autre part, au même moment, la Lune était aussi pleine et à son périgée, c'est à dire au plus proche de la Terre. L'astre apparaissait donc plus gros et plus brillant que d'habitude.

L'avantage d'une éclipse lunaire par rapport à une éclipse solaire est que l'observation ne nécessite aucun équipement de protection particulier, ni pour les yeux, ni pour l'appareil photo. Il m'a donc suffit de sortir en pleine nuit, équipé d'un bon trépied et de mon bridge Sony DSC-HX200V, pour prendre quelques photographies de cet événement, dont je vous propose une sélection dans cet article. Vous pouvez cliquer sur les images pour les voir en plus grand format.

23 h 12 : La Super-Lune

Le ciel est dégagé, la Lune est très lumineuse et nous offre une nuit très claire. Du coup, peu d'étoiles sont visibles à l’œil nu. Toutes les conditions sont réunies pour permettre l'observation de l'éclipse prévue 4 heures plus tard.

Lire la suite →

redresser-pdf-numerise

Redresser un document PDF numérisé avec Acrobat Pro

J'ai l'habitude de numériser la plupart des documents papiers que je reçois pour pouvoir les archiver, les retrouver et imprimer des copies plus facilement. Pour cela, j'utilise souvent le chargeur automatique de document de mon scanner, mais celui-ci à la fâcheuse tendance à numériser un peu en biais, ce qui n'est pas très propre.

J'ai donc recherché une solution simple pour corriger l'inclinaison de mes documents PDF numérisés, et j'ai finalement trouvé cette méthode utilisant Adobe Acrobat Pro (à ne pas confondre avec Acrobat Reader, Adobe Reader, ou Acrobat Reader DC).

Tout d'abord, ouvrez le document que vous souhaitez redresser sous Acrobat Pro. Ensuite, cliquez sur Outils (1) pour ouvrir le panneau latéral correspondant. Si le volet Traitement du document n'est pas présent, ce qui est le cas par défaut, cliquez sur la petite icône (2) en haut à droite du panneau latéral pour faire apparaitre un menu déroulant, comme le montre la capture ci-dessous.
adobe-acrobat-tools-panel

Dans ce dernier, parmi la liste des panneaux proposés, sélectionnez Traitement du document. Vous pouvez également ouvrir ce panneau en passant par le menu principal via Affichage, Outils puis Traitement du document.
adobe-acrobat-document-processing-panel

Déroulez le panneau Traitement du document si ce n'est pas déjà fait puis cliquez sur Optimiser le fichier PDF numérisé.
adobe-acrobat-optimize-scanned-pdf

Sur la nouvelle fenêtre qui s'affiche, décochez les cases Compression adaptative (1) et Indexation (ROC) (2) puis cliquez sur le bouton Modifier (3) de la section Filtres.
adobe-acrobat-optimize-scanned-pdf-2

Assurez-vous que le redressement est activé puis cliquez deux fois sur OK. Vous pouvez également essayer les autres optimisations proposées comme la suppression de l'arrière-plan, le détramage ou l'amélioration de la netteté du texte.
adobe-acrobat-optimize-scanned-pdf-filters

Et voilà, avec ça vous devriez pouvoir corriger tous les défauts d'inclinaison de vos documents numérisés. Personnellement je regrette un peu qu'il n'y ait pas un mode "manuel" où l'on pourrait indiquer directement une valeur en degrés, mais ce traitement automatique fonctionne tout de même plutôt bien.

wordpress-hack

Local file disclosure vulnerability in Crayon Syntax Highlighter

I discovered a local file disclosure vulnerability affecting all versions before 2.7.0 of Crayon Syntax Highlighter, a popular syntax highlighter built in PHP and jQuery. According to wordpress.org, the vulnerable versions of this WordPress plugin are installed on more than 40,000 websites.

This critical vulnerability allows remote attackers to read arbitrary files on server's file system, even outside the web root. This includes PHP source code, configuration files and system files as /etc/passwd or wp-config.php for example. Furthermore, as you will see below, authentication is generally not required to exploit this vulnerability. Of course, the web server must have read access on the target files.

I tested a few versions between the old 1.10 to the latest 2.6.10, with a freshly installed WordPress 4.1 and the default configuration, and all tested versions were vulnerable. This means that the vulnerability exists since at least 3 years.

Technical analysis

Crayon Syntax Highlighter can highlight from a URL, inline code, or a local file. Here are some examples of normal markup that could be put inside post content in order to highlight code from these three source types:

<!-- Inline code -->
<pre class="lang:php">
    <?php //code to highlight here ?>
</pre>

<!-- URL -->
<pre class="lang:java" data-url="http://example.com/class.java"></pre>

<!-- Local file - the interesting case -->
<pre class="lang:java" data-url="/java_sample/class.java"></pre>

In the local file case, by default, the path given in the data-url attribute is relative to the WordPress root directory. In the plugin settings page, the user can also specify a sub-folder from which this relative path should start. But, as you can see below in this piece of code extracted from crayon, the problem is that there is absolutely no control over the file type or the path given (stored in the variable $url).

// Try to replace the site URL with a path to force local loading
if (strpos($url, $site_http) !== FALSE || strpos($url, $site_path) !== FALSE ) {
    $url = str_replace($site_http, $site_path, $url);
    // Attempt to load locally
    $local = TRUE;
    $local_url = $url;
} else if (empty($scheme)) {
    // No url scheme is given - path may be given as relative
    $local_url = preg_replace('#^((\/|\\\\)*)?#', $site_path . $this->setting_val(CrayonSettings::LOCAL_PATH), $url);
    $local = TRUE;
}
// Try to find the file locally
if ($local == TRUE) {
    if ( ($contents = CrayonUtil::file($local_url)) !== FALSE ) {
        $this->code($contents);
    } else {
        // [...]
    }
}

The given path is simply prepended with the base path at line 79, and then the file's content is loaded at line 84 (the method CrayonUtil::file just calls the function file_get_contents). So, for example, assuming that the administrator hasn't modified the standard WordPress file structure and with the default settings, it's possible to get the database credentials and WordPress secret keys simply by putting the code below inside a post or page content:

<pre data-url="/wp-config.php"></pre>

You can also use a directory traversal attack to reach the root directory and get the content of /etc/passwd for example:

<pre data-url="/../../../../../../../../../../../../../../../../../etc/passwd"></pre>

Of course it's also possible to get the content of theme's source files, .htaccess and .htpasswd files, log files, and other files that could contain highly sensitive information.

But so far, I told you that these exploits must be put inside a post or page, so normally this requires authentication. But the real issue is that unauthenticated visitors can also exploit the vulnerability simply by posting a comment containing the same malicious markup (except when an alternative comment system is used, as Disqus). It's because Crayon can also highlight inside comments, and this feature is enabled by default. This is why I say that authentication is generally not required to exploit this vulnerability.

Even if comments are moderated before publication, the issue remains the same because WordPress display the comment to its author before moderation with a message like "Your comment is awaiting moderation.". So the file content is revealed before the administrator can delete the malicious comment.

You can see bellow a screen capture showing the exploit in action, both inside the post content and a comment before moderation:

Disclosure of /etc/passwd and wp-config.php (click to enlarge)

Disclosure of /etc/passwd and wp-config.php (click to enlarge)

Vendor response

I sent the initial report of the vulnerability to the plugin author on January 4. He replied quickly and confirmed the issue.

On April 5, he informed me that he had patched the issue. Finally, on April 13, he released the version 2.7.0, which includes this patch.

I thank him for his cooperation and his excellent work.

Remediation

The preferred solution is to update quickly to the latest version (>= 2.7.0), which fix the vulnerability by removing support of local file highlighting.

In the event where you really cannot install the update, an alternative way to limit risks is to disable Crayon in comments, in order to prevent attacks from unauthenticated visitor. But it will still be possible to exploit the vulnerability through a post or page content...

Disable Crayons in comments to prevent unauthenticated attacks

Disable Crayons in comments to prevent unauthenticated attacks

CVSS Score

I evaluate the CVSS Score at 7.8 (AV:N/AC:L/Au:N/C:C/I:N/A:N).

References

Secunia : #63998.
WPVDB : #7904.
OSVDB : #121278.

About me

For non-French speakers that can't read others pages about me on this blog (sorry, it's currently primarly intended to French speakers), I will introduce me briefly in English here so that you can know who am I. I'm Kevin Subileau, 23 years old. I'm not a professional security researcher (yet), but I'm a passionate in computing science, junior system & network engineer by day, and web developer by night, also interested by computing security. You can contact me by leaving a comment below (in English or French), on Twitter or by filling this form (fields are, top to bottom, name / email / subject / comment).

chrome-to-phone

Transférer facilement des pages Web d'un PC à un périphérique Android

J'ai longtemps cherché un moyen simple de transférer l'adresse d'une page Web depuis mon ordinateur vers mon smartphone Android, pour terminer ma lecture en déplacement par exemple. Jusqu’alors, je copiais l'adresse sur un service en ligne pour générer un QR-code que je flashais. On peut aussi s'envoyer l'URL par email ou la recopier manuellement. Ces méthodes fonctionnent bien, mais elles ne sont pas très pratiques.

Mais ça, c'était avant. En effet, j'ai récemment découvert une application Android gratuite, qui, combinée à une extension pour Chrome ou Firefox, permet de réaliser cette tâche d'un simple clic. Cette application, c'est Google Chrome To Phone.

Envoi de liens et de textes

Pour commencer, téléchargez et installez l'application Google Chrome To Phone sur votre smartphone ou votre tablette. Au premier lancement, l'application vous demandera le compte Google à utiliser pour le transfert.

chrome-to-phone-first-screen

Premier lancement de Chrome To Phone

Ensuite, selon votre navigateur, vous devez installer l'extension correspondante. Pour Google Chrome, ça se passe ici. Sur Firefox, elle se nomme FoxToPhone. Une fois installée, vous devriez voir apparaitre une nouvelle icône en haut à gauche de la fenêtre, comme ci-dessous.

chrome-to-phone-extension

L'icône de l'extension, sur Chrome (en haut) et Firefox (en bas)

En cliquant sur cette icône pour la première fois (puis sur le lien Connexion pour Chrome), il vous sera demandé de vous connecter à votre compte Google et d'autoriser l'application à l'utiliser pour le transfert. Bien entendu, vous devez indiquer le même compte que celui que vous avez sélectionné sur votre Android.

Voilà c'est prêt ! Désormais, si vous cliquez à nouveau sur l'icône, la page Web sur laquelle vous êtes sera automatiquement ouverte sur votre smartphone ou votre tablette. Et si c'est un lien Youtube ou Google Maps, l'application correspondante sera lancée. Y'a pas plus simple et efficace, et ça marche aussi si vous n'êtes pas relié au même réseau, y compris en 3G/4G !

Vous pouvez aussi passez par le menu contextuel en faisant un clic droit sur un lien, puis en cliquant sur Chrome To Phone (sur Chrome) ou Envoyer ce lien vers Android (sur Firefox). Pratique pour les liens pointant vers un téléchargement ;) .

Il y a juste une petite limitation : si vous utilisez l'application simultanément sur plusieurs périphériques et avec le même compte Google, les liens seront envoyés à tous les périphériques. Je n'ai pas trouvé de moyen d'en sélectionner un en particulier autrement qu'en utilisant des comptes différents.

Envoi de fichiers et de dossiers

Chrome To Phone ne permet que l'envoi de liens, de textes ou de numéros de téléphone, et uniquement dans le sens ordinateur vers Android. Si vous souhaitez en plus pouvoir envoyer aussi facilement des fichiers et dans les deux sens, vous pouvez essayer l'application Files Drag & Drop.

L'application Files Drag & Drop sur PC et smartphone

L'application Files Drag & Drop sur PC et smartphone

Le principe reste le même, vous devez installer l'application sur votre Android et sur votre ordinateur. L'avantage par rapport à Google Drive ou Dropbox est que les fichiers sont transférés directement de pair à pair, et ne passent pas par une plateforme d'hébergement ou un service tiers sur Internet. Ainsi, le transfert est plus rapide et vous pouvez envoyer des données sensibles sans inquiétude. En revanche, contrairement à Google Chrome To Phone, il est nécessaire que le smartphone et le PC soit connecté au même réseau local, et cela ne fonctionne donc pas via la 3G/4G. De plus, pour pouvoir bénéficier de toutes les fonctionnalités sans pub, vous devrez débourser 2€ pour acheter la version complète.

Voilà en tout cas des applications bien pratiques pour faciliter le transfert de données entre votre ordinateur, votre tablette et votre smartphone !

cupcake-candle-first-birthday

Bilan 2014 : deux ans déjà !

La fin de l'année 2014 arrive à grand pas et le site fête aujourd'hui ses deux ans, alors que, dans le même temps, je fête mes 23 ans ! Il est donc temps de faire un petit bilan sur la vie de ce site durant l'année 2014.

Commençons par quelques statistiques, pour voir un peu ce qui s'est passé en 2014. Et cette année, le moins que l'on puisse dire, c'est que je me suis auto-proclamé roi de la procrastination avec seulement 15 articles publiés, pour un total de 45 articles disponibles sur le site... Mais malgré cela, vous êtes toujours très nombreux à me lire, et ça, ça fait très plaisir !

Pour 2014, mon outil de statistiques (Piwik) m'indique un total de 84242 visites ! Après une forte augmentation l'an passé, la fréquentation s'est stabilisée cette année autour de 6500 visiteurs uniques par mois, comme on peut le voir sur la courbe ci-dessous :

Évolution des visites uniques par mois durant l'année 2014

Évolution des visites uniques par mois durant l'année 2014

On retrouve le même trio de tête que l'année précédente concernant les articles les plus lus. A eux deux, les articles sur le suivi d'avion en vol en direct et celui sur le cassage des mots de passe VBA totalisent toujours près de 70 % des vues uniques ! Ils sont suivis par l'article sur la configuration de la page d'accueil d'un onglet sur Firefox, avec 12 % des vues.

Du coté de la répartition des systèmes d'exploitation et navigateurs utilisés, c'est toujours le duo Windows 7 / Firefox qui l'emporte assez largement. Mais surtout, on remarque que Windows 8 arrive 4 points derrière... Windows XP ! Pour mémoire, Windows XP n'est plus mis à jour par Microsoft depuis avril 2014...

stats-2014-os-browsers

Répartition des systèmes et navigateurs utilisés en 2014

Voilà pour les chiffres. En deux ans, je trouve aussi que l'apparence du site a pris un petit coup de vieux. De plus, j'ai appris beaucoup de nouvelles techniques et de bonnes pratiques sur le développement web, en particulier l'utilisation d'outils comme CakePHP, Sass/Compass, Grunt/Gulp, Composer, PHPStorm, PuPHPet... Tout cela en grande partie grâce à Grafikart et à ses excellents tutoriels, que je tiens à remercier et que je vous recommande vivement si vous souhaitez progresser en développement Web.

Bref, tout ça pour vous dire que je travaille depuis déjà quelques mois sur un tout nouveau design, qui, je l'espère, verra le jour très prochainement. Il y a un an, je vous avez d'ailleurs déjà annoncé des nouveautés sur le site. Vous ne les avez sans doute pas vu, et pour cause, elles n'ont pas vu le jour... Pour tout vous dire, le nouveau design était même prévu pour aujourd'hui, mais force est de constater que ce n'est pas prêt et que je suis encore obligé de repousser...  Cela est dû principalement à mes études qui me phagocyte tout mon temps. Je tiens également à prendre le temps nécessaire pour mettre en application mes nouvelles connaissances et ne pas reproduire les mêmes erreurs de conception d'il y a deux ans qui me conduisent aujourd'hui à devoir repartir de zéro...

En cette fin d'année, j'ai également dû lutter contre quelques contraintes techniques. En effet, j'ai atteint mon quota de 200 Mo pour la base de données MySQL de mon hébergement mutualisé. J'ai donc dû trouver des solutions plus ou moins dans l'urgence, et j'ai finalement opté pour un serveur privé virtuel (ou VPS). Pour le moment, j'ai seulement déplacé Piwik, qui prenait beaucoup de place. Je verrai par la suite si je reste comme ça ou si je migre également WordPress.

En attendant, je vous remercie d'être toujours aussi nombreux à me lire et je vous rappelle que vous pouvez vous abonner au flux RSS pour ne louper aucun article, ou également me suivre sur Twitter.

A bientôt et joyeuses fêtes !

clock

Debounce et throttle : limiter les appels successifs à une fonction Javascript

Lorsque l'on développe une application Web réagissant à certains évènements en Javascript, comme le redimensionnement de la fenêtre, le mouvement de la souris ou la frappe au clavier, les fonctions rattachées à ces événements risquent d'être appelées très fréquemment. Si le code contenu dans ces fonctions est coûteux en ressources, cela peut ralentir considérablement l'application Web.

Pour améliorer les performances, ou plutôt ne pas les plomber, il existe deux techniques simples, appelées debounce et throttle. Toutes deux permettent de réduire le nombre d'appels à une fonction dans un intervalle de temps donné. En effet, il est souvent inutile d'exécuter ces fonctions à chaque fois que l’événement est déclenché.

Imaginons par exemple que l'on souhaite synchroniser sur le serveur, via des appels AJAX, le contenu d'un champ de saisie au fur et à mesure que l'utilisateur tape le texte (comme le fait Google Docs par exemple). Dans ce cas, plutôt que de solliciter le serveur à chaque caractère saisi ou inutilement lorsque le texte reste inchangé, il peut être plus judicieux de sauvegarder le texte toutes les 5 secondes tant que l'utilisateur le modifie, et de ne plus faire de requêtes lorsque que le texte reste inchangé. Et c'est exactement ce que la fonction throttle permet de faire.

Cependant, bien que ces deux techniques soit assez similaires, il existe une différence fondamentale dans leurs fonctionnements qu'il est important de bien comprendre pour les utiliser correctement.

Je vais donc vous présenter ces deux méthodes l'une après l'autre, en vous expliquant leurs fonctionnements et en vous donnant le code Javascript nécessaire pour les mettre en place.
Lire la suite →

windows-network

Gérer les emplacements réseaux sur Windows 7

Sur Windows comme ailleurs, il y a parfois des choses absolument pas intuitives. Parmi elles, je pense que la gestion des emplacements réseaux sous Windows 7 fait bonne figure. J'ai en effet mis du temps avant de découvrir cette fonctionnalité bien cachée.

A chaque fois que vous vous connectez à un réseau filaire ou Wi-Fi, Windows lui associe automatiquement un nom de réseau. Et lorsque vous vous connectez plusieurs fois à un même réseau, il peut arriver que Windows ajoute un nombre derrière ce nom (par exemple : Wi-Fi 1, Auversup sans Fil 2 ...), notamment lorsque vous changer de borne Wi-Fi au sein d'un même réseau. Au fur et à mesure que vous utiliser votre ordinateur, le nombre de réseaux enregistrés peut ainsi considérablement augmenter.

Pour faire un peu de ménage dans tout ça, ou tout simplement renommer ou personnaliser un emplacement réseau, il faut donc accéder à cet écran très discret de Windows 7. Lire la suite →

Git-Logo

Git - Modifier un ancien commit avant publication

Lorsque l'on travaille avec Git, en cas d'erreur sur le dernier commit comme un fichier manquant ou une portion de code resté commentée, il est simple de le modifier avec le paramètre --amend, tant que ce commit n'a pas été poussé sur le dépôt public.

Mais qu'en est-il pour un commit plus ancien ? Imaginez par exemple que vous faites deux commits et que vous vous apercevez d'une erreur sur l'avant dernier, juste avant de pousser le tout sur le dépot public. Pour corriger cette bavure, vous pouvez alors utiliser la séquence de commandes suivante.

Tout d'abord, commencez par identifier le numéro du commit que vous souhaitez modifier. Pour cela, vous pouvez utiliser la commande git log pour afficher l'historique. Disons qu'il s'agit par exemple du commit b8603aca. Utilisez ensuite la commande rebase pour revenir à ce commit :

git rebase --interactive b8603aca^

Bien évidemment, remplacer le numéro de commit par le vôtre dans la commande précédente. Dans l’éditeur de texte par défaut, remplacer pick par edit sur la ligne correspondant au commit que vous souhaitez modifier, puis enregistrez et quittez. Ouvrez ensuite votre éditeur préféré et faites les modifications nécessaires. Une fois que tout est bon, ajouter les fichiers modifiés et les nouveaux avec git add, puis modifier le commit en utilisant la commande suivante :

git commit -a --amend --no-edit

Ensuite, il ne vous reste plus qu'à restaurer les commits suivants avec la commande ci-dessous :

git rebase --continue

Résolvez les éventuels conflits et c’est tout ! Notez bien que cette méthode ne fonctionne que si les commits à partir de celui que vous souhaitez modifier n'ont pas été poussé sur le dépôt public ! Dans le cas contraire, le plus simple reste de faire un nouveau commit pour corriger les erreurs de l'ancien.