Wafw00f – Web Application Firewall Detection Tool

Un WAF (Web Application Firewall) est une “appliance”, ou un “plug-in” serveur, ou un filtre qui appliquera certaines règles lors de requêtes HTTP. Les règles mises en place permettent surtout de contrecarrer les attaques du type XSS et injection SQL, même si l’application, que le WAF est censé protégé, possède de nombreuses vulnérabilités. En customisant les règles à son application Web que l’on désire protéger la plupart des attaques seront alors bloquées. Les efforts à fournir pour la customisation des règles, ainsi que leurs maintenances peuvent être important, car dès que l’application web sera modifiée, il faudra ajouter de nouvelles règles, ou adapter des règles déjà existantes.

WAFW00F est un logiciel développé en Python, qui permettra de détecter si un WAF est présent et surtout quel type WAF est utiliser pour protéger l’application web. Afin de détecter si un WAF est présent, différents scénarios seront joués, comme par exemple :

– Analyse des cookies (certains WAF génère leurs propres cookies).
– Modifications des en-têtes HTTP et des URL appelées, en y injectant par exemple des chaînes XSS.
– Codes réponses qui ne devraient pas être ceux présentés.

WAFW00F est capable de détecter près de 20 WAF différents (Profense, ModSecurity, NetContinuum, HyperGuard, Barracuda, Airlock, BinarySec, F5 Trafficshield, F5 ASM, Teros, DenyALL, BIG-IP, Citrix NetScaler, webApp.secure, WebKnight, URLScan, SecureIIS, dotDefender ).

Ci-dessous une détection du “plug-in” Apache mod_security.

[xxxxx@xxxxx waffit-read-only]$ python wafw00f.py http://www.xxxxxx.com

^     ^
_   __  _   ____ _   __  _    _   ____
///7/ /.' \ / __////7/ /,' \ ,' \ / __/
| V V // o // _/ | V V // 0 // 0 // _/
|_n_,'/_n_//_/   |_n_,' \_,' \_,'/_/
<
...'

WAFW00F - Web Application Firewall Detection Tool

By Sandro Gauci && Wendel G. Henrique

Checking http://www.xxxxxx.com
The site http://www.xxxxxx.com is behind a ModSecurity (positive model)
Number of requests: 9

Cette détection peut être confirmée par l’exemple manuel suivant, et le code de retour HTTP 404 qui n’est pas cohérent.

xxxxx@xxxx waffit-read-only]$ telnet www.xxxxx.com 80
Trying xxx.xxx.xxx.xxx...
Connected to www.xxxxxx.com (xxx.xxx.xxx.xxx).
Escape character is '^]'.
GET /index.php?action=<script>alert(document.cookie)</script> HTTP/1.0

[b]HTTP/1.1 404 Not Found[/b]
Date: Sat, 27 Jun 2009 11:15:56 GMT
Server: Apache
Content-Length: 207
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /index.php was not found on this server.</p>
</body></html>
Connection closed by foreign host.

Ci-dessous la détection d’un WAF sans que le modèle puisse être spécifié.

xxxxx@xxxxx waffit-read-only]$ python wafw00f.py http://www.yyyyyy.com

^     ^
_   __  _   ____ _   __  _    _   ____
///7/ /.' \ / __////7/ /,' \ ,' \ / __/
| V V // o // _/ | V V // 0 // 0 // _/
|_n_,'/_n_//_/   |_n_,' \_,' \_,'/_/
<
...'

WAFW00F - Web Application Firewall Detection Tool

By Sandro Gauci && Wendel G. Henrique

Checking http://www.yyyyyy.com
Generic Detection results:
The site http://www.yyyyyy.com seems to be behind a WAF
Reason: The server returned a different response code when a string trigged the blacklist.
Normal response code is "404", while the response code to an attack is "403"
Number of requests: 11

Cette détection peut être aussi confirmer en effectuant une détection manuelle, et par le code retour HTTP 403.

xxxxxx@xxxx waffit-read-only]$ telnet www.yyyy.com 80
Trying yyy.yyy.yyy.yyy...
Connected to www.yyyyy.com (yyy.yyy.yyy.yyy).
Escape character is '^]'.
GET /index.php?action=<script>alert(document.cookie)</script> HTTP/1.0

[b]HTTP/1.1 403 Forbidden[/b]
Date: Sat, 27 Jun 2009 11:12:26 GMT
Server: Apache
Content-Length: 211
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /index.php
on this server.</p>
</body></html>
Connection closed by foreign host.