Vulnerabilitati PHP – Cross Site Request Forgery - Securitatea Informatica

Vulnerabilitati PHP – Cross Site Request Forgery

Prin intermediul CSRF putem chiar schimba parola de administrator. Poate fi folosit prin intermediul XSS, redirecţionare.

1. Exemplu de bază

Cod:

<?php
check_auth();
if(isset($_GET['news']))
{ unlink('files/news'.$news.'.txt'); }
else {
die('File not deleted'); }
?>

În acest exemplu veţi vedea ce este CSRF şi cum funcţionează. În folderul “files” sunt salvate ştirile scrise de un autor. Ştirile sunt salvate în modul “news1.txt”, ”news2.txt” etc. Administratorul poate şterge ştirile. Ştirile pe care vrea să le şteargă vor fi precizate prin intermediul variabilei “news”. Dacă vrea să şteargă “news1.txt” valoarea variabilei “news” va fi “1″. Nu putem executa asta fără permisiuni de administrator, scriptul verifică dacă administratorul este logat. Dacă facem următoarea cerere:

http://127.0.0.1/test.php?news=1

fisierul /news/news1.txt va fi şters. Scriptul şterge direct fişierul fără nici o avertizare. Putem folosi asta pentru a şterge un fişier. Tot ce trebuie să facem este să convingem adminul să acceseze link-ul nostru şi fişierul corespunzător valorii variabilei setate de noi va fi şters.

2. Exemplu simplu

Într-un fel codurile de mai jos sunt incluse în index.php, nu voi copia aici toate incluziunile pentru că sunt o grămadă.

Cod:

<?php
if ($_GET['act'] == '') {
include "includes/pages/admin/home.php";
} else {
include "includes/pages/admin/" . $_GET['act'] . ".php";
?>

Aici putem observa cum “includes/pages/admin/members.php” este inclusă în acest fişier. Dacă valoarea variabilei “act” va fi egală cu “members” fişierul acesta va fi inclus.

Cod:

<?php
if ($_GET['func'] == 'delete') {
$del_id = $_GET['id'];
$query2121 = "select ROLE from {$db_prefix}members WHERE ID='$del_id'";
$result2121 = mysql_query($query2121) or die("delete.php - Error in query: $query2121");
while ($results2121 = mysql_fetch_array($result2121)) {
$their_role = $results2121['ROLE'];
}
if ($their_role != '1') {
mysql_query("DELETE FROM {$db_prefix}members WHERE id='$del_id'") or die(mysql_error
());
?>

Putem observa că dacă valoarea variabilei “func” este egală cu “delete”, scriptul va şterge din baza de date un user căruia îi corespunde ID-ul ($id) specificat fără nici o avertizare. Exemplu:

http://127.0.0.1/index.php?page=admin&act=members&func=delete&id=4

Scriptul va verifica dacă adminul este logat, deci dacă vom putea păcăli administratorul să acceseze link-ul nostru, utilizatorul cu ID-ul specificat de noi în link va fi şters fără nici o avertizare.

3. Cum să fixezi
Metoda simplă: Folosiţi token-uri. La fiecare login, generaţi un token random şi salvaţi-l în sesiune. Cereţi tokenul în URL pentru a executa comenzi administrative. Dacă token-ul lipseşte sau este incorect, nu executaţi actiunile. Vă voi arăta un exemplu:

Cod:

<?php
check_auth();
if(isset($_GET['news']) && $token=$_SESSION['token'])
{ unlink('files/news'.$news.'.txt'); }
else {
die('Error.'); }
?>

Cererea noastră va devenii:

http://127.0.0.1/index.php?delete=1&token=[RANDOM_TOKEN]

şi cererea va fi corectă.

Altă metodă: Realizaţi confirmări complicate sau cereţi o parolă pentru a putea executa comenzi administrative.

Acest articol nu încurajează nici o metodă de hacking ci doar prezintă majoritatea tehnicilor vizate de hackeri. Observând cum “gândesc” hackerii puteţi să vă daţi seama unde codul dumneavoastră prezintă buguri sau posibile vulnerabilităţi. Pentru orice nelămuriri, completări sau orice altceva nu ezitaţi să vă expuneţi opinia.

Sursa: SirGod

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