Wykonywanie jpg, gif lub png jako skrypt PHP

Dzisiaj krótki wpis na temat pewnej sztuczki w PHP. Na pewno pamiętacie wpis jak sprawdzić IP. Sposób drugi w nim przedstawiony wykorzystywał przygotowany skrypt napisany w języku PHP do zarejestrowania adresu IP użytkownika, który odwiedza naszą stronę WWW.

Dzisiaj pokażemy pewien trik, dzięki któremu w jeszcze lepszy sposób haker może ukryć swoje intencje. Pokażemy jak za pomocą pliku konfiguracyjnego serwera Apache .htaccess, można w prosty sposób umożliwić wykonywanie plików graficznych, zupełnie tak jak zwykłego skryptu języka PHP. Oczywiście sposób nie ogranicza się tylko do plików z rozszerzeniem jpg, gif lub png. Możemy tą sztuczkę wykorzystać w stosunku do dowolnego rozszerzenia plików.

.htaccess w Windows

Na wstępie należy zaznaczyć, że plik konfiguracyjny .htaccess w systemie Microsoft Windows może niektórym przysporzyć pewien problem. Dlaczego? Ponieważ w tym systemie nie da się utworzyć w standardowy sposób pliku o nazwie rozpoczynającej się od kropki. Jak temu zaradzić? Wystarczy utworzyć plik o nazwie htaccess a następnie w konsoli zmienić jego nazwę za pomocą następującej komendy wiersza poleceń:

C:\xampp\htdocs>rename htaccess .htaccess

Oczywiście należy najpierw przejść do folderu z plikiem htacces za pomocą komendy cd lub wywołać pełną ścieżkę bezwzględną do plików. Pierwszy parametr to oczywiście nazwa pliku, któremu chcemy zmienić nazwę. Drugim parametrem jest nowa nazwa pliku.



Wykonywanie pliku jpg jako php

Dobrze teraz edytujmy nasz plik .htaccess dowolnym edytorem tekstowym i dodajmy następującą dyrektywę konfiguracyjną:

AddType application/x-httpd-php .jpg

Plik umieśćmy na swoim hostingu w katalogu z naszym skryptem posiadającym rozszerzenie JPG. Następnie wywołajmy go w przeglądarce i cieszmy się skryptem wykonywalnym o rozszerzeniu jpg. W celu urealnienia, że nasz skrypt jest „naprawdę zdjęciem” możemy za pomocą HTML wyświetlić prawdziwy obrazek. Przykład został zamieszczony na poniższym listingu:

Jeszcze więksi maniacy mogą oczywiście dodać od siebie odpowiednio przygotowaną ikonkę favicon wyświetlaną na karcie przeglądarki internetowej.

JPG, GIF, PNG wykonywany jako skrypt PHP z pomocą .htaccess.
Plik zdjecie.jpg w rzeczywistości jest skryptem PHP. Skrypt ten za pomocą HTML i .htaccess wyświetla obrazek i dodatkowo wykonuje kod PHP.

Co ciekawe podobna sztuczka może posłużyć w niektórych przypadkach do obejścia hakerom niektórych uploaderów plików. Jeśli takowy skrypt sprawdza tylko rozszerzenie pliku lub mime/type, to cracker może spróbować załadować odpowiedni plik .htaccess modyfikujący ustawienia serwera Apache. Następnie może wgrać złośliwy plik ze skryptem PHP z rozszerzeniem dozwolonym przez uploader. Dzisiaj to by było na tyle. Na pewno zainteresują Cię jeszcze inne tematy:

Zapraszamy również obowiązkowo na naszego fanpage HakerEduPL na facebooku i Twittera, aby być na bieżąco ;-).




16 myśli na temat “Wykonywanie jpg, gif lub png jako skrypt PHP

  1. Wiesz może z użyciem jakiej technologii mógł być wykonany ciekawy trik, który ktoś mi pokazywał jakiś czas temu? Ktoś wkleił obrazek z rozszerzeniem .png na pewien czat który może obsługiwać zamieszczanie zdjęć z własnych hostingów. Na tym obrazku było widać mikrofon, ale nie wiem czy to może mieć jakieś znaczenie. Po załadowaniu mi się tego czegoś w przeglądarce ten ktoś stwierdził, że mam włączony mikrofon. Na tym czacie poprzez przekierowanie w .htaccess z obrazka nie działa javascript (co chyba jest normalne), działa tylko php ale coś mi tu nie pasuje bo przecież php jest po stronie serwera.

    1. https://haker.edu.pl/2015/12/09/jpg-jako-php-w-htaccess/
      + w HTML5 da się używać kamerki i mikrofonu. Wydaje mi się że wykorzystuje się się jednak przy tym JavaScript. Raczej w obecnych przeglądarkach trzeba na to zezwolić wciskając przycisk informujący o tym na stronie internetowej. Być może istnieje jeszcze możliwość zrobienia tego z apletem Javy o ile osoba ma skonfigurowaną ją tak, że automatycznie wczytuje aplet. Hmm, ciężko mi coś więcej na ten temat powiedzieć.

    1. Jest to język programowania. Wpisz w google „kurs php” lub kup książkę o nim :-).

  2. Nie rozumiem po co ta „sztuczka” ? Skrypty php sa wykonywane tylko i wylacznie na serverze, co mi da odpalenie skryptu na wlasnym serverze po tym jak user wejdzie w link z jpg?? Jedyne do czego można by tego użyć to pobranie pewnych informacji o użytkowniku takich jak IP, system operacyjny i na tym kończą się możliwości „triku”.

    Zresztą, większość ludzi nie widzi nic strasznego w klikaniu na link z rozszerzeniem .php – abstrachuje już od tego że w bardzo łatwy sposób w apachu można ukryć rozszerzenia na stronie.
    Reasumując, ciekawa znajdka ale bezużyteczna :)

    1. Social engineering to chyba podstawa w dzisiejszych czasach. Inaczej przestępcy nie wyłudzaliby kosmicznych kwot pieniężnych. Zacytuje początek akapitu w tym wpisie:

      sposób drugi w nim przedstawiony wykorzystywał przygotowany skrypt napisany w języku PHP do zarejestrowania adresu IP użytkownika, który odwiedza naszą stronę WWW. Dzisiaj pokażemy pewien trik, dzięki któremu w jeszcze lepszy sposób haker może ukryć swoje intencje.

      Chodzi właśnie o zdobycie adresu IP w celu dalszego mapowania luk skanerami portów i frameworkami do tego. Kilka pytań tygodniowo na fanpage i e-mail to właśnie o to jak sprawdzić „IP”.

      Proszę również przeczytać ponownie ostatni akapit. Z doświadczenia wiem, że nierozważni programiści mogą narazić się na taki błąd. Nawet w kilku wtyczkach do poważnych CMS podobna podatność już występowała w przeszłości. Przekonfigurowując w ten sposób zachowanie serwera w stosunku do danego folderu, można umożliwić sobie wrzucenie shella w np: w panelu uploadu tylko danego typu plików. Druga sprawa to taka, że jeśli usługa zawiera pewien panel użytkownika (niekoniecznie administratora) lub nawet system dodawania komentarzy i występuje statycznie najpopularniejsza podatność typu SQL Injection, to napastnik może zmienić sobie pewne zachowanie serwera Apache. Teraz sobie wyobraź, że ktoś rozkminił rozkład tabeli w bazie (prefiksy można wygenerować za pomocą brute-force, a większość CMS jest otwartoźródłowych ;)). Wrzucił w swoim profilu odpowiednią treść .htacces i wyrzucił ją za pomocą znalezionej luki do pewnego folderu z config.php. Chodzi oczywiście o select into outfile. Dane dostępowe do bazy danych są już jego (zmienił zachowanie serwera w stosunku do plików php) :-). Innych przykładów z .htaccess z doświadczenia mógłbym wymienić blisko setki.

    2. O w sumie o tym niepomyślałem. Natomiast też łatwo się przed tym bronić, szanujący się admin nie zezwoli na dostęp do folderów konfiguracyjnych i ukryje je w warstwie pod httdocs co uniemożliwi hackerowi dostęp i modyfikacje ich(trickiem z httaccess).

      Co do SQL injecta to wygląda to podobnie, niestety mało szanowanych serwisów jest na to podatna( ‚ or 1=1 i Union).

      Faktycznie uzywajac social engineeringu mozna w ten sposob poznac IP tylko co dalej. Bez otwartych portów i/lub wykonania skryptu na komputerze ‚ofiary’ nie jestesmy w stanie uzywajac tej metody w jakimkolwiek stopniu zagrozic ‚ofierze’ poza atakiem DDOS (ktory wiekszosc lepszych, dobrze skonfigurowanych routerow blokuje). Ewentualnie mozna by podsluchac jakie porty sa otwarte i probowac SYN flood’a.

    3. Bardziej zaawansowane ataki wstrzykiwania kodu SQL lub XSS nie wykorzystują tylko parametrów GET i POST w przeglądarce. Są jeszcze ciasteczka, nagłówki przeglądarki i inne miejsca w których ktoś mógł coś pominąć. Pozatym zajrzyj na exploit-db i SQL Injection nadal bije na głowę. A trzeba pamiętać że są to tylko błędy publiczne a nie 0-Day. Przykładowo we wrześniu wyszła Joomla 3.4.4 a exploit na nią pojawił się w niecały miesiąc. O ile pamiętam pewna funkcja była dziurawa i dało jej się wstrzyknąć złośliwe polecenia bazy danych POSTEM. Żeby było ciekawiej luka już od 2 lat występował, ale nie została wypatrzona na szerszą skale. Tu liczy się bardziej kreatywność niż „to niepotrzebne”. Kolejny przykład co do DDos to ostatni atak na Steama, który przeciążając serwery wyrzucał dane losowych użytkowników z cache serwera. Podobnej akcji z pamięcią tymczasową sam doświadczyłem w tamtym roku na Facebooku. Wspominałeś o fejsie… jeszcze 1-2 lata temu i chyba nawet o tym wspominaliśmy gdzieś dosyć wcześnie w stosunku do innych, dało się podszyć pod dowolną osobę na czacie bez ingerencji w komputery i sieci żadnej ze stron rozmawiających. Kreatywność patrzenia na problem jest potrzebna w połączeniu z wiedzą.

    4. Ciekawe by było jakby tak spreparowany skrypt z podpiętym obrazkiem dało się komuś wysłać np. na facebooku i odrazu wykonywałby się :) Taki troche 3rd party scripting :)

    5. Najpierw musiałbyś odkryć na Facebooku lukę XSS. Jako że fejs ma program Bug Bounty https://www.facebook.com/whitehat/ to zapewne większość luk jest już dawno zgłoszona i załatana. Mimo to taki atak który opisałeś ma już swoją nazwę. Jest to CSRF (cross-site request forgery). Jeśli udałoby Ci się zamieścić zwykły element img HTML gdzieś lub nawet za pomocą BBCODE [img]http://stronawwwnapastnika/skrypt.jpg[/img] i nie jest strona WWW zabezpieczona przed takim atakiem to jak najbardziej uzyskasz adresy IP i inne dane z poziomu PHP wszystkich którym ta grafika fałszywa została wyświetlona (bez przechodzenia w dane zdjęcie). Jest to oczywiście wada protokołu HTTP i jego metody GET. Tak naprawdę o każdy zasób w internecie przeglądarka internetowa prosi inne serwisy za pomocą metody GET, więc osoba odwołując się do oszukanego zdjęcio-skryptu zostawia nam adres IP.

    6. AGFRAZ masz naprawde niesamowitą wiedzę o bezpieczeństwie i na wstępię wyraże wyrazy szacunku :). Czekam na kolejne ciekawe artykuły! :)

      Co do ostatniego nie chodzi mi tu tylko o XSS czy o inne sposoby ‚przejecia strony’ a raczej o wykorzystanie luki w samym systemie obrazków facebooka. Napewno spotkałeś się z „wirusami” facebookowymi po kliknięcu otwiera ci się reklama, która jest zwykłym okienkiem potwierdzenia na zgode dla aplikacji przerobionym w CSS, gdy klikniesz zamknij czy tam „X” zgadzasz sie zeby aplikacja publikowała w twoim imieniu.
      Wykorzystuje to dziure w facebooku, która już od dłuższego czasu nie została załatana.
      A teraz wyobraź sobie co jeśli można by było wysłać na czacie komuś obrazek i samo kliknięcie odpalało by skrypt? Dlaczego nie ? Facebook z roku na rok niby zaostrza środki bezpieczeństwa ale nie zauważa, że rozszerzając swoje możliwości tworzy ich coraz więcej.

    7. Polecam postudiowanie w wyszukiwarce tematów na temat tzn. clickjacking. To jest bardziej webmasterka sprytna sztuczka niż hacking. Do zdobywania lajków często wrzuca się prowokujące lub ocenzurowane obrazki do sieci społecznościowych. Miano takich ataków masowych można określić w sumie jako mniej groźny tzn. SCAM internetowy. Facebook udostępnia na swojej podstronie developers poradniki jak umieszczać przyciski typu Lubie to na swoich witrynach www. Sprytny webmaster je przekształca w taki sposób, że osoba klikająca coś na złośliwej jego stronie www lajkuje mu fanpage/zdjęcie za pomocą ukrytego przycisku like. Spotkałem się też z sytuacją w której napastnik wybrał kod przycisku Lubie to dla innego kraju. Przycisk miał po prostu inny egzotyczny napis w tym języku. Witryna napastnika niby prezentowała obrazek/film kontrowersyjny, ale przed jego obejrzeniem wyskakiwał komunikat który prosił o potwierdzenie Twojego wieku przepisując pewien kod. Przycisk zatwierdzający operacje to było właśnie „lubie to” w innym egzotycznym języku. Potem za duże kwoty sprzedaje taka osoba na swoim fanpage miejsce reklamowe, lub zmienia nazwę fanpage sprzedając go firmą chcącym mieć duży zasięg do grupy jakiejś docelowej na fejsie (np: sklep gimbo-zegarków).

    8. Wycielo mi zawartosc ‚<' : chodzilo mi o to ze nie wykonanie samego skryptu po kliknieciu a zainstalowanie aplikacji facebookowej po zwyklym kliknieciu

  3. A da się tak zrobić żeby ten skrypt np. zablokował wybraną strone internetową, albo jakoś zmodyfikował plik hosts?

    1. Z poziomu WWW jest to raczej nie możliwe, no chyba że odkryłeś jakiś błąd typu 0Day.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *