Informaţia sensibilă poate fi critică (cum ar fi parola), sau poate fi utilă pentru lansarea altor atacuri asupra altor subsisteme sau module. În cazul în care un atac eşuează, atacatorul poate utiliza informaţia din mesajele de eroare furnizate de server sau aplicaţie, pentru a lansa un alt atac. De exemplu o încercare de exploatare a vulnerabilităţii path traversal, ar putea furniza calea completă a aplicaţiei în sistemul de fişiere. La rîndul său, acest lucru ar putea fi utilizat pentru determinarea numărului de elemente “..” sau indicarea unei căi de acces către un fişier sau directoriu ţintă. Un atac ce utilizează vulnerabilitatea SQL Injection ar putea dezvălui structura tabelului, bazei de date, sau expune logica de interogare, şi posibil chiar parole sau informaţii sensibile utilizate în interogare.
Impact
Datele obţinute din exploatarea acestei vulnerabilităţi pot avea impact ridicat sau chiar critic asupra confidenţialităţii sistemului. Însă aceste date la rîndul lor reutilizate într-un nou atac, fie similar, fie altul complet diferit, ar putea compromite sistemul informaţional din punct de vedere al confidenţialităţii, integrităţii şi disponibilităţii.
Probabilitatea exploatării
Ţinînd cont de următoarele:
- Exploatarea vulnerabilităţii este foarte facilă din punct de vedere al aspectului tehnic
- Atacatorul nu trebuie să posede cunoştinţe temeinice în domeniu
- Prezenţa în formă liberă a unui număr mare de instrumente automatizate de detectare a acestui tip de vulnerabilitate
- Domeniul vast de posibilităţi în urma cărora pot apărea erori în sistemul informaţional (aplicaţie, server, baze de date ş.a.)
se poate afirma cu certitudine că probabilitatea de realizarea a unui atac asupra acestei vulnerabilităţi este foarte mare.
Nivel de risc
În orice metodologie de abordare a riscului în matrice de risc – riscul ca produsul dintre probabilitatea foarte mare şi impactul foarte mare are o valoare foarte ridicată.
Exemple
Exemplul 1. Afişarea erorilor la executarea interogărilor SQL
<?php/* * Cod vulnerabil SQL Injection în PHP. * * Acest cod execută o interogare MySQL şi în cazul apariţiei unei erori o afişează. * */ ... // Datele de intrare $utilizator="admin'"; $parola="parola"; $query="SELECT * FROM `users` WHERE utilizator='{$utilizator}' AND parola=PASSWORD('{$password}')"; $result=mysql_query($query) or die(mysql_error()); ... ?>
Rezultatul executării.
SQL ERROR: 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' AND parola=PASSWORD('parola')' at line 1' in /home/sites/securitate.md/pathtofile/cod_vulnerabil.php on line 15
Erorile din acest exemplu:
- expun logica de interogare
- indică calea de acces către fişierele aplicaţiei în sistemul de fişiere
astfel favorizează atacatorul în atacurile următoare. (SQL Injection)
2. Afişarea erorilor în cazul accesării unui fişier inexistent în sistemul de fişiere
/* * Cod vulnerabil Path Traversal într-un script Perl. * * In acest exemplu presupunem ca utilizatorul a introdus ca date de intrare * valoarea "securitate.md" * şi fişierul /home/securitate.md/config/securitate.md.txt nu există. */ $ConfigDir = "/home/securitate.md/config"; $utilizator = GetUserInput("utilizator"); ExitError("Sunteţi un atacator!") if ($utilizator !~ /^\w+$/); $fisier = "$ConfigDir/$utilizator.txt"; if (! (-e $fisier)) { ExitError("Eroare: $fisier nu există."); } ...
Rezultatul executării.
Eroare: /home/securitate.md/config/securitate.md.txt nu există.
Erorile din acest exemplu:
- indică calea de acces către fişierele aplicaţiei în sistemul de fişiere
astfel favorizează atacatorul în atacurile următoare. (Path Traversal)
Exempe ale acestei vulnerabilităţi în sisteme concrete
E-Post Mail Server 4.10 – Serverul POP3 expune parola în mesajul de eroare.
Quicksilver Forums 1.4.0 – Programul expune parola în mesajul de eroare dacă atacatorul poate cauza anumite erori în sistemul de gestiune al bazei de date
Veritas Software File System pînă la versiunea 5.0 MP3 – Aplicaţia ce rulează cu privilegii sporite îi permite utilizatorului de a indica calea spre un fişier accesul la care este interzis, ceea ce cauzează o eroare care expune conţinutul fişierului cu acces interzis.
Măsuri de control
- Asiguraţi-vă că mesajele de eroare conţin cît mai puţine detalii care pot fi utilizate pentru a compromite sistemul, pentru cei care le pot vizualiza.
- Mesajele de eroare nu trebuie în mod obligatoriu să conţină numele metodelor utilizate în care a avut loc eroarea sau alte detalii.
- În cazul în care mesajele de eroare trebuie monitorizate, păstraţi-le pe toate în fişiere log, însă trebuie numaidecît să luaţi în consideraţie consecinţele accesării acestor fişiere log de către atacatori, şi să restricţionaţi accesul la ele.
- Trebuie să evitaţi înregistrarea în fişierele log a oricăror informaţii sensibile cum ar fi parolele.
- Trebuie să respectaţi consistenţa mesajelor şi să nu informaţi potenţialul atacator despre vreun eveniment intern sistemului. Exemplu: În forma de logare, în caz de logare nereuşită, utilizatorii sistemului nu trebuie să cunoască dacă există sau nu un astfel de utilizator, ci faptul că autentificarea în sistem nu a fost posibilă din cauza că numele utilizatorului introdus sau parola nu sunt corecte.
Metode de realizare a acestor măsuri de control pentru PHP + Apache:
/* De indicat în php.ini */ error_reporting=NONE display_errors=0
În cazul în care nu e posibil de modificat fişierul php.ini:
/* * De indicat în .htaccess * (merge doar dacă safe_mode=Off şi dacă e indicat AllowOverride în httpd.conf) */ php_flag display_errors off php_flag error_reporting 0
În cazul în care nu e posibil de modificat .htaccess :
<?php /* Indicaţi la începutul fiecărui script PHP, sau a scriptului care e inclus în fiecare script PHP.*/ error_reporting(0); ini_set('error_reporting', E_NONE); // Doar daca safe_mode=Off ini_set('display_errors', 0); // Doar daca safe_mode=Off ?>
În cazul în care pe serverul de hosting e setat în httpd.conf AllowOverride None şi în php.ini Safe_mode=On şi nu funcţionează error_reporting(0):
<?php /* Indicaţi în codul sursă în drept cu fiecare funcţie care poate cauza eroare parametrul @ */ @include("config.php"); $result=@mysql_query($query) or die(""); ?>
Însă în afară de toate aceste măsuri fundamentale, e oportun ca stilul de scriere a codului să fie orientată spre prevenirea apariţiei acestor tipuri de erori.
<?php // Acelaşi script de mai sus scris cu precauţie paranoică faţă de erori $configfile="config.php"; if (file_exists($configfile) && is_readable($configfile) && is_file($configfile)) include($configfile); else die("Eroare 1"); $result=@mysql_query($query) or die("Eroare 2"); if(!$result) die("Eroare 3"); ?>
Deasemenea e util de a crea pagini personalizate pentru fiecare din erorile care pot apărea, şi în caz de eroare, de a redirecţiona utilizatorul aplicaţiei spre aceste pagini indicînd codul mesajului de eroare care trebuie să îl vadă utilizatorul.
#1 by Tchibo on April 23, 2010 - 15:18
Mai este posibilă şi folosirea blocului try/catch care ne asigură posibilitatea de captare a erorii unei intregi porţiuni de cod şi prelucrarea ei dupa placul nostru.
În exemplul de mai jos încercăm să includem un fişier şi să interogăm baza de date. În cazul apariţiei unei erori în cadrul la blocul try{}, se va efectua blocul catch{}.
try{
include(“scripts/config.php”);
$query=”SELECT * FROM `users` WHERE utilizator=’{$utilizator}’ AND parola=PASSWORD(‘{$password}’)”;
$result=mysql_query($query) or die(mysql_error());
}catch(Exception $e){
echo $e->getMessage();
}
În blocul catch{} de mai sus eroarea doar se afişează însă aici poate fi chemată o funcţie care să logheze eroarea şi să înştiinţeze administratorul despre ea.
Încă o posibilitate în cadrul la try{} este customizarea textului afişat utilizatorului prin utilizarea la “throw new MyException(‘Textul erorii’);”. În caz că nu o utilizăm va fi afişat textul generat de sistem.
Deci această metodă ne scapă de un şir de controale pe parcursul codului şi ne permite să controlăm outupul pe care îl va vedea utilizatorul în cazul erorilor pe pagină.