Cross-Site Scripting (XSS), bir bilgisayar korsanının diğer kullanıcılar tarafından görüntülenen web sayfalarına istemci tarafı komut dosyası enjekte etmesine olanak tanıyan bir tür bilgisayar güvenlik açığıdır. Kötü niyetli komut dosyası genellikle JavaScript ve HTML gibi istemci tarafı programlama dillerinde yazılır. XSS, kullanıcıların güvenliğini tehlikeye atan ve web uygulamalarını savunmasız bırakan bir tehdittir.
Proje Genel Bakış
Bu projede iki temel bileşen olan bir web crawler ve bir XSS tarayıcısından oluşur. Web crawler belirtilen bir web sitesini keşfeder, ilgili URL'leri yakalar ve bu URL'leri XSS tarayıcısına ileterek tarama yapar. XSS tarayıcısı, her URL'yi önceden tanımlanmış saldırı yükleriyle sistemli bir şekilde test ederek potansiyel güvenlik açıklarını tespit eder.
Gereksinimler
requests: Bu kütüphane HTTP isteklerini yönetmek için kullanılır.
BeautifulSoup: HTML içeriğini ayrıştırmak için kullanılır.
urllib3: SSL sertifikası uyarılarını bastırmak için kullanılır.
pprint: Veri yapılarını düzenli bir şekilde görüntülemek için kullanılır.
Bu kütüphaneleri aşağıdaki komutları kullanarak yükleyebilirsiniz:
Başlatma: Sınıf, temel URL, maksimum derinlik, yeniden deneme yapılandırmaları vb. gibi parametrelerle başlatılır.
Keşif ve URL'leri Kaydetme:crawl_and_record_urls() yöntemi, keşif sürecini yönetir. Ziyaret edilecek URL'lerin bir sırasını korur ve ziyaret edilen URL'leri izler. Bu URL'lere HTTP istekleri yapılır ve HTML içeriği requests kütüphanesi kullanılarak çıkarılır.
Bağlantıları Ayrıştırma: İçerik alındığında, BeautifulSoup kütüphanesi HTML içeriğindeki tüm bağlantıları (<a> etiketleri) çıkarmanıza yardımcı olur. Bu bağlantılar temel URL ile birleştirilerek daha fazla keşif için yeni URL'ler oluşturulur.
Yeniden Deneme Mekanizması: Yeniden Deneme Mekanizması: Kod, bağlantı hatalarını zarif bir şekilde ele almak için bir yeniden deneme mekanizması içerir. Bir istek başarısız olursa, sistem belirtilen sayıda yeniden deneme yapmadan önce bekler.
Çıktı: İlgili URL'ler, url.txt adlı bir metin dosyasında saklanır.
XssScanner Sınıfı
XssScanner sınıfı, saldırı yükleri kullanarak XSS açıklarını tespit etmeye odaklanır.
classXssScanner: COLOR_RED ='\033[91m' COLOR_GREEN ='\033[92m' COLOR_YELLOW ='\033[93m' COLOR_END ='\033[0m'def__init__(self): self.vulnerabilities = [] defprint_fail(self,message):print(f"{self.COLOR_RED}[!] {message}{self.COLOR_END}")defprint_success(self,message):print(f"{self.COLOR_GREEN}[+] {message}{self.COLOR_END}")defprint_info(self,message):print(f"{self.COLOR_YELLOW}[*] {message}{self.COLOR_END}")defget_all_forms(self,url): soup =BeautifulSoup(requests.get(url).content, "html.parser")return soup.find_all("form")defget_form_details(self,form): details ={} action = form.attrs.get("action", "").lower() method = form.attrs.get("method", "get").lower() inputs = []for input_tag in form.find_all("input"): input_type = input_tag.attrs.get("type", "text") input_name = input_tag.attrs.get("name") inputs.append({"type": input_type, "name": input_name}) details["action"]= action details["method"]= method details["inputs"]= inputsreturn detailsdefsubmit_form(self,form_details,url,payload): target_url =urljoin(url, form_details["action"]) inputs = form_details["inputs"] data ={}forinputin inputs:ifinput["type"]=="text"orinput["type"]=="search":input["value"]= payload input_name =input.get("name") input_value =input.get("value")if input_name and input_value: data[input_name]= input_value self.print_info(f"[*] Payload {target_url} adresine gönderiliyor") self.print_info(f"[*] Veri: {data}")if form_details["method"]=="post":return requests.post(target_url, data=data)else:return requests.get(target_url, params=data)defscan_xss(self,url,payload): forms = self.get_all_forms(url) self.print_info(f"[*] {url} adresinde {len(forms)} form tespit edildi.") is_vulnerable =Falsefor form in forms: form_details = self.get_form_details(form) content = self.submit_form(form_details, url, payload).content.decode()if payload in content: self.print_success(f"[+] {url} adresinde XSS tespit edildi")##self.print_info("[*] Form ayrıntıları:")#pprint(form_details) is_vulnerable =True self.vulnerabilities.append({"url": url,"form_details": form_details,"payload": payload, })breakifnot is_vulnerable: self.print_fail("[-] Bu payload için herhangi bir güvenlik açığı bulunamadı.")return is_vulnerabledefscan_urls_with_payloads(self,urls,payloads):for url in urls: url = url.strip() self.print_info(f"Test Edilen URL: {url}")for payload in payloads: payload = payload.strip() is_vulnerable = self.scan_xss(url, payload)if is_vulnerable: self.print_success("Güvenlik Açıkları:")for vuln in self.vulnerabilities: self.print_success(f"URL: {vuln['url']}") self.print_info("Form Ayrıntıları:")pprint(vuln["form_details"]) self.print_success(f"Yüklenen Payload: {vuln['payload']}")break self.print_info("Tüm URL'lerin testi tamamlandı.")
Adım adım bakalım:
Form Çıkarımı:get_all_forms() fonksiyonu, belirtilen URL'nin HTML içeriğini çözümleyerek içerdiği tüm HTML formlarını çıkarır. Formlar, kötü niyetli komut dosyalarının potansiyel giriş noktalarıdır.
Form Ayrıntıları:get_form_details() fonksiyonu, her bir formu ayrıştırarak işlem URL'si, yöntem (GET/POST) ve giriş alanları gibi bilgileri toplar.
Saldırı Yüklerinin Gönderilmesi:submit_form() fonksiyonu bir formun ayrıntılarını alır ve giriş alanlarına saldırı yüklerini gönderir. Bu noktada gerçek güvenlik açığı testi gerçekleşir.
Güvenlik Açığı Tespiti: Her bir form için tarayıcı bir saldırı yükü gönderir ve yanıtta yükün yansıyıp yansımadığını kontrol eder. Eğer yansıyorsa, form zayıf olabilir ve XSS saldırısı başarılıdır.
Kullanım
Depoyu Klonlama: İlk olarak, projenin GitHub deposunu klonlayarak başlayın.
Dizin Değiştirme ve Çalıştırma: Proje dizinine geçin ve betiği çalıştırın.
cd web-crawler-xss-scanner
python xss-scanner.py
Etkileşim ve İzleme: Ekrandaki talimatları takip ederek hedef bir URL girmeniz ve betiğin web sitesini keşfetmesi, URL'leri kaydetmesi ve XSS güvenlik açıklarını tarayabilmesini izleyebilirsiniz.
Bu şekilde projeyi sadece tanıtmakla kalmayıp temel bileşenlerini de açıklamış olduk. URL'leri keşfetmek için bir web crawler oluşturmanın ve potansiyel güvenlik açıklarını tespit etmek için bir XSS tarayıcısı oluşturmanın nasıl yapıldığını öğrenmiş olduk. Güvenlik dinamik bir alan olduğundan, bu tür pratiğe dayalı projeler anlayışımızı önemli ölçüde artırabilir.