Fantastik zəifliklər və onları harada tapmaq olar (Hissə 1) - Django Formu Səhvləri ilə Saytlararası Ssenari

XSS skript yazma zəiflikləri

Saytlararası Ssenarilər (XSS) niyə hələ də vebdə ən çox görülən zəiflikdir? XSS-nin müəyyənləşdirilməsi nəzəriyyəsi olduqca sadədir. Bunu aşkarlamaq üçün hazırlanmış bir çox statik analiz vasitəsi var, lakin hələ aşkarlanmamış çox həssaslıqlar var. Beləliklə, nə baş verib?

Səbəblərdən biri də ənənəvi proqram analiz metodlarının tez-tez müəyyən bir kodun niyyətini aşkar edə bilməməsidir. Məsələn, bir vasitə, proqramdakı hansı obyektlərin istifadəçi girişinin ola biləcəyini tapmaqda çətinlik çəkə bilər.

Əvvəlki yazımda minlərlə açıq mənbə layihəsindən təhlükəsizlik xüsusiyyətlərini öyrənən və həqiqi təhlükəsizlik dəliklərini tapmaq üçün istifadə edən bir sistem yaratmaqla bu problemi necə həll etdiyimizi izah etmişdim. Öyrəndiklərinə dair bəzi maraqlı nümunələri bölüşməyə söz verdim.

Django ilə layihələrdə maraqlı və olduqca gözlənilməz bir potensial problem mənbəyi ilə başlamağa qərar verdim. Bu yazı, Django formalarındakı doğrulama səhvlərindən istifadə edərək XSS zəifliklərini necə təyin etmək və istifadə etmək üçün bir təlimatdır. Budur həqiqi bir nümunə: https://github.com/mozilla/pontoon/pull/1175.

Dərhal başlayaq və kiçik bir viktorina ilə başlayaq. Aşağıdakı fraqmentə bənzər kodu neçə dəfə yazdınız / gördünüz?

Bəs bu barədə necə?

Yoxsa bu?

Hamısı ümumiyyətlə istifadəçiyə verilən girişin etibarsız olduğunu söylədiyinizə dair ümumi nümunələrdir, elədir? Giriş HTTP tələb parametrlərindən götürülür və səliqəli şəkildə MyForm obyektinə bölünür. Sahələrdən hər hansı birində etibarsız giriş varsa (məsələn, kimsə ədədi bir yerə "köpük" yazdı), səhvini izah edən 400 etibarsız sorğu səhifəsi qaytarılır. Parçalar arasındakı fərq, qaytarılmış səhvin formatıdır - HTML siyahısı, düz mətn və ya JSON.

İndi bir milyon dollarlıq sual - bu snippetlərdən hansını veb tətbiqinizi XSS ilə təmin edir?

Buna cavab vermək üçün Django Forms API'sini iki tərəfdən nəzərdən keçirək:

  1. Təcavüzkar istifadəçinin brauzerində görünən veb səhifəyə zərərli giriş daxil edə bilərmi?
  2. Bu zərərli giriş istifadəçiyə qaytarılmadan əvvəl həmişə düzgün şəkildə gizlədilib?

Django sənədlərinə görə, sahə doğrulama səhvləri üçün dinamik səhv mesajları yaratmağın yolu bir django.core.exceptions.ValidationError istisnasını müvafiq mesajla atmaqdır. Formanın doğrulama funksiyalarından biri tərəfindən qaldırılan belə bir istisna (məs. Metodlar clean () və clean_ () class django.forms.BaseForm) mesajın formanın səhv lüğətində (django (django (form.utils.ErrorDict)) qeyd olunmasına və daha sonra istifadəçiyə göstərilməsinə səbəb olur.

Belə bir istisnadan faydalanmağın bir yolu, istisna mesajındakı səhv girişi düzgün şəkildə əks etdirən bəzi daxili form sahələrindən istifadə etməkdir. Burada sadalanan Django forma sahəsi növlərinin hamısını sınadım və aşağıdakı siyahını aldım: ChoiceField, TypedChoiceField, MultipleChoiceField, FilePathField. Bu mesajlardan hər hansı biri "Xahiş edirəm etibarlı bir seçim seçin.% (Dəyər) s mövcud seçimlərdən deyil." Kimi bir səhv mesajı yaradır, burada dəyər səhvdir.

İkinci seçim, xüsusi sahələrdən və / və ya doğrulama prosedurlarından faydalanmaqdır. Məsələn, aşağıdakı hissəni nəzərdən keçirək (həqiqi bir layihədən götürülmüş və qısa olması üçün dəyişdirilmişdir):

Burada yaxşı bir yük, foo kimi bir şey olardı. .

Bəli, haqlısınız, yalnız ValidationError istisnaları bizə XSS vermir. Müvafiq bir həssaslıq üçün daha bir tərkibə ehtiyacımız var - istifadəçiyə qaytarılmış son HTML səhifəsinə səhv mesajları əlavə etmək bacarığı.

Yuxarıda göstərilən ErrorDict sinfi səhv mesajlarını çıxarmaq üçün aşağıdakı üsullara malikdir:

  1. as_data () - dezinfeksiya yoxdur
  2. get_json_data (escape_html = Yanlış) - escape_html == Yanlışdırsa (təmiz)
  3. as_json (escape_html = False) escape_html == False (təməl)
  4. as_ul () - təhlükəsizdir
  5. as_text () - dezinfeksiya yoxdur
  6. __str __ () (as_ul () çağırır) - təhlükəsizdir

İndi kiçik viktorinamıza qayıdaq. Snippet 1-in təhlükəsiz olduğunu görmək asandır, çünki girişdən qaçan __str __ () metodundan istifadə edir. Bununla birlikdə, 2 və 3 parçaları təhlükəlidir və XSS-ə səbəb ola bilər.

Burada iki vacib paket mesajı var. İnkişaf etdiricilər üçün mantra “Etibarlı olmayan məlumatları həmişə təmizləyin”. Təhlükəsizlik tədqiqatçıları üçün sadə bir grep -R "ValidationError" sizin üçün hücum səthini genişləndirə bilər.

Yeri gəlmişkən, yazını tam oxumadan viktorinanı düzgün keçmisinizsə hörmətim var.

Veb və ya mobil tətbiq yaradırsınız?

Crowdbotics bir tətbiqetmə qurma, işə salma və miqyaslandırma üçün ən sürətli yoldur.

İnkişaf etdirici? Müxtəlif populyar çərçivələrdən istifadə edərək tətbiqləri sürətlə qurmaq və yerləşdirmək üçün Crowdbotics Tətbiq Oluşturucusunu sınayın.

Məşğul və ya texniki deyil? Crowdbotics PM və təcrübəli inkişaf etdiricilərlə proqram inkişaf etdirən yüzlərlə xoşbəxt komandaya qoşulun. Crowdbotics Managed App Development ilə cədvəl və xərcləri pulsuz olaraq saxlayın.