
Format de test de vulnérabilité web lisible par l'homme et la machine

explo est un outil simple pour décrire les problèmes de sécurité web dans un format lisible par les humains et par les machines.
En définissant un workflow de requêtes/conditions, explo est capable d'exploiter des failles de sécurité sans avoir besoin d'écrire un script. Cela permet de partager des vulnérabilités complexes dans un format simple, lisible et exécutable.
Exemple pour extraire un jeton CSRF et l'utiliser dans un formulaire :
name: get_csrf
description: extract csrf token
module: http
parameter:
url: http://example.com/contact
method: GET
header:
user-agent: Mozilla/5.0
extract:
csrf: [CSS, "#csrf"]
---
name: exploit
description: exploits sql injection vulnerability with valid csrf token
module: http
parameter:
url: http://example.com/contact
method: POST
body:
csrf: "{{get_csrf.extracted.csrf}}"
username: "' SQL INJECTION"
find: You have an error in your SQL syntax
Dans cet exemple de fichier de définition, le problème de sécurité est testé en exécutant deux étapes qui sont exécutées de haut en bas. La dernière étape renvoie un succès ou un échec selon que la chaîne « You have an error in your SQL syntax » a été trouvée.
pip install explo
git clone https://github.com/dtag-dev-sec/explo
cd explo
python setup.py install
explo [--verbose|-v] testcase.yaml
explo [--verbose|-v] examples/*.yaml
Quelques exemples de cas de test se trouvent dans le dossier examples/.
$ explo examples/SQLI_simple_testphp.vulnweb.com.yaml
Vous pouvez aussi utiliser explo comme bibliothèque Python :
from explo.core import from_content as explo_from_content
from explo.core import ExploException, ProxyException
def save_log(msg):
print(msg)
try:
result = explo_from_content(explo_yaml_file, save_log)
except ExploException as err:
print(err)
Un proxy http/https et un délai d'attente pour les requêtes peuvent être définis via des variables d'environnement. Le délai d'attente par défaut est de 15 secondes.
$ export http_proxy=http://proxy:8089
$ export https_proxy=https://proxy:8090
$ export timeout=10
$ explo ...
Des modules peuvent être ajoutés pour améliorer les fonctionnalités et les classes de problèmes de sécurité.
Le module http permet d'effectuer une requête http, d'extraire du contenu et de rechercher/vérifier du contenu.
Les données suivantes sont mises à disposition pour les étapes suivantes :
stepname.response.contentstepname.response.cookiesresponse.extracted.variable_nameSi un paramètre find_regex est défini, une correspondance par expression régulière est effectuée sur le corps de la réponse. Si elle échoue, ce module renvoie un échec et arrête l'exécution du workflow en cours (et de toutes les étapes).
Lors de l'extraction par expressions régulières, utilisez le groupe de correspondance extract pour marquer la valeur à extraire (voir ci-dessous pour un exemple).
Pour référencer les cookies, faites référence au nom de l'étape précédente d'où les cookies doivent être pris (cookies: the_other_step.response.cookies).
Exemples de paramètres :
parameter:
url: http://example.com
method: GET
allow_redirects: True
headers:
User-Agent: explo
Content-Type: abc
cookies: stepname.response.cookies
body:
key: value
find: search for string
find_regex: search for (reg|ular)expression
find_in_headers: searchstring in headers
expect_response_code: 200
extract:
variable1: [CSS, '#csrf']
variable2: [REGEX, '<input(.*?)value="(?P<extract>.*?)"']
Le module http_header permet de vérifier si une réponse ne contient pas un ensemble spécifié d'en-têtes (et de valeurs). Tous les autres paramètres sont identiques à ceux du module http.
Les données suivantes sont mises à disposition pour d'autres modules :
stepname.response.contentstepname.response.cookiesExemples de paramètres :
parameter:
url: http://example.com
method: GET
allow_redirects: True
headers:
User-Agent: explo
Content-Type: abc
body:
key: value
headers_required:
X-XSS-Protection: 1
Server: . # all values are valid
Le module sqli_blind est capable d'identifier les injections SQL aveugles basées sur le temps.
Les données suivantes sont mises à disposition pour d'autres modules :
stepname.response.contentstepname.response.cookiesExemples de paramètres :
parameter:
url: http://example.com/vulnerable.php?id=1' waitfor delay '00:00:5'--
method: GET
delay_seconds: 5
Si le seuil de 5 secondes (delay_seconds) est dépassé, la vérification renvoie vrai (et donc un succès).
Le bloc metadata est un bloc spécial qui peut être ajouté comme premier bloc dans un fichier .yaml pour ajouter des métadonnées à une vulnérabilité en vue d'un traitement ultérieur. Cela devient utile lorsque explo est utilisé comme bibliothèque et que les métadonnées de chaque description de vulnérabilité peuvent être lues avec meta_from_content(content). Ce module ne nécessite ni nom ni description.
Exemples :
module: metadata
parameter:
cvss: 8.9
author: Robin Verton
---
name: login
description: login with test credentials
module: http
parameter:
url: http://testphp.vulnweb.com/userinfo.php
method: POST
body:
uname: test
pass: test