Cum se încarcă fișierele pe server, securitate

Cum se încarcă fișierele pe server, securitate
"... sau de ce filtrarea pe lista neagră este rea?"

Imaginați-vă o descărcare normală a fișierelor utilizând php. Cred că toată lumea sa confruntat cu asta. Aruncați opțiunile pervertite, cum ar fi stocarea fișierelor în baza de date, redenumirea acestora și așa mai departe. Luați forma obișnuită cea mai simplă de încărcare a fișierelor.







Aceasta este, de obicei, o formă pentru xmlml, apoi validarea de la server pentru a extinde fișierul încărcat și apoi transfera fișierul descărcat din folderul temporar în dosarul de descărcare. Respingem toate milioane de greșeli pe care le fac programatorii în aceste lucruri aparent mai simple și vom calcula că această funcționalitate este implementată corect și fără erori.

Există o întrebare, dar cum să filtrați extensiile de fișiere? Există două opțiuni:

  • În lista albă - faceți o listă cu extensii de fișiere valide și blocați restul
  • În lista neagră - faceți o listă cu extensiile blocate și toate celelalte încărcate

Problema este că pentru a implementa filtrarea pe lista albă, trebuie să furnizați toate opțiunile posibile pentru extensiile necesare care vor încărca scriptul nostru. Și dacă pentru locurile în care trebuie doar să descărcați poze - totul este simplu, atunci în multe alte cazuri va trebui să compilați o listă destul de mare de extensii legitime. Prin urmare, mulți dezvoltatori cred că este necesar să meargă din contrariul și să interzică extensiile periculoase.

Și dacă în primul caz, mulți sunt siguri că numai fișierele cu extensiile necesare vor fi completate (în articol vă voi spune cum să obțineți acest lucru), apoi în al doilea caz nu este atât de simplu.


Să începem cu problemele de filtrare de pe lista neagră.

Extensii de heap

Prima problemă este că Apache în mod implicit (deși poate nu în mod implicit, dar cel puțin foarte des) manipulate o grămadă de fișiere cu extensii diferite, cum ar fi scripturi PHP. Încă credeți că este suficient să blocați numai ".php"? Dar figushki, aceasta este o listă incompletă de prelungiri posibile:

php .phtml .php4 .php5 .html

Da, da, în unele configurații Apache ".html" poate fi procesat ca un script php.

Și am uitat, de asemenea, despre cgi, perle și alte yummy yummy. Da, de obicei, acestea pot fi rulate numai din folderul / cgi-bin, dar cine știe, poate că serverul dvs. este configurat diferit ...

Și este suficient să rateze cel puțin o extensie, iar atacatorul, atunci când se încearcă să se crape, cu siguranță, încercați să umple un fișier cu extensia și apoi executați, care este de natură să conducă la o rupere completă a site-ului.

Modificați configurația de sub tine

Ei bine, totul, adminul sa dovedit a fi paranoic și a adăugat toate extensiile executabile la filtru. Dar, așa cum se spune, pentru fiecare șurub oblic există o piuliță șiretlică. La urma urmei, administratorul nu sa gândit nici măcar la adăugarea extensiei ".htaccess" (dacă aceasta este, desigur, o extensie: D) în lista de filtre.

Încercăm să încărcăm un fișier cu numele ".htaccess" după cum urmează:

Aplicația AddType / x-httpd-php .doc

Și acum, în dosarul în care a fost descărcat acest fișier, toate fișierele cu extensia ".doc" vor fi interete ca scripturi php și, în consecință, vor fi executate. Rămâne să descărcați scriptul php cu această extensie și acesta va fi executat cu succes.

Puneți php.ini

Să presupunem că administratorul a continuat și se adaugă la lista de expansiune «.ht *» sau lasa verifica pe numele de fișier care nu este gol (de asemenea, nu da descarcă «.htaccess» fișier).

Nu cu mult timp în urmă, am scris despre o trăsătură interesantă a pachetului php + cgi (și, de asemenea, despre fastcgi): PHP și CGI. Omiterea restricțiilor de securitate

Pentru a efectua acest atac, trebuie să avem următoarea combinație de circumstanțe:

  • Php trebuie să fie conectat prin CGI
  • Dosarul în care sunt descărcate fișierele trebuie să conțină cel puțin un script php (de exemplu, index.php)
  • Filtrul nu trebuie să taie extensia .ini (adică ar trebui să obținem fișierul php.ini)

În php există o opțiune interesantă numită auto_prepend_file:

Specifică numele fișierului care va fi procesat automat înainte de fișierul principal. Fișierul este apelat ca și cum ar fi fost conectat folosind funcția requ, astfel încât include_path este de asemenea utilizat.

Dacă pe scurt, înainte de fiecare execuție a oricărui script, scriptul specificat în "auto_prepend_file" va fi executat mai întâi. Poti ghici ce conduc eu?

; Activați citirea fișierelor șterse (acest lucru necesită permis_url_include)
allow_url_fopen = 1

; Includeți posibilitatea includerii la distanță
allow_url_include = 1

Ai completat dosarul? Excelent! Acum ne referim la orice script php care se află în directorul în care sunt încărcate toate fișierele (de aceea am scris că am nevoie de un script php în acest folder). Când accesați scriptul din acest dosar, fișierul specificat în auto_prepend_file va fi executat mai întâi.

Extensie "dublă"

"Codul Mime este o referință că nu sunteți o cămilă".
o piesă nefericită din revista] [akep

Și știți că fiecare fișier cu fiecare extensie are propriul tip de mime? Și când descărcați un fișier, serverul web îi spune browser-ului ce tip de fișier are. Acest tip de mime este determinat de apache prin extinderea fișierului folosind o tabelă specială de cartografiere. Bazat pe un anumit tip de server web, pot efectua anumite acțiuni cu acest fișier, de exemplu executați acest fișier ca un script php sau script perl sau pur și simplu dați conținutul acestuia fără procesare etc.







Apropo, în secțiunea despre .htaccess am adăugat tipul de mime pentru fișierele doc, forțând astfel serverul web să proceseze aceste fișiere ca script-uri php. Dar, în general, nu este vorba despre asta.

De fapt, Apache este în general un server web "unic". Se pare logic să se verifice doar extensia fișierului și să se calmeze, nu? Dar aici smochine! Dacă dintr-o dată se pare că nu există o astfel de extensie printre cele înregistrate, atunci apache verifică prezența unui punct în numele fișierului și selectează a doua extensie. Adică, tipul mime va fi determinat deja de partea din numele fișierului și nu de extensia sa "clasică". Și așa până când este definit tipul de mime sau "extensiile" din numele fișierului nu se termină.

Deoarece foarte puțini oameni știu despre această caracteristică, această metodă face posibilă trecerea cu succes a filtrelor, precum și pe lista albă (în unele cazuri) și pe lista neagră (aproape întotdeauna). Pentru a lucra în jurul valorii de listă albă, trebuie să găsim sarcina admisibil pentru extensia pentru care tip mime nu este specificat, este de obicei o extensie - «.rar» (Aceasta va fi de acord, tu nu ar fi crezut că permițând «.rar» pentru a încărca vă deschide o gaură imensă în securitate?).

Luăm un script, redenumiți-l la "script.php.rar" și încărcați-l pe server. Și despre un miracol! Acest fișier este interpretat ca un script php!

Rețineți că acest chip Apache este periculos pentru că nu este un comportament destul de logic al unui server web și puțini oameni știu despre el. Și vă permite să ocoliți un număr mare de filtre.

Și cum să vă apărați?

În cazul ideal, desigur, redenumiți complet fișierul (inclusiv extensia) într-un anumit identificator și stocați informațiile despre fișier în baza de date. Apoi, utilizând un manipulator suplimentar, extrageți fișierul dorit și datele acestuia prin identificatorul acestuia. Dar această metodă este rea deoarece necesită utilizarea unui manipulator suplimentar.

Dar modalitatea de salvare directă a fișierelor și returnarea lor ulterioară numai cu ajutorul unui server web este mult mai ușoară și mai puțin consumatoare de resurse, deși este mai periculoasă. Pentru a face un filtru normal pentru acest proces, este necesar să se utilizeze: în primul rând pe lista albă de filtrare, și în al doilea rând pentru a elimina / înlocui toate caracterele speciale în numele fișierului (slash-uri de puncte, nulbayty etc.).

Cum se încarcă fișierele pe server, securitate

Și cum să încărcați fișierele pe server?

Vezi de asemenea

  • Conceptul de protecție a site-ului PHP

Descrierea protecției împotriva descărcării și executării codului arbitrar. Cum de a proteja un site php de hacking folosind auto_prepend_file. Blocarea de scripturi neautorizate.

Noi toți, într-un fel sau altul, ne-ar plăcea să fim siguri că nimeni nu ne poate hacka site-ul sau blogul.

  • Studiul de vulnerabilitate al PHP include

    Executarea corectă a unui atac php, inclusiv adăugarea de lovituri la capăt. Alternativa este un octet nul. De ce nu reduceți munca cu php inliding.

    În plus față de programare, mă bucur de asemenea cercetarea securității aplicațiilor web. Fac un audit pentru comandă și așa mai departe. Și aici.

  • Protecție neobișnuită de la PHP Include

    Exemplu de protecție de la PHP include. O modalitate de a preveni detectarea și conducerea unui atac de către un cracar.

    Să gândim cu voi cine este un hacker? Un hacker nu este un hoț! Oamenii confundă adesea aceste concepte. Un hacker este acesta.

  • PHP și CGI. Omiterea restricțiilor de securitate

    O descriere a metodei de ocolire a modului de siguranță și a bazei deschise. Omiterea restricțiilor de securitate la conectarea php prin cgi.

    Astăzi mi sa părut că ar fi frumos să vorbim despre o astfel de caracteristică interesantă a pachetelor php și cgi (și fastcgi.

    nu descărcați, utilizați resursele gratuite ale serviciilor terțe)

    De asemenea, ca o opțiune) Doar el, din păcate, nu se potrivește în toate cazurile

    În ceea ce privește dubla expansiune, acest tabel ... nu știam ... Acum am verificat și am fost surprins foarte mult

    Despre extensiile duble pe care le-ai speriat serios ...
    Dar, evident, aceasta este o știre din cărțile de istorie. Doar verificat meu Apache 2.2.17 (care, prin modul în care deja mai mult de doi ani), pentru a încerca să deschidă un fișier script.php.rar a spus el, oferindu-se să-l descărcați, Tip explica: tip de fișier necunoscut, 13 bytes
    Sau invers este cea mai recentă caracteristică?

    Am activat mod_mime.
    Poate că avem setări diferite pentru dvs.?
    Pot include httpd.conf: MIMEMagicFile conf / magic?

    Și despre php.ini pick-up în fiecare director, eu întreb, pot specifica în httpd.conf PHPIniDir ar interzice căutarea php.ini într-o altă locație?

    Încercați să specificați o extensie non-standard de tip "1.php.trololo" pentru fișier, poate aveți un handler pentru extensia * .rar.

    Dacă nu mă înșel, atunci mod_mime_magic definește tipul mimei din conținutul său, adică MIMEMagicFile nu ar trebui să afecteze problema. Dar dacă se întâmplă ceva, e oprit pentru mine.

    Și despre ridicarea php.ini, nu vă pot spune. În LAN și pe dev-server, am php conectat prin mod_php și nu prin cgi, așa că nu pot verifica.

    De asemenea, am întrebat despre PHPIniDir pentru că a crezut că la tine PHPasCGI (la mine întotdeauna a fost doar ca modul).

    Hmm ... Se pare că rar este într-adevăr definit în mime.types
    Nici măcar nu m-am gândit să verific linia văzută pe ecran - Tip: Necunoscut Tip de fișier, 13 octeți (și sa dovedit că acest Windows meu nu știa ce este rar). Versiunea cu 1.php.trololo a fost deschisă într-adevăr.

    Când încărcați prin panoul de administrare - puteți modifica totuși punctele de liniuțe, iar atunci când clientului i se oferă posibilitatea de a încărca fișiere prin ftp - nu există nimic de protejat ...

    Aș schimba complet numele fișierului împreună cu extensia, iar numele original al fișierului ar fi stocat în baza de date. De la păcat departe, să spunem așa.

    Și ce zici de ftp - aici, oricum, dacă oferiți ocazia, încărcați fișiere numai pe un alt server, unde php, perl, cgi și alte lucruri sunt dezactivate. Ei bine, sau scrie-ți propriul demon ftp)

    Și în setările Apache, nu puteți specifica o zonă demilitarizată în care nu se execută niciun script?
    Tocmai am inventat o opțiune: FTP aruncă fișiere într-un folder care nu este disponibil de pe web și fișierele primesc o funcție specială. Deși din nou - va exista o durere de cap, astfel încât o persoană de un miracol nu trimite ceva de genul:
    MySite / GetFile.php? X = 123 /../../../../ parole

    Și în setările Apache, nu puteți specifica o zonă demilitarizată în care nu se execută niciun script?

    Este pur teoretic posibil. Dar faptul că o persoană poate să-și umple htaccess-ul în care poate redefini această interdicție.

    Tocmai am inventat o opțiune: FTP aruncă fișiere într-un folder care nu este disponibil de pe web și fișierele primesc o funcție specială.

    De asemenea, destul de o opțiune rezonabilă)

    Și dacă proprietarul site-ului se toarnă în folderul încă o .htaccess și pune pe el drepturile "doar lectură"? Sau de la descărcarea unui alt .htaccess încă nu salvează?

    Pot fi confundat, dar în teorie, în acest caz, va exista totuși posibilitatea ștergerii acestui fișier .htaccess ca fișier. Și creați unul nou.

    Cu excepția cazului în care este imposibil în dosarele .htaccess pentru descărcări pur și simplu pentru a dezactiva toate manipulatoarele pentru toate limbile?

    Și totuși, am cumva impresia că în PHP și Apache, prea multe dintre aceste subtilități, atât de critice pentru securitate

    În principiu, nu este necesar să încărcați un fișier în afara public_html. Puteți descărca și în public_html, dar redenumi un fișier, cum ar fi un hash MD5 aleatoare, sau verificarea unui marcaj de timp, menținând în același timp datele pe numele original în baza de date, și să dea un download.php script
    Acest lucru va ucide două păsări cu o singură piatră - și în siguranță, și tot felul de UTF-8 și caractere speciale în numele fișierului nu-i pasă.

    De asemenea, o opțiune. Va fi posibil să omori toate problemele cu extensiile

    Sunt un obișnuit web-ra-bot-chik. Pi-shu aici că sunt în res, dar cu care am nevoie de-dan-ki-va-tsya în sfera WEB, gândurile tale, de-contracții , Îmi pot schimba propriile articole.

    Nu uitați să vă abonați:

    Și foarte pro-shu, nu pentru-ar-wai-care lasă kom-men-tari la pro-chi-tan-ny-for-pi-syam.







    Trimiteți-le prietenilor: