Jump to content
BogdanNBV

Vulnerabilitatile uploadarii fisierelor [Editia Firefox]

Recommended Posts

In urma cererii unui utilizator in acest

subiect am sa fac tutorialul promis.

Pentru inceput avem nevoie de Mozilla Firefox .

Dupa ce l-ati instalat, instalati plugin-ul Tamper Data .

Nu am sa va explic cum sa instalati Firefox sau acel plugin pentru ca este extrem de simplu.

Acum ca aveti uneltele necesare, putem incepe.

Deschideti Firefox, el va arata la inceput asa:

205up9c.jpg

Si pentru ca mie nu-mi place asa si nu mi-se pare usor de folosit meniul acela smecheresc al lor am facut urmatoarele pentru a avea acces mai rapid la tot ce ma intereseaza, si am procedat asa:

Apasati pe butonul acela portocaliu pe care scrie Firefox -> "Optiuni" -> Apasati pe "Bara meniului"

28a3x55.jpg

Dupa ce ati apasat, butonul portocaliu cu Firefox va disparea si va aparea meniul clasic.

akxr0n.jpg

Iar plugin-ul Tamper Data il veti gasi la Unelte, la mine este ultimul din meniul ce apare, pentru ca nu folosesc Firefox si nu am alte plugin-uri instalate.

2qlheh2.jpg

Asa, acum sa trecem la partea PHP si ce, si cum.

Pentru a testa metoda voi face un script rapid, care verifica DOAR tipul fisierului, nu si extensia, aceasta metoda functionand doar pe site-urile ce verifica DOAR tipul fisierului primit in header de la client.

Voi face un singur fisier care va contine si formularul de urcare al fisierului, cat si partea PHP.

Fisierul "upload.php" :


<?php


$tipuri_valide = array("image/png","image/gif","image/jpeg");
if(isset($_FILES['fisier']))
{
if(in_array($_FILES['fisier']['type'], $tipuri_valide))
{
if(move_uploaded_file($_FILES['fisier']['tmp_name'],"./{$_FILES['fisier']['name']}"))
echo "Fisierul a fost urcat cu succes! <br/><br/>";
}
else
echo "Ai voie doar imagini (jpg, png, gif)<br/><br/>";
}

?>


<form method = "post" enctype = "multipart/form-data">
<input type = "file" name = "fisier" />
<input type = "submit" value = "Urca!" />
</form>

Asa, acum ca avem si unde testa tehnica putem continua.

Incepem prin a intra pe site-ul pe care vrem sa urcam fisierul nostru, fie el php, swf, html, sau ce alt fisier vrem.

Odata intrati pe site incercam sa-l urcam simplu, cum ati face cu orice alt fisier, eu voi urca un fisier PHP denumit fisier_malitios.php

29nfo2f.jpg

Continutul fisierului fisier_malitios.php :


[SIZE=3]<?php[/SIZE]
[SIZE=3] phpinfo();[/SIZE]
[SIZE=3]?>[/SIZE]

Iar dupa ce l-am urcat vom primi un mesaj cum ca ori tipul fisierului nu este acceptat, ori o lista cu tipul de fisiere acceptate.

fbkfuv.jpg

Acum ca stim ca putem urca doar imagini, jpg,png sau gif, vom redenumi fisierul "fisier_malitios.php" in "fisier_malitios.PNG" sau "fisier_malitios.JPG" sau "fisier_malitios.GIF", sau orice alta extensie a tipurilor de fisiere valabile, eu am sa redenumesc in "fisier_malitios.jpg"

2ikp947.jpg

Acum ca avem fisierul nostru malitios cu extensia unui tip de fisier valabil, vom trece si in Tamper Data.

Deci, ne reintoarcem in Firefox, pe acelasi site, dar acum vom da sa urcam fisierul nostru redenumit, in cazul meu "fisier_malitios.jpg", DAR NU APASATI PE BUTONUL "Urca!" INCA, DOAR SELECTATI FISIERUL PENTRU A FI URCAT!

atp6ic.jpg

Dupa ce l-ati selectat pentru a fi urcat mergeti in meniul "Unelte" -> "Tamper Data"

xdsgno.jpg

Dupa ce ati apasat pe "Tamper Data", o fereastra ca aceasta va va aparea:

ind72e.jpg

In fereastra nou aparuta apasati pe butonul "Start Tamper"

snjww7.jpg

Dupa ce ati apasat pe butonul "Start Tamper" el se va dezactiva, iar butonul de langa el "Stop Tamper" va deveni activ.

312usrk.jpg

Acum este timpul sa lasam aceasta fereastra deoparte, deschisa si sa ne intoarcem inapoi in Firefox, unde vom apasa pe butonul "Urca!", tineti minte, lasati fereastra cu "Tamper Data" deschisa si Tamper-ul pornit.

Odata apasat butonul "Urca!", actiunea de trimitere a datelor catre site va fi oprita si vom fi intampinati cu urmatorul mesaj:

nqtr0o.jpg

Si cum ne este si sugerat, vom apasa pe butonul "Tamper", cel incercuit cu albastru in imaginea de mai sus.

Dupa ce ati apasat pe butonul "Tamper", o alta fereastra se va deschide

2hxspqs.jpg

In fereastra incercuita cu rosu din imaginea de mai sus (^) ne vom concentra asupra sectiunii marcate cu prin chenarul albastru.

In acea casuta vom cauta urmatorul lucru ' filename="fisier_malitios.jpg" '

2d1pw7d.jpg

Dupa ce l-am gasit, vom modifica ' filename="fisier_malitios.jpg" ' in ' filename="fisier_malitios.php" ', deci vom modifica extensia fisierului din cea valida in cea initiala, in cazul meu ea fiind ".php"

rj4ltd.jpg

Dupa ce am terminat de modificat, apasam pe butonul "Ok"

3539t2c.jpg

Dupa ce ati apasat pe butonul "Ok", trimiterea datelor va continua, iar daca totul a decurs cum trebuie, vom primi mesajul "Fisierul a fost urcat cu succes!", iar fereastra "Tamper Data" o puteti inchide.

21lj53a.jpg

DACA DUPA CE ATI MODIFICAT EXTENSIA SI ATI APASAT PE BUTONUL OK SI INCA MAI PRIMITI FEREASTRA ACEEA CE AM PRIMIT-O DUPA CE AM APASAT PE BUTONUL "Urca!", ACEA FEREASTRA CU BUTOANELE "Tamper", "Submit", "Abort Request", APASATI PE SUBMIT LA TOATE PANA NU MAI APAR.

Iar acum putem vedea daca chiar am pacalit sistemul si am urcat un fisier care in mod normal nu aveam voie sa-l urcam, asa ca vom intra pe site, unde sunt urcate fisierele si vom cauta fisierul nostru.

20l1842.jpg

Iar dupa cum putem vedea, fisierul nostru "fisier_malitios.php" a fost urcat cu succes, si acum il putem testa.

1zwm5ps.jpg

Si dupa cum se vede in imaginea anterioara "fisier_malitios.php" functioneaza cum perfect.

Sper sa va fie de ajutor acest tutorial in a va invata sa va protejati site-urile impotriva urcarii de fisiere malitioase.

Daca ati gasiti greseli de scriere/exprimare, va rog sa-mi atrageti atentia.

Si daca vreti sa adaugati ceva acestui tutorial, simtiti-va liberi sa o faceti.

Edited by BogdanNBV
  • Upvote 1
Link to comment
Share on other sites

Pai, verificarea tot pe servere se face, numai ca eu sunt sarac si nu am bani de gazduire web sau vps sau ditai serverul tinut la vreo firma, asa ca eu am facut la mine in computer, pe xampp, deci practic mi-am transformat computerul in server web pentru acest tutorial, pentru ca asa fac sarantocii, principiul este acelasi si daca e la tine in computer site-ul si daca este pe un server in Mexic pe o straduta intunecata care colcaie de sobolani si cadavre de oameni... ia-o asa, fisierul upload.php este ce este pe server, el contine filtrul care te lasa sa urci doar fisiere jpg, png si gif, dar filtrul acela nu este suficient, pentru ca cum vezi, am reusit sa trec de el.

Edited by BogdanNBV
Link to comment
Share on other sites

Daca ai un upload ce nu e verificat server side, mai simplu faci un html de 3 linii, decat sa folosesti asta.

Sunt 3 tipuri de verificari server side:

1. se verifica doar extensia, astfel faci bypass introducand un nulled char in poza ex: poza.php%20.jpg

2. se verifica corect extensia, extensia dubla, si nu putem injecta nulled char, astfel urcam fisier.jpg, ce contine cod php, fisierul este urcat dar nu va fi executat, apoi trebuie sa gasim o metoda de a pacali serverul sa il execute, ex: fckeditor, are o vulnerabilitate ce permite urcarea de fisiere .htacces astfel putem urca un fisier in care ii spunem serv apache ca fisierele cu numele fisier.jpg trebuie executate ca php indiferent de extensie.

3. sunt de asemenea scripturi care suplimentar verifica headerele imaginii, astfel va trebui sa bindam o poza reala cu headere si exif corecte in shell, pentru a-l urca.

Eu dupa verificarile de extensie fac resize la imagini, astfel daca poza nu este poza modulul gd imi returneaza o eroare si scriptul nu o mai muta din locatia temporara in locatia accesibila de pe web, daca nu returneaza o eroare poza oricum e curatata dupa resize. De asemenea nu apelez fisierul urcat dupa numele cu care a fost urcat ci dupa numele temporal generat de php, astfel indiferend de extensie nu ma afecteaza seturi de caractere injectate. Lucru ce vi-l recomand. Suplimentar se pot dezactiva 5-6 functii din php ce duc la blocarea oricarui shell.

Edited by Cheater
Link to comment
Share on other sites


Content-Disposition: form-data;name="fisier";filename="mal.jpg"
Content-Type: image/jpeg

<?php\n\nphpinfo();?>

Functioneaza pentru ca $_FILES['plm']['type'] e gandita ca un rahat. Tu cand selectezi fisierul shell.jpg, browser-ul adauga in header Content-Type: image/jpeg uitandu-se doar la extensie, iar $_FILES['plm']['type'] citeste doar header-ul primit, fara sa verifice continutul fisierului. Tie iti mai ramane doar sa modifici header-ul ca browser-ul sa trimita alt fisier.

Cel mai sigur e sa uploadezi fisierul intr-un director temporar inaccesibil prin web(/tmp/), sa-i verifici mime type-ul(iar daca te intereseaza doar imaginile, recomand PHP: exif_imagetype - Manual), sa-i faci strip la exif(in cazul in care esti un programator prost si cumva reusesti sa executi php-ul din exif image processing - Remove EXIF data from JPG using PHP - Stack Overflow) si apoi sa-l muti pe web(/var/www/uploads/).

Si la fel cum spune cheater, sa verifici extensia.


$ex = explode(".", $filename);
if(in_array($ex[count($ex)-1], $extensii_acceptate)
move();

Aici te flambezi aiurea pentru ca aceeasi intrebare pe care a pus-o Sim am vrut sa ti-o pun si eu, pana am investigat. Cand a zis "server-side" nu s-a referit daca ai tu neaparat un server dedicat, ci doar acolo unde e php-ul. Voiai sa zica "engine-side"? Iar tu practic n-ai trecut de niciun filtru, ca filtrarea se face corespunzator asa cum a fost ea gandita; nu e bypass, e workaround.

Nenea omu a facut un tutorial simplu daca vrei sa i dai in cap cautal pe acasa... dar nu mai posta rahaturi cand te simti frustrat.

PA

Link to comment
Share on other sites

@B0mberman fi cu mai mult respect fata de cei mai vechi, ai ce invata.

@SecretService a pus problema corect, a complectat postul, meu, a explicat corect si ce e server side, daca nu cunoasteti unele cuvinte ex: server-side vs client-side, engine-side, bypass, workaround vedeti google si wikipedia, apoi postati.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...