BogdanNBV Posted July 27, 2012 Report Posted July 27, 2012 (edited) 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: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"Dupa ce ati apasat, butonul portocaliu cu Firefox va disparea si va aparea meniul clasic.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.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.phpContinutul 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.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"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!Dupa ce l-ati selectat pentru a fi urcat mergeti in meniul "Unelte" -> "Tamper Data"Dupa ce ati apasat pe "Tamper Data", o fereastra ca aceasta va va aparea:In fereastra nou aparuta apasati pe butonul "Start Tamper"Dupa ce ati apasat pe butonul "Start Tamper" el se va dezactiva, iar butonul de langa el "Stop Tamper" va deveni activ.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: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 deschideIn 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" '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"Dupa ce am terminat de modificat, apasam pe butonul "Ok"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.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.Iar dupa cum putem vedea, fisierul nostru "fisier_malitios.php" a fost urcat cu succes, si acum il putem testa.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 April 24, 2013 by BogdanNBV 1 Quote
Sim Master Posted July 27, 2012 Report Posted July 27, 2012 Dar daca verificarea se face server-side atunci nu e tot una fie ca pui direct un fisier .php fie ca ii schimbi extensia cum ai facut in tutorial? In ambele cazuri fisierul va ajunge pe server cu extensia .php si nu va trece de filtre, daca sunt. Quote
BogdanNBV Posted July 27, 2012 Author Report Posted July 27, 2012 (edited) 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 July 27, 2012 by BogdanNBV Quote
Sim Master Posted July 27, 2012 Report Posted July 27, 2012 My bad, nu am observat ca ai pus si codul php, iar cand scriam mesajul ma gandeam mai degraba la o verificare a extensiei decat a tipului. Quote
afumat Posted July 27, 2012 Report Posted July 27, 2012 sincer e explicat pe intelesul milogilor ca mine....Ai facut o treaba buna! Multumesc MULT! Quote
adriann54 Posted July 28, 2012 Report Posted July 28, 2012 Un tutorial reusit si foarte util.Cam prea detaliat.Time to rate : 6/5 gz Quote
BogdanNBV Posted July 28, 2012 Author Report Posted July 28, 2012 Cu placere si stiu ca l-am explicat in detaliu, dar am facut asta pentru a scapa de indatorirea de a raspunde la intrebari. Quote
Cheater Posted April 24, 2013 Report Posted April 24, 2013 (edited) 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.jpg2. 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 April 24, 2013 by Cheater Quote
B0mberman Posted April 24, 2013 Report Posted April 24, 2013 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 Quote
Cheater Posted April 25, 2013 Report Posted April 25, 2013 @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. Quote