Hərkəsə salamlar, bu gün Portswigger saytının XSS bölməsinin “PRACTİONER” bölməsinin izahıları sizlərlə bölüşəcəm.
10.DOM XSS in document.write sink using source location.search inside a select element
Bu labda location.search-dan istifadə edərək DOM-based XSS almağa çalışacağam. Əvvəla location.searchin işləmə prinsipinə baxaq.
Javascriptdə window.location obyekti səhifənin url məlumatlarını saxlayır və təbii ki, bu hissələrə bölünərək saxlanılır. location.pathname → /page, location.search → ?param=value (burada olan sual işarəsindən sonra gələn query stringdir). Əgər url https://example.com/profile?name=mein&age=888 belədirsə, console.log(location.search); etdikdə cavabda ?name=mein&age=888 bu çıxacaq, yəni location.search query stringi qaytarır.

burada document.write-dan köməkdə almalıyıq, çünki document.write stringi bir-başa HTML kimi icra edir, eyni zamanda burada istifadəçidən input alındığı hal da olsa idi yenədə XSS almaq olardı, baxmayaq ki, location.search input deyil. Əslində document.write innerHTML kimi işləyir amma innetHTML-dən daha da təhlükəlidir, çünki səhifənin parsing axışınıda poza bilər, hətta müasir CSP olsa belə document.write çox vaxt təhlükəli qalır. Əgər <script>document.write(“<h1>hello,mein</h1>”);</script> olarsa ekranda h1 tegini icra edərək hello,mein yazısı çıxacaq. Eyni şeyi https://site.com/page?<img src=x onerror=alert(1)> olan urldə yazsaq, yəni <script>document.write(location.search);</script> olaraq yazılsa, birbaşa ekrana <img src=x onerror=alert(1)> düşəcək və XSS baş verəcək.

Bu şəkildə görə bilərik ki, seçim olaraq seçdiyimiz şəhərlər əslində select teqindədir, urldən bunu bypass edib əlavə seçimdə əlavə edə bilərik və bu yolla XSS edə bilərik.

Xss-i yarataqmaq üçün storeid boş olmalı və əvvəlki teq, yəni select teqi bağlanmalıdır.
11. DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded
Bu labda AngularJS istifadə edərək XSS almağımızı istəyir. AngularJS Javascript dilində tanınan bir kitabxanadır və ng-app atributdan ibarət olan HTML nodelarının məzmununu skan edir. AngularJS kitabxanası pythonda olan jinja2-ya bənzəyir. İfadə sintaksisləri demək olar ki eynidir, hər ikisidə {{…}} ilə işlənilir. Məsələn {{ 7 + 7 }} kodu hər ikisində cavabda 14 qaytaraq. Əgər angularjs saytda hesablama işlərini aparmağa kömək edirsə deməli XSS və template injection baş verə bilər və eyni zamanda jinja2 saytda hesablama işi apara bilirsə əsasən SSTİ və bəzəndə RCE zəifliyi yaranır. Bunlar arasında bir qədər fərqlər var, bilməyiniz öncəlikdir. AngularJS frontendlə, jinja2 backendlə əlaqəlidir, AngularJS brauzerdə işləyir, jinja2 isə serverdə işləyir.

Gördüyünüz kimi search hissəsindən hesablama işlərini etmək mümkündür, deməli asanlıqla Xss ala bilərik, bu payloadları chatgpt ilə və ya axtarış edərək tapa bilərsiniz.

13. Reflected DOM XSS
Burada bizə sadəcə search hissəsi verilib, əvvəla request göndərib burp ilə bu requestin cavabına baxaq.

search-results başlığı diqqəti cəlb edir, sonra isə saytın js fayllarında searchResults.js adlı fayl olduğunu görürük. Lakin bizə lazım olan hissə aşağıda görsərdiyim hissədir.

Burada olan eval() funksiyası da stringi kod kimi icra edə bilir. Yəni məsələn eval(“a = a + 10;”) olsa, “a = a + 10;” js kodu kimi işləyəcək. Yəni biz burda eval funksiyasının json formatda cavabını təxmin etməliyik. Məsələn heç bir kod əlavə olunmayıbsa normalda json cavab belə olmalıdır.
{"search":"...", "results":[]}
Lakin biz … olan hissəni idarə edə bilirik, bunu biraz araşdırsaq json responslarının dırnaq işarələrini escape etdiyini görə bilərik. Eyni zamanda \ işarəni escape etmir. Bunları bilərək \”-alert(1)}// payloadı yazmaq olar. \” stringdən çıxmaq üçündür, -alert(1)} payloaddır, // isə commentə salmaq üçündür. Yəni sadəcə alert(1) icra olunacaq.

14. Stored DOM XSS
Bu labda commentdən istifadə edərək Xss yaratmalıyıq, amma bundan əvvəl js fayllarında diqqət edək.

js fayllarında replace() funksiyası adətən yerləşir, və gördüyü ilk < və > elementlərini təhlükəsiz formaya replace edir. Yəni mən <script>alert(1)</script> yazsam <script>alert(1)</script> formasına düşəcək və beləliklə xss yaranmayacaq. Amma bu funksiyanı aldada bilərik. Yəni ilk olaraq boş <> yazırıq, funksiya avtomatik olaraq ilk gələn bu işarələri replace edir, lakin sonra gələnlərə baxmır.

Comment hissəsinə <><h1>salam</h1> yazsaq avtomatik olaraq yeni sətrə düşür və yazdığımız kodu icra edir. Xss etmək üçün <><script>alert(1)</script> yaza bilərik, lakin icra etmir. HTML kodlarına düşür lakin icra edə bilmir, bunun üçün img src-dan istifadə edə bilərik. Kodu onerrordan fərqli olaraq onmouseover ilə yazdım ki, ekrana həm comment düşsün, həmdə pop up düşsün.

15. Reflected XSS into HTML context with most tags and attributes blocked
Bu labda əlavə olaraq WAF var və biz bunu bypass etməliyik, əvvəla ənənəmizə sadiq qalaraq js fayllarına nəzər yetirirəm və görürəm ki, xss yarada biləcək eventləri escape edə biləcək bir funksiya tapdım, amma daha da dəqiqləşdirmək üçün burp ilə requesti tutaq.

Burp ilə tutduğumuz requestdə də xətadan başqa bir şey olmadığını gördükdən sonra requesti intruder-a göndərdim. Search hissəsini seçib teg listini əlavə etdim.

Teq listini seçmək istəyə uyğundur, githubda da paylaşan var, portswiggerin öz listidə var mən öz saytlarından istifadə etdim.

body teqinin status kodu 200 və response length-dan göründüyü kimi xəta almayıb. Sonra isə bodyə uyğun payload axtarırıq. Eventləri yenə öz saytından kopyalayıb payloada əlavə edirəm və hücumu başladıram.

intruder ilə aldığımız cavablardan sadəcə status kodu 200 olanlara baxmalıyıq.

Təəssüf ki, hamısını bir bir yoxladıqdan sonra görə bilərik ki, onresize ilə print əmrini etmək olar. Qarşıya göndərəcəyimiz kod isə belədir, <iframe src=”https://0aa3006303577f598055038300fd00c7.web-security-academy.net/?search=%22%3E%3Cbody%20onresize=print()%3E” onload=this.style.width=’100px’>
16. Reflected XSS into HTML context with all tags blocked except custom ones
Bu labda müəyyən olunan teglərdən başqa bütün html teqləri bloklanıb, lakin bunu axtarmalıyıq ki, hansı teq blokda deyil. Yoxlamaq üçün əvvəlcə h1 teqi ilə axtarış edək.

Göründüyü kimi, teq artıq bloklanıb, bəs var olmayan bir teq yazsaq yenə də bloklayarmı?

Həqiqətdə var olmayan bir teq yazdıqda sistem bunu normal teq kimi görür, yəni teqin içində verdiyimiz məlumat koda inject oluna bilir. Bəs var olmayan teq ilə pop-up çıxarda bilərəmmi? Gəlin yoxlayaq.

İnandırıcı olmasa da, həqiqətdə olmayan bir teqdən xss yaratmaq olur. Və bunu istismar etməkdə olar. Labı bitirmək üçün isə bizdən document.cookie ilə etməmizi istəyir. Lakin bunu isə avtomatikləşdirməliyik, çünki exploit serverə məhz spesifik bir url təqdim etməliyik. Standart payloadımıza iki əlavə atribut əlavə etməliyik, bunlardan birincisi id=x-dir. İd atributu sadəcə elementə verilən identifikatordur və eyni zamanda urldəki müəyyən bir hissəyə hashtag vasitəsi ilə fokus olmamıza kömək edəcək bir atributdur. Yəni id=’x’ yazsaq url-in sonuna #x yazsaq artıq url avtomatik olaraq müəyyən etdiyimiz hissəyə fokuslanacaq. Lakin bu iki məsələn qarışdırmaq olmaz. Hansısa səhifəni ziyarət etmək ilə, fokus olmaq eyni deyildir. Məsələn fokus olarkən sadəcə müəyyən teq və ya atributa fokus ola bilər, amma sadəcə səhifəni ziyarət etdikdə bu belə deyil. İkinci əlavə edəcəyimiz atribut isə tabindex atributudur. Əgər web proqramlaşdırma ilə birazda maraqlanmısızsa tabindex atributundan istifadə etmisiz, tabindex atributu tab klavişini vuraraq avtomatik olaraq sonrakı hissəyə fokus ola bilir, əsasən form hissələrində bunu görmək olar, hansı ki biz burada adımızı yazdıqdan sonra tab-a vursaq soyad hissəsinə avtomatik olaraq keçid edə bilərik.
17. Reflected XSS with some SVG markup allowed
Bu labda svg əsaslı reflected xss yaratmalıyıq. Əvvəla svg haqqında məlumat alaq sonra isə exploit hissəsinə keçək. SVG – Scalable Vector Graphics, yəni miqyaslana bilən vektor qrafika deməkdir. svg xml əsaslı veb qrafika formatıdır, yəni mətn formatında yazdığımız kodu şəkilə çevirə bilir. Digərlərindən ən əsas fərqi isə budur ki, raster (jpg/png) deyil. Raster olmamasının avantajı çoxdur, çünki hansısa sistem ola bilərki raster qrafikalarını blok edə bilər amma svg ilə burada asanlıqla xss əldə etmək olar. SVG daxil etmənin bir çox yolları var, əsasən developerlər və eyni zamanda bizlərində xss yaratmaq üçün classic olaraq ağlımıza inject edilən <img src=….> formatıdır. Əsasən bu format artıq daha təhlükəsizləşib. Başqa bir növü isə <svg>…</svg> formatıdır. Bu format bir başa DOM-a daxil olur, yəni daha aydın dildə desək js və css ilə idarə olunur. Labda isə biz axtarış hissəsinin requestini burp intrudere göndərib payloadı portswiggerin xss cheatsheetinden tegleri kopyalayib yapisdiraraq attacki basladiriq. Bizə alınan cavablardan sadəcə status kodu 200 olanlar lazımdır.

alınan cavablardan istəniləni seçmək olar lakin bəzi teqlərdə problemlər olduğu üçün animatetransform tegini seçəcəm. Bəlkədə bu problemlər sizdə alınmaya da bilər. İndi isə teqi seçdikdən sonra eventləri seçməliyik ki, hansı event bloklanmayıb. Bunun üçün yenə xss cheatsheetdən istifadə edəcəyik.

Alınan nəticədə sadəcə onbegin eventi 200 kodu olduğu üçün artq payloadımızı yaza bilərik. Payloadımız “><svg><animatetransform onbegin=alert(1)> əvvəldə olan “> h1-dən çıxıb yeni sətirə keçmək üçündür.

Gördüyünüz kimi şəkil əlavə olunub və teqdə artıq inject edilib.

18. Reflected XSS in canonical link tag
Bu lab istifadəçi girdisini səhifənin <link rel="canonical" href="..."> elementində əks etdirir; lakin bu tətbiqdə< və > escape edilərək bloklanır. Hədəf ana səhifədə reflected XSS icra edərək canonical elementə alert funksiyasını çağıran bir atribut injektə etməkdir. Labın göstəricilərinə görə exploit yalnız Chrome brauzerində işləyir. Gəlin indi payloadı yazaq.

payloadımız ‘accesskey=’x’onclick=’alert(1) budur indi isə izah edək.

href=”…” user inputudur, biz href-dən qaçmaq üçün payloadın əvvəlinə tək dırnaq işarəsi qoyuruq, acceskey klaviaturada göstərilən simvola görə qısayol yaratmaq üçündür. Labın əvvəlində də qeyd olunduğu kimi sadəcə Chrome brauzerində işləyir. Pop-up çıxartmaq üçün isə ALT+SHİFT+X vurmağımız kifayət edir.
19. Reflected XSS into a JavaScript string with single quote and backslash escaped
Bu labın descriptionu biraz qarışıq görünsədə ənənəmizə sadiq qalaraq code review edirik.

axtarış hissəsinə yazdığımız hər dəyər script teqinin daxilində işləyir. Yəni ilk ağıla gələn yol budur ki, teqdən qırağa çıxıb xss yarada bilərik.

url hissəsindən də göründüyü kimi payloadımız </script><script>alert(1)</script> – dir
20. Reflected XSS into a JavaScript string with angle brackets and double quotes HTML-encoded and single quotes escaped
Bu labda html encode olunarkən escape olunan dəyərlər üzərindən xss etməyimiz lazımdır. Əvvəla axtarış hissəsinə random bir şey yazaq və necə işlədiyinə baxaq.

Arxada script teqinin içində işləyən bir urlencode var. Bu kimi hallarda əsasən teqdən çıxıb xss yaratmaq deyil, dəyərin içindən çıxıb xss yaratmağa fokuslanmalıyıq. Daha çox məlumat almaq üçün tək dırnaq işarəsi əlavə edib göndərirəm.

Burdan bu nəticəyə gəlmək olar ki, dırnaq əlavə etdiyimiz zaman avtomatik olaraq escape etmək üçün mətnin sonuna \ əlavə edir. Bundan qaçınmaq üçün isə özümüz saxta olaraq input hissəsinə escape olunma hadisəsini yazsaq artıq ikinci dəfə sonrakı escape baxmaz.

Artıq terms dəyərindən qırağı çıxa bildik, payloadda – işlənməyinin səbəbi url encode görədir. Çünki + yazsaq avtomatik olaraq url encode olunur və işləvsiz qalır. Birinci escapedən çıxdıq amma sondakı escape hələdə bizə mane olur. Bunun üçün isə payloadın sonuna şərh əlavə edə bilərik.

21. Stored XSS into onclick event with angle brackets and double quotes HTML-encoded and single quotes and backslash escaped
Bu labda əvvəlki labda öyrəndiklərimizi tətbiq edib daha da inkişaf etdirəcəyik. Blog hissəsində vebsite əlavə olunmağa açıq olduğunu görürük.

İlk ağlımıza gələb yol href-dən çölə çıxıb bir yolla xss yaratmaqdır. Bunu etmək üçün isə tək alert(1)-i tək dırnaq arasına ala bilərik.

Lakin kod hissəsində bizi heçdə yaxşı şeylər qarşılamır. Hər dəfə tək dırnaq qoyduqda əvvəlinə \ əlavə edir.

escape + escape olunub deyə heç bir yolla xss alına bilmir, lakin başqa bir yolu url encode etməyin tərsini etməkdir. Bunun üçün aposdan istifadə edəcəyik. Apos tək dırnaq işarəsini bildirir. Yəni HTML mənbə kodunda ' yazılarsa, brauzer onu render edəndə istifadəçiyə və DOM-a əsl ‘ kimi düşür.

payload isə belədir: http://salam?'-alert(1)-' Bu labda sadəcə tək dırnaq işarəsini necə yaza bilərik deyə öyrəndik qalan texnikalar isə yuxarıda öyrəndiklərimizdir.
22. Reflected XSS into a template literal with angle brackets, single, double quotes, backslash and backticks Unicode-escaped
Bu labda isə tırnaqlardan əlavə backticks simvolu ilə xss yaratmağa çalışacağıq. Backticks javascriptdə template literal üçün istifadə olunur, dəyişənləri və digər ifadələri stringin içinə yazmağa kömək edir. Search hissəsindən salam yazaraq bunu varlığını yoxlaya bilərik.

Yazdığımız söz iki yerdə bizi qarşılayır, ekranda olan cavab və arxasında dayanan sistem. var message hissəsindən görə bilərik ki backticks ilə başlayır və bizim verdiyimiz ifadə backticksin içinə yazılır. İfadələr isə backticksin içinə ${input()} bu formatda olanda yazilir. inputa istədiyimizi yaza bildiyimizə görə, search hissəsinə sadəcə ${alert(1)} yazsaq xss yarada bilərik.

Qeyd: Exploiting cross-site scripting to steal cookies və Exploiting cross-site scripting to capture passwords Burp Suite pro tələb etdiyi üçün təəssüfki həll edə bilmirəm.
23. Exploiting XSS to bypass CSRF defenses
Bu labda CSRF bypass edərək xss yaratmağımız istənilir, lakin səbirsiz olub comment hissəsinə sadə xss payloadı yazıb yaratmaq olurmuş. Ama biz təbiikidə verilən şərtə uyğun həll etməliyik. Heç bir şey etmədən normal payload ilə xss yarada biliriksə deməli protect olunmayıb və buda bizim xeyrimizədir. Verilən credentiallar ilə hesaba daxil olduqda update email hissəsini görə bilərik. Requestini incələyək.

Requestdə bizim kimliyimizi eyni tutmaq üçün csrf token var lakin bəzən düzgün protekt olunmayanda problemlərə yol aça bilər. Yorum yazma hissəsində də məhz csrf ilə göndərilir. Bu labı daha yaxşı və rahat həll etmək üçün bundan əvvəlki iki labı bitirmək lazımdır amma etməsəkdə edə bilərik.

Bu payloadda var token skript səhifədə name=”csrf” atributlu bir input (məs., <input name=”csrf” value=”…”>) götürməyə çalışır və .value ilə token dəyərini oxuyur. Əgər CSRF tokeni səhifə HTML-də normal text input və ya hidden input kimi qoyulubsa və HttpOnly deyilirsə, hər hansı məzmun daxil edən (xss) kod bu tokeni oxuyub göndərə bilər. Məhz buna görə də xss aid edilir. Sadəcə biz requesti script formasında yazdıq və hər kimsə bu səhifəyə gəldikdə avtomatik olaraq yenilənəcək. Bəzən bu payload işləmir xhtml-ə görə ama anyway daha işlək versiyaları mövcuddur.
“PRACTİONER”dərəcəsində olan 15 labı bitirdim, təbiiki sonrakı hissədə artıq xss lablarını bitirmiş olacağıq. Oxuduğunuz və həll etdiyiniz üçün təşəkkürlər!
Ümidvaram faydalı olmuşdur.
Bizi izləyin:
Telegram (Kanal): https://t.me/xakeraz_official
Paylaşımların səliqəli yığılmış halı: https://t.me/xakerazgroup
Fikir və şərhləriniz : https://t.me/xakerazchat