File Upload و امنیت آن؛ از آپلود فایل تا شناسایی آسیب‌پذیری

File Upload and its security
0 دیدگاه
۱۴۰۵-۰۶-۱۳ ۱۵:۰۳:۴۰

تصور کنید وارد یک سایت می‌شوید و فقط برای تغییر عکس پروفایل، یک فایل آپلود می‌کنید.

همه‌چیز عادی به نظر می‌رسد…

اما اگر برنامه هیچ بررسی درستی روی فایل انجام ندهد، همین قابلیت ساده می‌تواند به یک نقطه ضعف امنیتی جدی تبدیل شود. 😳

آسیب‌پذیری Unrestricted File Upload یکی از مباحث مهم در امنیت برنامه‌های وب است؛ زیرا یک سیستم آپلود ناامن ممکن است اجازه دهد فایل‌هایی با نوع، محتوا یا نام نامناسب وارد سرور شوند.

در این قسمت، داخل یک آزمایشگاه کاملاً قانونی با Kali Linux و DVWA بررسی می‌کنیم:

  • File Upload چیست؟
  • چرا آپلود فایل خطرناک می‌شود؟
  • یک سیستم آپلود امن چه کنترل‌هایی دارد؟
  • چگونه در DVWA رفتار Upload را بررسی کنیم؟
  • چگونه Request آپلود را با Burp Suite تحلیل کنیم؟
  • MIME Type، Extension و Content Validation چه تفاوتی دارند؟
  • چگونه از Upload Vulnerability جلوگیری کنیم؟

⚠️ هشدار: تمام آزمایش‌های این مقاله فقط روی DVWA یا سیستم‌هایی انجام شود که مالک آن هستید یا مجوز تست آن را دارید. هرگز فایل اجرایی یا Shell را روی سرور واقعی بدون مجوز آپلود نکنید.


File Upload چیست؟

File Upload قابلیتی است که به کاربر اجازه می‌دهد یک فایل را از سیستم خود انتخاب و به سرور ارسال کند.

مثلاً:

User
  ↓
Select File
  ↓
Browser
  ↓
HTTP Request
  ↓
Web Server
  ↓
Storage

نمونه‌های رایج File Upload:

  • تصویر پروفایل
  • مدارک
  • فایل PDF
  • فایل رزومه
  • فایل‌های آموزشی
  • تصاویر محصولات
  • فایل‌های پیوست

خود قابلیت Upload یک آسیب‌پذیری نیست.

مشکل زمانی ایجاد می‌شود که برنامه فایل دریافت‌شده را بدون کنترل‌های امنیتی مناسب ذخیره یا پردازش کند.


چرا File Upload می‌تواند خطرناک باشد؟

فرض کنید برنامه فقط این موضوع را بررسی کند:

Filename ends with .jpg

این کنترل به‌تنهایی کافی نیست.

چون امنیت فایل فقط به نام آن وابسته نیست.

یک فایل می‌تواند:

  • Extension نامناسب داشته باشد
  • MIME Type غیرمنتظره داشته باشد
  • محتوای غیرعادی داشته باشد
  • نام خطرناک داشته باشد
  • حجم بسیار زیادی داشته باشد
  • شامل محتوای فعال باشد
  • در مسیر قابل اجرای Server ذخیره شود

بنابراین باید چند لایه کنترل در کنار یکدیگر قرار بگیرند.


ساختار یک Upload ناامن

یک طراحی ضعیف ممکن است تقریباً چنین مسیری داشته باشد:

User File
    ↓
Upload
    ↓
Check Filename
    ↓
Save Directly
    ↓
Web Root

مشکل اینجاست که اگر کنترل‌ها ضعیف باشند، فایل نامناسب می‌تواند وارد محلی شود که Server آن را به شکل ناامن پردازش کند.


ساختار Upload امن

یک معماری بهتر:

User File
    ↓
Authentication
    ↓
Authorization
    ↓
Size Validation
    ↓
Extension Validation
    ↓
MIME Validation
    ↓
Content Validation
    ↓
Random Filename
    ↓
Non-Executable Storage
    ↓
Access Control

هر مرحله یک لایه دفاعی ایجاد می‌کند.


آزمایشگاه مورد نیاز

برای این آموزش:

┌──────────────────────────┐
│       Kali Linux         │
│                          │
│ Browser                  │
│ Burp Suite               │
│ Nmap                     │
└────────────┬─────────────┘
             │
       Host-Only Network
             │
┌────────────▼─────────────┐
│           DVWA           │
│                          │
│ 192.168.56.20            │
└──────────────────────────┘

IP بالا فقط یک مثال است.

IP واقعی DVWA خودتان را جایگزین کنید.

🔒 بهتر است DVWA فقط در شبکه آزمایشگاهی قابل دسترسی باشد و مستقیماً روی اینترنت قرار نگیرد.


مرحله اول: شناسایی سرویس

ابتدا در Kali ارتباط با سیستم آزمایشگاهی را بررسی کنید:

ping 192.168.56.20

سپس سرویس وب را بررسی کنید:

nmap -sV -p 80,443 192.168.56.20

اگر HTTP فعال باشد، مرورگر را باز کنید:

http://192.168.56.20

مرحله دوم: ورود به File Upload در DVWA

پس از ورود به DVWA، بخش:

File Upload

را باز کنید.

برای شروع:

Security Level = Low

قرار دهید.

هدف این مرحله این نیست که فوراً به سراغ Exploitation برویم.

اول باید بفهمیم:

برنامه هنگام دریافت یک فایل دقیقاً چه کاری انجام می‌دهد؟


مرحله سوم: آپلود یک فایل سالم

ابتدا یک تصویر معمولی انتخاب کنید.

مثلاً:

test.jpg

آن را Upload کنید.

بعد از Upload، موارد زیر را بررسی کنید:

Upload Result
File Name
File Path
Response
Status Code

اگر برنامه اعلام کرد Upload موفق بوده، باید ببینیم فایل کجا ذخیره شده است.


چرا مسیر ذخیره فایل مهم است؟

فرض کنید فایل در چنین مسیری قرار گرفته باشد:

/uploads/test.jpg

اگر این مسیر مستقیماً از طریق وب قابل دسترسی باشد، کاربر می‌تواند فایل را از طریق Browser درخواست کند.

بنابراین یک سؤال مهم مطرح می‌شود:

آیا فایل آپلودشده در یک محل قابل اجرای Server ذخیره شده یا فقط قابل دانلود/نمایش است؟

این تفاوت از نظر امنیتی بسیار مهم است.


مرحله چهارم: تحلیل Request با Burp Suite

حالا Burp Suite را فعال کنید.

فایل را مجدداً Upload کنید و Request را مشاهده کنید.

یک Upload معمولاً از:

multipart/form-data

استفاده می‌کند.

ساختار ساده Request:

POST /dvwa/vulnerabilities/upload/ HTTP/1.1
Host: 192.168.56.20
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

و داخل Body ممکن است چیزی شبیه این باشد:

------WebKitFormBoundary
Content-Disposition: form-data; name="uploaded"; filename="test.jpg"
Content-Type: image/jpeg

[FILE DATA]

------WebKitFormBoundary

چه چیزهایی را باید بررسی کنیم؟

در Burp به این قسمت‌ها دقت کنید:

Filename

filename="test.jpg"

Content-Type

Content-Type: image/jpeg

Request Method

معمولاً:

POST

Upload Parameter

نام پارامتری که فایل را ارسال می‌کند.

مثلاً:

uploaded

نکته مهم: Filename قابل اعتماد نیست

یکی از اشتباهات رایج توسعه‌دهندگان این است که فقط نام فایل را بررسی کنند.

مثلاً:

test.jpg

به معنی امن بودن فایل نیست.

نام فایل توسط Client ارسال می‌شود و Client قابل اعتماد نیست.

بنابراین:

هر چیزی که از سمت کاربر می‌آید باید غیرقابل اعتماد فرض شود.


Extension Validation چیست؟

Extension همان پسوند فایل است.

مثلاً:

photo.jpg
document.pdf
avatar.png

یک برنامه می‌تواند Extensionهای مجاز را محدود کند.

مثلاً:

.jpg
.jpeg
.png
.webp

اما:

Extension Validation به‌تنهایی کافی نیست.


MIME Type چیست؟

MIME Type مشخص می‌کند داده ارسالی چه نوع محتوایی دارد.

برای تصویر JPEG معمولاً:

image/jpeg

و برای PNG:

image/png

دیده می‌شود.

اما نکته مهم:

MIME Type ارسالی توسط Client هم به‌تنهایی قابل اعتماد نیست.

بنابراین نباید تنها بر اساس Header تصمیم امنیتی گرفت.


Content Validation

یک سیستم امن‌تر باید خود محتوای فایل را نیز بررسی کند.

برای مثال اگر انتظار داریم فایل یک تصویر باشد، Server می‌تواند ساختار واقعی فایل را بررسی کند.

به زبان ساده:

Extension
      +
MIME
      +
File Content

باید با یکدیگر سازگار باشند.


مرحله پنجم: بررسی محدودیت حجم

یکی دیگر از مشکلات رایج Upload، نبود محدودیت مناسب برای حجم فایل است.

فرض کنید کاربر اجازه دارد فایل:

5 MB

آپلود کند.

اما Server هیچ محدودیتی نداشته باشد.

در این شرایط یک فایل بسیار بزرگ می‌تواند منابع:

  • CPU
  • RAM
  • Disk
  • Bandwidth

را مصرف کند.

بنابراین محدودیت حجم یک کنترل امنیتی مهم است.

مثلاً:

Maximum File Size = 5 MB

البته مقدار مناسب باید بر اساس نیاز واقعی برنامه تعیین شود.


مرحله ششم: نام فایل

ذخیره مستقیم نام فایل کاربر می‌تواند مشکلات مختلفی ایجاد کند.

مثلاً:

profile.jpg

بهتر است Server نام داخلی فایل را خودش تولید کند.

مثلاً:

a81f92c7.jpg

یا یک شناسه تصادفی امن.

ساختار بهتر:

User Filename
      ↓
Server Generates Random Name
      ↓
Secure Storage

این کار می‌تواند از برخی مشکلات مربوط به نام فایل و برخورد نام‌ها جلوگیری کند.


مرحله هفتم: Path Traversal و نام فایل

یکی از موارد مهم در File Handling، نحوه استفاده از نام فایل و مسیر آن است.

برنامه نباید اجازه دهد ورودی کاربر مستقیماً به مسیر فایل تبدیل شود.

به‌عنوان یک مفهوم دفاعی:

User Input
      ↓
Filename
      ↓
Path Construction

این قسمت باید کاملاً کنترل شود.

بهترین روش این است که Server خودش نام و مسیر نهایی را تولید کند و ورودی کاربر را مستقیماً به Path تبدیل نکند.


مرحله هشتم: محل ذخیره فایل

یکی از مهم‌ترین نکات امنیتی این است که فایل‌های Upload شده کجا ذخیره شوند.

اگر فایل‌های غیرقابل اعتماد در یک مسیر قابل اجرای Web Server قرار بگیرند، ریسک افزایش پیدا می‌کند.

معماری امن‌تر:

Application
     ↓
Upload
     ↓
Non-Executable Storage
     ↓
Controlled Download

یعنی فایل به‌عنوان داده ذخیره شود، نه چیزی که Server بتواند آن را به‌عنوان برنامه اجرا کند.


چرا اجرای فایل مهم است؟

فرض کنید Server فایل‌های آپلودشده را در مسیر Web Root قرار دهد.

اگر تنظیمات Server به‌گونه‌ای باشد که برخی فایل‌ها را اجرا کند، یک Upload آسیب‌پذیر می‌تواند از یک مشکل ساده File Upload به یک مشکل بسیار جدی‌تر تبدیل شود.

به همین دلیل:

آپلود فایل و اجرای فایل باید از یکدیگر جدا باشند.


مرحله نهم: بررسی File Upload با Repeater

حالا Request آپلود را به:

Repeater

ارسال کنید.

در این قسمت می‌توانید Request را بررسی و بخش‌های مختلف آن را تحلیل کنید.

به‌خصوص:

filename
Content-Type
Content-Length
multipart boundary
Response

را بررسی کنید.

هدف این مرحله شناخت منطق Upload است.


مرحله دهم: بررسی سطح امنیتی DVWA

سطح DVWA را تغییر دهید:

Low

سپس:

Medium

و در صورت امکان:

High

را بررسی کنید.

حالا یک فایل سالم را در هر سطح Upload کنید و ببینید:

  • چه Extensionهایی قبول می‌شوند؟
  • آیا MIME بررسی می‌شود؟
  • آیا محدودیت حجم وجود دارد؟
  • پیام خطا چگونه تغییر می‌کند؟
  • مسیر ذخیره فایل تغییر می‌کند؟

این مقایسه برای درک Security Controls بسیار ارزشمند است.


چرا فقط یک کنترل کافی نیست؟

فرض کنید برنامه فقط Extension را بررسی کند:

Extension Check

اگر مهاجم بتواند از ضعف دیگری استفاده کند، این کنترل ممکن است کافی نباشد.

اگر فقط MIME بررسی شود:

MIME Check

باز هم کافی نیست.

اگر فقط Content بررسی شود:

Content Check

باز هم باید سایر لایه‌ها وجود داشته باشند.

امنیت مناسب یعنی:

Authentication
        +
Authorization
        +
Extension Validation
        +
MIME Validation
        +
Content Validation
        +
Size Limit
        +
Random Filename
        +
Safe Storage
        +
Non-Execution

🛡️ چگونه File Upload را امن کنیم؟

۱. فقط Extensionهای مورد نیاز را مجاز کنید

مثلاً اگر سایت فقط عکس نیاز دارد:

.jpg
.jpeg
.png
.webp

را مجاز کنید.

هر Extension اضافی را نپذیرید.


۲. MIME Type را بررسی کنید

نوع فایل را بررسی کنید.

اما به یاد داشته باشید:

MIME ارسالی از Client به‌تنهایی معیار امنیتی قابل اعتمادی نیست.


۳. محتوای واقعی فایل را بررسی کنید

برای تصاویر، از ابزارها و کتابخانه‌های معتبر Server-Side برای تشخیص و پردازش تصویر استفاده کنید.


۴. نام فایل را خود Server تولید کند

از نام کاربر مستقیماً به‌عنوان نام نهایی فایل استفاده نکنید.


۵. فایل را خارج از Web Root ذخیره کنید

اگر معماری برنامه اجازه می‌دهد، فایل‌ها را در محلی ذخیره کنید که مستقیماً توسط Web Server اجرا نشود.


۶. اجرای Script را در Upload Directory غیرفعال کنید

اگر Upload Directory وجود دارد، باید طوری پیکربندی شود که فایل‌های آپلودشده به‌عنوان Script اجرا نشوند.

این موضوع به Web Server و معماری برنامه بستگی دارد.


۷. محدودیت حجم اعمال کنید

مثلاً:

Maximum = 5 MB

اما مقدار مناسب را بر اساس نیاز واقعی سیستم تعیین کنید.


۸. دسترسی کاربر را بررسی کنید

قبل از Upload باید مشخص شود:

Who can upload?
What can they upload?
Where can it be stored?
Who can access it?

این موضوع به Authorization مربوط است.


۹. فایل را مجدداً پردازش کنید

در بعضی سناریوهای تصویری، برنامه می‌تواند تصویر را با یک کتابخانه معتبر باز کرده و نسخه جدیدی از آن ایجاد کند.

مثلاً:

Original Image
      ↓
Image Processing
      ↓
New Image
      ↓
Safe Storage

این روش می‌تواند بخشی از محتوای غیرضروری فایل اصلی را حذف کند.


۱۰. خطاهای حساس را نمایش ندهید

پیام‌هایی مثل مسیر داخلی Server یا جزئیات Exception نباید به کاربر نمایش داده شوند.

به جای:

/var/www/html/uploads/...

یک پیام عمومی نمایش دهید:

Upload failed.

و جزئیات را در لاگ مناسب ثبت کنید.


File Upload و XSS

یک نکته جالب این است که File Upload می‌تواند در بعضی سناریوها با XSS نیز ارتباط داشته باشد.

مثلاً اگر برنامه:

  • فایل HTML را قبول کند
  • محتوای SVG را بدون کنترل مناسب نمایش دهد
  • نام فایل را ناامن در صفحه قرار دهد
  • Metadata فایل را بدون Encoding نمایش دهد

ممکن است زمینه‌ای برای XSS ایجاد شود.

بنابراین File Upload فقط مسئله «نوع فایل» نیست.

بلکه باید به:

Upload
Storage
Rendering
Download
Execution

هم توجه کرد.


File Upload و Denial of Service

آپلود فایل‌های بسیار بزرگ یا تعداد زیادی فایل می‌تواند منابع سرور را مصرف کند.

به همین دلیل باید مواردی مانند:

File Size Limit
Rate Limit
Storage Quota
Authentication
Upload Frequency

در نظر گرفته شوند.


File Upload و Access Control

فرض کنید کاربر A یک فایل آپلود کرده است.

آیا کاربر B می‌تواند آن را مشاهده یا حذف کند؟

این سؤال به Broken Access Control مربوط می‌شود.

یک سیستم امن باید مشخص کند:

User A
   ↓
Own File

User B
   ↓
Access Denied

پس امنیت Upload فقط به زمان آپلود محدود نمی‌شود.

بعد از Upload نیز کنترل دسترسی اهمیت دارد.


🔍 چک‌لیست تست امنیت File Upload

هنگام تست یک سیستم مجاز، این موارد را بررسی کنید:

[ ] Authentication
[ ] Authorization
[ ] Allowed Extensions
[ ] MIME Validation
[ ] Content Validation
[ ] Maximum File Size
[ ] Filename Handling
[ ] Random Filename
[ ] Storage Location
[ ] Script Execution Disabled
[ ] Download Access Control
[ ] File Overwrite Protection
[ ] Rate Limiting
[ ] Error Handling
[ ] Logging

🧪 تمرین عملی در DVWA

حالا یک تمرین کامل انجام دهید.

مرحله ۱

DVWA را اجرا کنید.

مرحله ۲

Security Level را روی Low قرار دهید.

مرحله ۳

یک تصویر سالم Upload کنید.

مرحله ۴

Request را با Burp Suite مشاهده کنید.

مرحله ۵

پارامترهای Upload را شناسایی کنید.

مرحله ۶

Response را بررسی کنید.

مرحله ۷

محل ذخیره فایل را مشخص کنید.

مرحله ۸

Security Level را تغییر دهید.

مرحله ۹

رفتار برنامه را مقایسه کنید.

مرحله ۱۰

در نهایت مشخص کنید چه کنترل‌های امنیتی وجود دارند و چه کنترل‌هایی ضعیف یا غایب هستند.


📋 قالب گزارش آسیب‌پذیری File Upload

برای گزارش می‌توانید از قالب زیر استفاده کنید:

Target:
DVWA

Target IP:
192.168.56.20

Vulnerability:
Unrestricted File Upload

Endpoint:
...

HTTP Method:
POST

Upload Parameter:
...

Allowed Extension:
...

MIME Validation:
Yes / No

Content Validation:
Yes / No

File Size Limit:
Yes / No

Storage Location:
...

Execution Risk:
...

Observed Behavior:
...

Impact:
...

Root Cause:
Insufficient File Validation

Recommended Remediation:
Extension Allowlist
MIME Validation
Content Validation
Random Filename
Safe Storage
Disable Script Execution
Size Limitation
Access Control

🚨 اشتباهات رایج توسعه‌دهندگان

اشتباه اول: اعتماد به Extension

.jpg

به‌تنهایی اثبات نمی‌کند فایل امن است.


اشتباه دوم: اعتماد به MIME Type

Header ارسال‌شده توسط Client معیار کافی نیست.


اشتباه سوم: ذخیره فایل با نام اصلی

بهتر است Server نام فایل را خودش تولید کند.


اشتباه چهارم: ذخیره در مسیر قابل اجرا

فایل Upload شده باید تا حد امکان در محیطی ذخیره شود که قابلیت اجرای Script نداشته باشد.


اشتباه پنجم: نداشتن محدودیت حجم

File Upload بدون Size Limit می‌تواند به مشکل منابع منجر شود.


اشتباه ششم: فراموش کردن Authorization

باید بررسی شود چه کسی اجازه Upload، مشاهده، تغییر یا حذف فایل را دارد.


🎯 جمع‌بندی

File Upload یکی از قابلیت‌های عادی و ضروری بسیاری از سایت‌هاست؛ اما اگر بدون طراحی امنیتی مناسب پیاده‌سازی شود، می‌تواند به یک نقطه ضعف جدی تبدیل شود.

در این قسمت یاد گرفتیم که هنگام بررسی File Upload باید به چندین لایه توجه کنیم:

User
 ↓
Authentication
 ↓
Authorization
 ↓
Extension
 ↓
MIME
 ↓
Content
 ↓
Size
 ↓
Filename
 ↓
Storage
 ↓
Execution
 ↓
Access Control

مهم‌ترین اصل:

هر فایل آپلودشده را غیرقابل اعتماد فرض کنید.

امنیت واقعی زمانی ایجاد می‌شود که فایل نه‌تنها هنگام Upload، بلکه در زمان ذخیره، پردازش، نمایش و دانلود نیز به‌درستی کنترل شود.

دسته بندی‌ها:

آنچه در این مقاله میخوانید

دیدگاه شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *