Sunteți pe pagina 1din 3

Laborator 07 - Securitate II

02.04.2013

Programare Web
You are here: Program are W eb Laboratoare Laborator 07 - Securitate II

Show pagesource

Old revisions

Recent changes

Index

Login

Search

Laborator 07 - Securitate II
Una din componentele cele mai sensibile ale unei aplicaii web este baza de date. Aceasta reine informaie obinut cumulativ, n timp, care valorific (financiar, informaional) aplicaia n sine. Exemple de astfel de informaii: utilizatori autentificai; posturi (n cazul forumurilor); produse i comentarii la produse; Pierderea acestor informaii produce, pe lng nefuncionare, devalorizarea aplicaiei n sine. Spre exemplu, valoarea unei aplicati de social-networking este dat (pe lng funcionaliti, implementare, design, etc), de numrul de persoane care o folosesc, mai general de cantitatea de informaii pe care aplicaia o pune la dispoziie. Or, aceast informaie este de valoare critic pentru o aplicaie, i ea trebuie protejat. Un prim pas este realizarea de back-up-uri regulate ale informaiilor. n continuare, vom examina alte situaii vulnerabile care conduc la compromiterea bazei de date, i solutii de evitare a acestora. Soluii de protejare: limitarea accesului la anumite fiiere de pe server; n Apache, acest lucru se poate face editnd httpd.conf astfel:
<Files ~ "\.inc$"> Order allow,deny Deny from all </Files>

Table of Contents
Laborator 07 - Securitate II Ex punerea de inform aii n fiiere SQ L Injection Session Hijack ing Session Fix ation Ex ercitii Bibliografie

Repartizare teme Catalog PW Laboratoare Laborator 01 - Introducere Laborator 02 - BD in PHP Laborator 03 - Arrays, Magic Methods Laborator 04 - (X)HTML, CSS Laborator 05 - Formulare HTML, Persistena Datelor Laborator 06 - Securitate I Laborator 07 - Securitate II Laborator 08 - JavaScript Laborator 09 - DOM scripting Laborator 10 - AJAX Laborator 11 - Web Frameworks Teme Tema 01 - API pentru BD Tema 02 - Template System & Controller Tema 03 - Generator de formulare Tema 04 - Tree Web UI Login

folosirea unei extensii care foreaz evaluarea script -ului, spre deosebire de afiarea lui ca atare

Expunerea de informaii n fiiere


Majoritatea aplicaiilor web care interacioneaz cu baze de date rein informaiile de conectare n fiiere auxiliare. Tema 1 folosete un astfel de fiier. Exemplu:
define define define define ('ADDRESS', 'localhost'); ('DATABASE', 'tema1'); ('USERNAME' , 'root'); ('PASSWORD', '');

S presupunem c fiierul care conine codul de mai sus se numete constants.inc, i c se afl n direc t orul root al aplicaiei. Cel mai probabil, acesta va fi inclus de un script php, astfel: require_once('constants.inc');. Dac ns un utilizator intuiete (sau alege la ntmplare) numele acestui fiier, l poate accesa astfel:
http://localhost/path/to/constants.inc

Cum nici browserul nici serverul nu au informaii despre extensia *.inc, coninutul acestui fiier este ntors utilizatorului ca i text. Consecinele sunt intuitive. Username-ul i parola pentru conectarea la baza de date sunt compromise, i implicit coninutul acesteia.

SQL Injection
SQL Injection se refer la injectarea de cod SQL maliios la rularea unui query. Fie urmtorul script care construiete un query pe baza unui formular primit:
$query = "INSERT INTO users (username, password, email) VALUES ('{$_POST['username']}', '$autoPassword', '{$_POST['email']}')";

Variabila $autoPassword reprezint o parol generat automat, care poate fi trimis utilizatorului via email, la crearea contului. S afim acest query pentru nite valori convenionale trimise prin formular:
INSERT INTO users (username, password, email) VALUES ('user', '6d0f846348a856321729', 'email')

Ce se ntmpl ns dac un utilizator completeaz cmpul username cu urmtoarea valoare:


bad_guy', 'mypass', ''), ('good_guy

file:///D:/Dropbox/0.Cursuri%20Clubcisco/0%20facultate%20addon%20may/a4s2/c1%20programare%20web/labs/Laborator%2007%20-%20Securitate%20II.htm

1/3

Laborator 07 - Securitate II

02.04.2013

Dac afim query-ul executat de script, obinem:


INSERT INTO users (username, password, email) VALUES ('bad_guy', 'mypass', ''), ('good_guy', '6d0f846348a856321729', 'email')

Efectul este vizibil: un utilizator nou este adugat cu o parol deja setat. Aparent, rezultatul acestei vulnerabiliti nu este foarte grav, ns putem considera urmtorul context: n locul funciei query (folosit uzual n laborator), folosim funcia multi_query, care permite rularea de instruciuni multiple trimitem n locul unui nume de utilizator irul:
some_guy', '', ''); DROP TABLE criticaltable; --

Query-ul produs va fi urmtorul:


INSERT INTO users (username, password, email) VALUES ('some_guy', '', ''); DROP TABLE criticaltable; --', 'ba2fd310dcaa8781a9a6', 'email')

Observaii: Caracterele reprezint comentarii; comentariile anuleaz restul expresiei SQL n ipoteza existenei tabelului criticalTable, acesta va fi ters Mai grav, instruciunea SQL DROP TABLE putea fi nlocuit cu DROP DATABASE , avnd un efect uor de imaginat. Chiar i n cazul n care folosim funcia query, care execut un singur query, SQL Injection poate fi folosit n formule (de sintax) mai complicate, pentru a produce efecte grave asupra bazei de date (spre exemplu: extragerea de informaii) Modaliti de protejare: filtrarea oricrei informaii provenite din formulare, indiferent de metoda folosit (acceptarea valorilor care respect un pattern prestabilit, i respingerea a orice nu respect acest pattern) folosirea funciei membru real_escape_string din clasa mysqli; detalii: http://www.php.net/manual/en/mysqli.real-escape-string.php

Session Hijacking
Un astfel de atac este posibil, dac session id-ul unui utilizator este compromis. Acest lucru este foarte posibil, innd cont de faptul ca session-id-ul este direct vizibil. Iat un exemplu de header HTTP, care expune session_id-ul. Header-ul provine de la un script care seteaz o sesiune:
HTTP/1.1 200 OK Date: Wed, 17 Mar 2010 18:31:47 GMT Server: Apache/2.2.11 (Win32) PHP/5.2.8 X-Powered-By: PHP/5.2.8 Set-Cookie: PHPSESSID=ls2pd33foiidr5ld6gkpqo94d0; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Content-Length: 0 Connection: close Content-Type: text/html

Observai linia PHPSESSID=ls2pd33foiidr5ld6gkpqo94d0;, care expune session id-ul. Incluznd acest session id ntr-o cerere HTTP, un atacator poate obine credenialele utilizatorului pe aplicaia web vulnerabil.

Session Fixation
Ca i Session Hijacking, Session Fixation se bazeaz pe folosirea session id-ului unui utilizator, ns fr a-l fura, ci impunndu-l. Un utilizator poate accesa un link care i fixeaz un anumit session id, care apoi e folosit ca id de sesiune, la autentificarea pe o aplicaie. Folosind id-ul fixat, atacatorul poate beneficia pe aplicaia vulnerabil, de privilegiile utilizatorului. Detalii despre Session Fixation: http://en.wikipedia.org/wiki/Session_fixation

Exercitii
(1.0p) Creai un fiier constants.inc, ntr-un director oarecare, i ncercai s-l accesai. Experimentai diverse soluii pentru protejarea coninutului fiierului. SQL Injection: (2.0p) Testai cele dou exemple descrise n capitolul SQL Injection. Folosii real_escape_string pentru protejarea script-ului. (2.0p) Scriei un mecanism general de filtrare a datelor. Introducei tipuri de date acceptate: string, number, email. Verificai coninutul unui formular trimis, verificnd tipul valorii trimise. Session Hijacking: (1.0)p Scriei un script session.php care seteaz o sesiune corespunztoare pentru un utilizator autentificat (omitei verificrile de username i parol, pentru a putea simula furtul id-ului de sesiune) Scriei un script secret.php care afieaz un mesaj secret utilizatorului autentificat, i un mesaj acces interzis, pentru utilizatorul ne-logat (verificarea se face pe baza sesiunii) (3.0p) Scriei un script care realizeaz o cerere HTTP via portul 80 ctre session.php, ext rage session-id-ul primit, i folosindu-l, realizeaz o alt cerere ctre secret.php. Aceast cerere va include session_id-ul, i pe baza ei putei obine acces la mesajul secret.

file:///D:/Dropbox/0.Cursuri%20Clubcisco/0%20facultate%20addon%20may/a4s2/c1%20programare%20web/labs/Laborator%2007%20-%20Securitate%20II.htm

2/3

Laborator 07 - Securitate II

02.04.2013

(3.0p) Propunei metode de prevenire pentru Session Hijacking; Pentru rezolvarea ultimelor dou subpuncte, plecai de la urmtorul script: hijack.php
<?php $url = parse_url('http://localhost/your/address/session.php'); $host = $url['host']; $path = $url['path']; $fp = fsockopen($host, 80);

// send the request headers:


fputs($fp, "GET $path HTTP/1.1\r\n"); fputs($fp, "Host: $host\r\n"); fputs($fp, "Connection: close\r\n\r\n"); $result = ''; while(!feof($fp)) {

// receive the results of the request


$result .= fgets($fp, 128); }

// close the socket connection:


fclose($fp);

// split the result header from the content


$result = explode("\r\n\r\n", $result, 2); $header = isset($result[0]) ? $result[0] : ''; $content = isset($result[1]) ? $result[1] : ''; echo $header; ?>

Bibliografie
http://phpsec.org/projects/guide/ http://en.wikipedia.org/wiki/Session_fixation

Show pagesource

Old revisions

Back to top

file:///D:/Dropbox/0.Cursuri%20Clubcisco/0%20facultate%20addon%20may/a4s2/c1%20programare%20web/labs/Laborator%2007%20-%20Securitate%20II.htm

3/3

S-ar putea să vă placă și