ترتيب الأولويات والـ Quick Wins
إزاي ترتّب الـ Findings في التقرير حسب الـ Risk، وتوضّح الـ Quick Wins اللي إصلاحها سهل وأثرها كبير، وتقترح مواعيد للإصلاح.
نص شرح المعلم والكود الذي كتبه ونتيجة تشغيله، بنفس ترتيب الدرس.
أهلاً بيك. العميل استلم تقرير فيه عشرين Finding. الفريق عنده أسبوع واحد بس. يبدأ بإيه؟ لو إنت ما قلتلوش، ممكن يقعد أسبوع يصلّح حاجة Low.
القاعدة الأولى: رتّب حسب الـ Risk. Critical الأول، وبعدين High، وبعدين Medium، وفي الآخر Low. ولكل مستوى، اقترح مدة للإصلاح.
القاعدة التانية: الـ Quick Wins. حاجات إصلاحها سهل وسريع، وفايدتها كبيرة. زي تغيير باسورد default، أو قِفل service مش مستخدمة. دي اكتبها بوضوح، علشان العميل يخلّصها في نفس اليوم. نرتّب الـ Findings حسب الـ Risk بـ Python. نشغّل… الـ Critical فوق. بس خد بالك: الـ SQL Injection قبل الـ default password، مع إن الباسورد أسهل في الإصلاح.
order = {"Critical": 0, "High": 1, "Medium": 2, "Low": 3}
findings = [
{"name": "SQL Injection", "risk": "Critical", "effort": "Medium"},
{"name": "Old jQuery version", "risk": "Low", "effort": "Low"},
{"name": "Default admin password", "risk": "Critical", "effort": "Low"},
{"name": "Missing security headers", "risk": "Medium", "effort": "Low"},
]
findings.sort(key=lambda f: order[f["risk"]])
for i, f in enumerate(findings, 1):
print(f"{i}. [{f['risk']}] {f['name']} (effort: {f['effort']})")المخرجات
1. [Critical] SQL Injection (effort: Medium) 2. [Critical] Default admin password (effort: Low) 3. [Medium] Missing security headers (effort: Low) 4. [Low] Old jQuery version (effort: Low)
دورك: خلّي الترتيب بالـ Risk الأول، ولو اتنين نفس الـ Risk، الأسهل في الإصلاح ييجي الأول. ده بيطلّع الـ Quick Wins فوق.
رتّب بـ key فيه (risk, effort) مع dictionary للـ effort.
الحل: نشغّل… الـ default password بقى رقم واحد، وده الـ Quick Win.
order = {"Critical": 0, "High": 1, "Medium": 2, "Low": 3}
findings = [
{"name": "SQL Injection", "risk": "Critical", "effort": "Medium"},
{"name": "Old jQuery version", "risk": "Low", "effort": "Low"},
{"name": "Default admin password", "risk": "Critical", "effort": "Low"},
{"name": "Missing security headers", "risk": "Medium", "effort": "Low"},
]
effort = {"Low": 0, "Medium": 1, "High": 2}
findings.sort(key=lambda f: (order[f["risk"]], effort[f["effort"]]))
for i, f in enumerate(findings, 1):
print(f"{i}. [{f['risk']}] {f['name']} (effort: {f['effort']})")المخرجات
1. [Critical] Default admin password (effort: Low) 2. [Critical] SQL Injection (effort: Medium) 3. [Medium] Missing security headers (effort: Low) 4. [Low] Old jQuery version (effort: Low)
الدرس الجاي: خلّصنا الـ Notes والأدلة والخطورة. نبدأ نبني التقرير نفسه… ونشوف شكله من جوّه. يلا بينا.
03 / دروس المسار (21)
- 01ليه التقرير أهم حاجة في الـ Pentest
- 02مين بيقرا التقرير؟
- 03نظام Notes من أول دقيقة
- 04Activity Log: كل حاجة بالوقت
- 05خلّي الـ Terminal يسجّل لوحده
- 06الأدلة: إيه اللي يعتبر دليل؟
- 07سلامة الأدلة: Hash و Chain of Custody
- 08إخفاء البيانات الحساسة (Redaction)
- 09خطوات إعادة التنفيد (Steps to Reproduce)
- 10الـ Impact: الخطر الحقيقي على البيزنس
- 11CVSS: الخطورة برقم
- 12الـ Risk Matrix: الاحتمال في الـ Impact
- 13ترتيب الأولويات والـ Quick Winsانت هنا
- 14هيكل تقرير اختبار الاختراق
- 15الـ Executive Summary: صفحة للإدارة
- 16كتابة الـ Finding التقني
- 17توصيات الإصلاح اللي تتنفّد فعلاً
- 18خلّي Python يكتب التقرير
- 19المراجعة قبل التسليم والـ Retest
- 20تقرير امتحان OSCP
- 21المراجعة النهائية: من الـ Note للتقرير