Jak se „hackuje“ webová stránka

Aneb, nechte idiota programovat. Nedávno jsem narazil na společnost, která vyráběla něco, co mne zajímalo. Jelikož se ale jednalo o zahraniční společnost, koupě hotového výrobku by se velmi prodražila. Řekl jsem si tedy, že si „věc“ vyrobím sám, stačilo k tomu mít pár fotek ve větším rozlišení, které by odhalily co a jak udělat.

Problém ovšem byl v tom, že na stránkách společnosti byly fotky ze kterých se sice člověk mohl pokochat, ale už ne něco okopírovat, či vyčíst. Už dříve se mi poštěstilo prostým umazáním názvu souboru z adresy dostat seznam všech souborů ve složce (DirectoryIndex), ale to zde nefungovalo.

Začal jsem tedy web prozkoumávat více do hloubky, ve snaze najít skryté stránky apod. (Google … ). Narazil jsem na jakýsi nedopsaný pahýl eshopu,  či co to mělo být, ze kterého mě konkrétně zajímala část pro upload a změnu velikosti obrázků.

Chyba zabezpečení č1

Jak se ukázalo, tento jednoduchý uploader nevyžadoval žádné ověření, i když by neexistovala chyba zabezpečení číslo 2, dalo by se tohoto využít k jednoduchému DOS (Denial Of Service) útoku, v podobě zahlcení serveru, přepsání souborů a tím pádem zničení stránek. To však nebyl můj úmysl.

Chyba zabezpečení č2

Další velmi příjemné zjištění a zároveň obrovská chyba v bezpečnosti byla taková, že uploadovaný soubor neprocházel kontrolou přípony. Zkusil jsem tedy nahrát pokusný PHP skript s klasickým

<?php
echo "Hello world !";
 ?>

Sice uploader vypsal několik chyb, když se pokusil ze skriptu udělat náhledový obrázek, ale to vadilo. A světe div se, php skript fungoval. Začal jsem tedy bádat nad tím, co mne zajímalo a napsal jsem další PHP skript, který už zobrazoval kompletní adresářovou strukturu až od prvního místa, kam byl povolen systémem přístup.

Chyba zabezpečení č3

Po prvním vypsání seznamu (stromu souborů) bylo jasné, že na webu jsou neveřejné soubory. Pokud takové soubory mám, tak rozhodně nepatří na web a už vůbec ne takto děravý!

Závěrem:

Na server jsem nakonec skript několikrát nakopíroval, do různých složek pod jinými jmény, zašifroval jsem ho pomocí PHP kompilátoru a doplnil jej o indexaci souborů, tak abych si mohl vypsat pouze soubory, které přibyly, popřípadě se změnily. Dále jsem doplnil možnost vlastního pohodlného uploadu a pr jistotu jsem doplnil parametr, který se využívá k tomu, aby skript neodpověděl nikomu, kdo jej nezná, ale místo toho vrátil stránku, která se tváří jako chyba 500 (Vnitřní chyba serveru).

Doslov:

Přiznám se, že v úvodu článku jsem trochu kecal, abych jej trochu přiblížil reálnému prostředí. Nešlo o reálný hack, ale o audit bezpečnosti webu mého známého, který po určitých událostech přestal věřit svým programátorům. Musím říct, že člověk který měl na starosti tento konkrétní web si ani po dvou týdnech mých skriptů nevšiml a ani po upozornění na to, že jsem schopen zobrazit komplet adresářovou strukturu stránek je nedokázal najít. Jediné co se změnilo, bylo to, že zmizel uploader (na to ale bylo pozdě). Takto začátečnické chyby jsem dlouho neviděl.

Zdrojové kódy zde uveřejňovat nebudu, neboť je pokládám za naprostou trivialitu.

    • strejda
    • 18.7.2010 10:53

    kecáš

  1. nekecám

    • Loldo
    • 29.7.2010 22:33

    Preco si si tam neuploadol PHP shell ?
    Usetrilo by ti to plno roboty …

  2. @Loldo
    V tomto případě je PHP Shell zcela zbytečný, potřeboval jsem jen seznam souborů a to je rychlejší napsat, než uploadovat celý PHP Shell. Navíc tento skript je mnohem nenapádnější.

    Pokud narážíš na tu indexaci souborů, tak ta je v CSV souboru … celý skript je jen několik IF a While.

  1. Zatím žádné trackbacky