13:42
9/3/2011

Błąd na blogach Onetu. Dostęp do kodu PHP.

Coś się posypało Onetowi i przez kilka chwil na niektórych blogach zamiast treści internauci otrzymywali kod źródłowy w PHP, poinformował nas jeden z czytelników. Ta niegroźna wpadka prowadzi do kilku ciekawych wniosków.

Kod PHP szablonu bloga na Onecie

Na wstępie podkreślmy, że tego typu błędy zdarzają się często i naprawdę nie jest to nic “superstrasznego”. Zdradliwa w tym przypadku może być np. zabawa konfiguracją webserwera bezprośrednio na produkcji (czasem wystarczy zmiana kolejności regułek rewrite’ujących lub brak instrukcji kierującej dany typ plików na interpreter PHP).

Nie Onet pierwszy i ostatni, chociaż trzeba nadmienić że Onetowi w przeszłości zdarzało się już omyłkowo serwować kod PHP — wspomnijmy tylko zabawny komentarz opisujący zmienną odpowiedzialną za przekazywanie “pełnego” cookie do serwisów partnerskich: “(unikać jak ognia)“. Przechodząc jednak do wniosków z dzisiejszego zdarzenia:

  • uważaj na komentarze w kodzie, jeśli kod “wycieknie” lub zostanie przypadkowo upubliczniony, niektórzy mogą sobie żartować, a czasem nawet wykorzystać zawarte w nich dane do ataków social-engineering:
  • //sprawdzenie czy blog XXX-jesli tak to bez reklam!
    //nr zlecenia 119XX rafal.XXXX@portal.onet.pl

    Ale to nic w porównaniu z tym, co można znaleźć w kodzie źródłowym Windows (btw: przeklinania).

  • dbaj o jakość kodu — to chyba najcięższe, bo każdy z nas czasem jest zmuszony do stosowania brzydkich “hacków”, ale trzeba mieć świadomość, że jeśli kod “wycieknie” lub zostanie przypadkowo upubliczniony, niektórzy mogą zauważyć w nim błędy (także bezpieczeństwa) lub poznać inne grzeszki, które w nim przemyciliśmy.
  • Kod Blogów na Onecie

    Fragment opublikowanego w internecie rzekomego kodu PHP będącego szablonem dla blogów na Onet.pl

  • testuj zmiany, które wprowadzasz do konfiguracji produkcyjnych maszyn na testowym webserwerze. Jasne, nie każdego na to stać, ale pomyłka może kosztować cię drożej niż środowisko testowe, jeśli w niesparsowanym kodzie PHP pojawi się hasło do bazy danych... (Onet na szczęście trzyma część kodu PHP w katalogach, do których dostęp z zewnątrz wymaga uwierzytelnienia)
     
  • Zgodnie z zasadą Security-In-Depth, zastanów się, jak (i czy w ogóle) możesz skonfigurować swojego WAF-a tak, aby uniemożliwiał internautom dostęp do “gołych” plików PHP w przypadku “problemów” webserwera.

Dowcipnie rzecz ujmując, wersja PHP niektórych blogów Onetu podoba nam się zdecydowanie bardziej od ich wersji normalnej… Kto wie, może Onet zdechł właśnie ze względu na nadmiar różu u emo-martynki i podobnych? :>

P.S. Dziś chyba dzień plucia kodem (mind, że to nie PHP). Właśnie otrzymaliśmy screenshot z dzisiejszej Naszej Klasy:

Informacje podesłał macnow.

Przeczytaj także:

48 komentarzy

Dodaj komentarz
  1. Tak btw… te ich programowanie to jakis kiepski zart :D

  2. Z tymi ifami to przegięcie – nie lepiej trzymać tabelę w bazie z id blogów bez reklam i po prostu sprawdzić czy taki rekord istnieje? Prostrze w zarządzaniu (wystarczyłby mały moduł do tego) i IMHO powinno być wydajniejsze (oczywiście jeśli będą indeksy i LIMIT 1 ;)).

    • Widać jesteś taki pro koder, że powinieneś się starać o pracę w Onecie, do dzieła więc! ;-)

  3. mala korekta : “emo-martynka”, nie “emo-malwinka”! ;)

  4. Głęboka analiza: kiepskie (?) komentarze, “małowydajne instrukcje if”. Serio, to jest najważniejsze w kodzie, który wyciekł?

    • Nie wiem, czy zauważyłeś, ale nas mało interesuje co jest w kodzie, którym pluł Onet, czy inne serwisy. Zastanawiamy się raczej, jak zmniejszyć szanse na wystąpienie takich sytuacji oraz co zrobić, żeby zminimalizować ryzyko w momencie, kiedy taka sytuacja nastąpi.

  5. Ich kod pierwsza klasa – powrót do czasów 2000 roku i PHP4 lub nawet PHP3 :) Zdaję sobie sprawę, że przepisanie takiego giganta to ogromny koszt, ale bez przesady – lepszym kodem lepiej zarządzać, lepiej takie serwisy rozwijać, etc. To co jest tutaj to szok.

    • @Kamil: dlatego teraz promują WordPressa u siebie ;)

  6. Kamil – mało widziałeś. Czasami coś musi działać w przeciągu 5 minut i potem są lepsze kwiatki niż takie ify

  7. Szkoda, że zabrakowało informacji o sposobie zabepieczenia przed takim fakapem… a artykuł miał na celu tylko pokazanie “niekompetencji pracowników Onetu”, wystarczyłoby podać kawałek konfiguracji do ModSecurity, albo chociaż wspomnieć o takim narzedziu i wyglądalibyście na takich którzy rzeczywiście chcą pomóc… ;-) tylko w sumie co Was interesują kwestie techniczne… ;->

    pzdrv.

    • Po prostu nie wklejaj w ustawieniach serwera takiej linijki:
      RemoveType .php

      :D

    • Czyżby pracownik Onetu?? :] Ja nei widze zeby Niebezpiecznik pokazywal niekompetencje Onetu, przeciez wyraznie wspomnieli ze takie bledy sie zdarzaja kazdemu a dodatkowo my na podstawie tego tekstu wlasnie czyscimy komentarze w swoim kodzie na produkcji i dodajemy BasicAuth do includow. poza tym troche malo wiadomo co dupnelo w onecie, wiec ciezko powiedziec czy przypadkiem nie winny nie jest proponowany przez ciebie modsecurity :>>

    • A i pokaz mi modsecurity dla nginx ;] mysle ze najlepsza ochrona przed takimi fakapami jest jednak __rozwazne__ wprowadzanie zmian w configach, bo config srodka zabezpieczajacego przed fakapem tez mozna spieprzyc i bedzie doublefakap ;] pzdr.

    • Patryk, chyba przesadzasz albo niedokładnie czytasz :> Nie wierzę też, że uważasz iż ModSecurity jest lekiem na całe zło (hint: jestem pewien, że potrafisz sobie wyobrazić konfiguracje bardziej złożone niż jeden webserwer na Apache i znasz takie sytuacje, w których regułka ModSecurity na za wiele się nie zda jeśli chodzi o serwowanie gołego PHP ;). Tak czy inaczej, do tekstu dopisałem zdanie o konfiguracji WAF-u, bo jednak ModSecurity nie jest rozwiązaniem pasującym do każdej “architektury”.

    • Piotrek: ModSecurity było bardziej skrótem myślowym, ale fajnie, że wspomniałeś o WAFie ;-) czasami mnie drażni, że ktoś ukazuje coś bardziej na zasadzie, zobaczcie jak spieprzyli, a nie podaje jakiegoś sposobu rozwiązania problemu… taka moja techniczna natura ;-)

    • Patryk: nie wiem, czy przypadkiem nie widzisz, tego czego chcesz… ;) Każdy logicznie myślący człowiek IMHO powinien odebrać tego posta tak: “dzisiaj oni, jutro to możemy być my, wyciągnijmy wnioski” (przynajmniej my go tak odbieramy i w tym celu on powstawal). I mimo wszystko uważam, że wspomniana przez nas potrzeba środowiska testowego i podążąnie za *oficjalną procedurą* dot. wprowadzania zmian na produkcje są istotniejsze niż …WAF :-) I żeby nikt nie łapał mnie za słówka: nie sugeruję, że to właśnie brak procedur zawiódł w Onecie — ba! jestem świadom, że zdarzają się procedury, które nie pokrywają wszystkich przypadków por. http://www.cse.lehigh.edu/~gtan/bug/softwarebug.html ;)

    • “Wersja PHP niektórych blogów Onetu podoba nam się zdecydowanie bardziej od ich wersji normalnej… Kto wie, może Onet zdechł właśnie ze względu na nadmiar różu u emo-martynki i podobnych? :>”

      tak, tak… eot ;-)

  8. @atom: Nie mówię o ifach, tylko ogólnie o takim kodzie: [skasowane]. Strukturalny dla takiego kolosa? Hehe. Widziałem sporo, ba, sam tworzyłem za czasów PHP4 i sam wytwarzałem taki kod… 5 lat temu.

    • czasem koszt przepisania kodu jest nieadekwatny do zysków i wtedy czasem się latami go nie modyfikuje, a to, że jest przestarzały, może nawet kiepsko napisany nic nie znaczy, ważne, że działa
      dodatkowo czasem okazuje się, że kod strukturalny jest szybszy niż ładny model obiektowy

    • szybszy w działaniu (mikrosekundy, choć przy milinach odwiedzin to zawsze coś, ok), ale wolniejszy w rozwoju i dalszej pracy nad nim ;)

    • Kod strukturalny jest wydajniejszy od obiektowego. Nie to żebym popierał jakoś tego kodu. Wiem z pewnych źródeł że w innym kolosie przepisywali kod na strukturalny, ze względu na wydajność, ograniczali dynamicznie generowane treści, a kod wyglądał masakrycznie brzydko tylko po to by zaoszczędzić na czasie procka. Choć w tym wypadku to raczej stary kod a nie po optymalizacji.

    • “mikrosekundy” bla bla bla, czasem zdziwiłbyś się jak bardzo

    • czas programisty > czas pracy komputera
      chyba, że mówimy o Google, Facebooku czy czymś podobnym
      w innych przypadkach cache w zupełności wystarczy, zwłaszcza dla tak statycznych danych jakich dostarcza Onet (blogi w tym przypadku)

  9. Powiew open source z onetu ;D

  10. wszedłem na emo martynka i doznałem uszczerbku na psychice, żądam odszkodowania! i zakazuje umieszczania takich linków do tak chorych psychicznie stron! stop idiotyzmowi i postępującemu debilizmowi, wystarczy nam to co już serwuje rząd. na pohybel!

    • Ja myślę, że żeby stworzyć taką stronę trzeba mieć bardzo dużo cierpliwości i pomysłowości.
      Wystarczy sobie wyobrazić ile czasu i nerwów zajmuje wymyślanie treści i tłumaczenie na użyty na stronie język.
      Z wyglądem jest trochę lepiej bo do tworzenia strony może mieć jakiś normalny, mniej oczoje**y.

  11. a jakie sa powody do żartowania z zacytowanych komentarzy ??? ze słowo “inklud”?

  12. !eregi(“chrome”, $_SERVER[‘HTTP_USER_AGENT’])

    ereg do szukania ciagu znaków, kiedyś tak pisałem… Dawno. :D

  13. Nie ma to jak logika w szablonach:)

  14. Ehm, powinno być nie “Onet” tylko “pewien krakowski portal” (apropo ukrywania nazwy agencji).

  15. “…pomyłka może kosztować cię drożej niż środowisko testowe…” – błąd (pleonazm). Powinno być: “…pomyłka może kosztować cię więcej niż środowisko testowe…”.

  16. Taki dziwny dzisiaj dzień, rano hatak.pl pluł SQL’em, na szczęście tym co serwuje reklamy, więc było nawet lepiej :)

  17. Ehm.. chyba powtarzamy dziś 30 listopada jak to Allegro i GG coś tam spaprało , a już wiem, GG Air miało błąd , a Allegro nie pamiętam :D. Plus jeszcze ten banki 30 listopada, ING i jakiś tam jeszcze ;s

  18. Oj dziwny.. mybank.pl tak samo dzisiaj 2 razy uraczył mnie gołym kodem.. Może to ma związek z tą niedostępnością serwerów home.pl dzisiaj w nocy (?) ;)

  19. Hah, wczoraj to mi nawet deviantart.com zaczal wysypywac kod :P szkoda ze screenow nie porobilem (bylo cos podobnego do nk)

  20. Przypomina mi się pewien programista, jakiego spotkałem jakiś czas temu. Pisząc jakiś prosty portalik do uzytku wewnętrznego nastrugał kilkanaście/kilkadziesiąt funckji, które robiły w sumie to samo (SELECT id FROM tabela). Oczywiście funkcje nazywały się różnie, bo za każdym razem chodziło o inną tabelę, o inne id (nazwa pola w tabeli).

    Myślę, że te warunki dotyczące reklam na blogach wynikają z tego, że trzeba było kiedyś zrobić coś na szybko, na chwilę. A potem skoro jest mechanizm, to copy-paste, zmiana wartości ID i mechanizm jest cacy :)

    • A potem programisty się zastanawiają czemu parser musi każdą stronę 5 sekund mielić :-)

  21. To ja dorzucę niepolski przykładzik z ostatnich dni. chess.com to chyba największy webowy serwis szachowy.

    http://flaker.pl/f/6839949-to-milo-dostac-dokladna-diagnostyke-bledu-czytanielogowjestdlalamerowtwardzielelogujanaekran

    • Wierzcie lub nie, ale mnie kiedyś Grono opluło czymś takim, z tą różnicą że tam… był host, login i hasło do bazy w formie plaintext xD. Serwer bazy jednak był skonfigurowany z głową i nie przyjmował połączeń z zewnątrz więc to ich uratowało

  22. A’propos niecenzury – ciekawe rezultaty daje grep -r (fuck|shit) na kernelu linuksowym ;)

  23. @Mekk Chess.com – głownym developerem jest Pan Piotr zdaje się z Poznania czy Wroclawia ;)

    Co do problemu kodu, rozwiazanie na to oczywiscie jest, moze czesciowe, ale zapobiega takim fuckupom.

    Wystarczy includowac kod z innych katalogow, na przykłądzie indeź.php

    require_once (“app/index.php”)

    tak, aby każdy plik wywoływany bezpośrednio miał jedynie includa na froncie.
    W ten sposób nawet jeśli będzie wysypka serwera, nikt nie zobaczy naszego kodu.

  24. No, głównym jak głównym ale na pewno znaczącym, o ile pamiętam odpowiada za kawałek do gry na żywo i głównie zajmuje się javascriptem. Tu jest jakiś stary wywiad: http://www.prototypejs.org/2008/5/28/an-interview-with-piotr-dachtera

    Co do prezentacji kodu… Ech, tak naprawdę wystarczy nie używać PHP ;-)

  25. […] zabezpieczyć się przed tego typu sytuacjami wyjaśnialiśmy już przy okazji podobnego zdarzenia na Onecie. Dodatkowo, na przykładzie Tumblera pięknie widać, że Security in depth to dobra strategia; […]

  26. […] trakcie której wyłączony zostanie parser plików PHP. Przykładem tego typu awarii jest niedawne upublicznienie swoich kodów źródłowych przez portal onet.pl (wyciek żródeł dotyczył na szczęście tylko platformy blogowej). W normalnych warunkach […]

  27. hehe a mi przedwczoraj sie posypał apache. Jednak wszylo na dobre bo sie przesiadłem na nginx.

  28. […] do kodu źródłowego webaplikacji z reguły nie jest możliwy (chyba, że na skutek błędu parsera) — ale skoro “bezpieczna wymiana plików” Facebooka bazuje na oprogramowaniu […]

  29. […] Tego typu błąd (tzn. brak parsowania PHP) ujawnił się też kiedyś na serwerach Onetu. […]

  30. […] PS. Taki problem dotknął też kiedyś i Onet. […]

Twój komentarz

Zamieszczając komentarz akceptujesz regulamin dodawania komentarzy. Przez moderację nie przejdą: wycieczki osobiste, komentarze nie na temat, wulgaryzmy.