Ciasto warstwowe i com_weblinks Joomla. Hacki i dodatki Brudne linki internetowe php


Zacznijmy od przyjrzenia się komponentom, przyglądając się działaniu podstawowego komponentu Weblinks w części administracyjnej witryny internetowej. Ten komponent, typowy dla tej części serwisu, jest bardzo podobny do pozostałych komponentów służących do zarządzania artykułami, użytkownikami, modułami itp.

Pliki programu dla tego komponentu są wymienione poniżej. Wszystkie te pliki znajdują się w folderze administrator/komponenty/com_weblinks. W pozostałej części tego rozdziału nazwy wszystkich plików komponentów Weblinks odnoszą się do tego folderu początkowego, chyba że zaznaczono inaczej. Większość plików jest zorganizowana według wzorca MVC. W szczególności wszystkie pliki widoków znajdują się w podfolderze widoków, a wszystkie główne pliki modelu i kontrolera znajdują się odpowiednio w podfolderach modele i kontrolery. Uzupełniane są także plikami instalacyjnymi, konfiguracyjnymi i pomocniczymi.

Pliki części administracyjnej komponentu Weblinks, z wyjątkiem plików Index.html

  • kontrolery/weblink.php - Główny kontroler do edycji Pojedynczy kontroler łącza internetowego
  • kontrolers/weblinks.php - Główny kontroler do kompilacji Kontrolera i wyświetlania listy linków internetowych na ekranie Menedżera łączy internetowych
  • helpers/weblinks.php — udostępnia różne metody używane w kontrolerach i widokach
  • models/fields/ordering.php - model JformField wyświetlający kolumnę kolejności linków internetowych na ekranie Menedżera łączy internetowych
  • models/forms/weblink.xml - plik XML używany w klasie Jform-Model Field do rozmieszczenia formularza z polami wejściowymi i edycji linków internetowych na ekranie
  • models/weblink.php - Model pojedynczego ekranu formularza łącza internetowego
  • models/weblinks.php - Model ekranu menedżera Model łączy internetowych
  • sql/install.mysql.utf8.sql - plik SQL do utworzenia tabeli łączy internetowych podczas instalacji
  • sql/uninstall.mysql.ut8.sql - plik SQL do usunięcia tabeli łączy internetowych podczas instalacji
  • tabele/weblink.php — udostępnia klasę Model
  • widoki/weblink/tmpl/edit_metadata.php - plik układu źródłowego do edycji metadanych łącza internetowego

Część administracyjna komponentu Linki internetowe

  • widoki/weblink/tmpl/edit_params.php - plik układu źródłowego do edycji opcji wyboru pojedynczego łącza internetowego
  • widoki/weblink/tmpl/edit.php - Plik układu źródłowego do edycji łącza internetowego
  • widoki/view.html.php - Klasa głównego widoku do wyświetlania pojedynczego łącza internetowego w formacie HTML Plik układu źródłowego dla menedżera łączy internetowych
  • widoki/weblinks/view.html.php - Klasa głównego widoku do wyświetlania linków internetowych w formacie HTML bezpośrednio na ekranie Menedżera łączy internetowych
  • access.xml - plik XML dostarczający listę akcji dla systemu list kontroli dostępu (ACL).
  • config.xml - plik XML zawierający listę opcji wyboru konfiguracji komponentu
  • kontroler.php - Główna klasa kontrolera
  • weblinks.php - Punkt wejścia dla żądania
  • weblinks.xml – plik XML służący do kontroli procesu instalacji

Ciasto warstwowe

Porozmawiamy o komponencie com_weblinks i znacznikach HTML strony Joomla. O tym jak łatwo i prosto stworzyć katalog linków na stronie Joomla.

Ten CMS został stworzony do interaktywnej pracy z zarejestrowanym użytkownikiem, bez bezpośredniego kodowania. Chociaż trend rozwojowy Joomla prowadzi do porzucenia komponentu com_weblinks jako całkowicie bezużytecznego na stronie i po prostu dodania dodatkowej wagi (ponad 100 KB - 90 plików) do i tak już „ciężkiego” systemu. Ale na razie ten komponent jest nadal obecny w dystrybucji i jest używany przez niektórych programistów.

Widoczna na ekranie strona internetowa Joomla to tort, w budowę którego zaangażowanych jest wiele bloków (a co za tym idzie, wiele szablonów) jednocześnie. W tym miejscu wchodzi w grę filozofia Joomla - budowanie witryn z dużych bloków. Każdy blok musi mieć własny szablon znaczników HTML (układ).

Główne bloki:

Szablon strony głównej (site_template/index.php), który za pomocą znaczników HTML definiuje pozycje modułów i komponentów oraz wyświetla te moduły i komponenty.
- szablon strony
- szablony modułów
- szablony komponentów

Każdy z tych dużych bloków jest dostępny do edycji (zmian). Oznacza to, że możesz edytować osobno, na przykład szablon dowolnego modułu lub komponentu, a na stronie będzie on wyglądał jak nowy. To samo dotyczy szablonu strony.

Początkującemu programiście może być trudno zrozumieć, że pierwsza linia treści strony jest wyświetlana jako tytuł strony i jest edytowana na stronie edycji elementu menu wskazującego tę stronę. Że druga linia pochodzi z szablonu komponentu com_content lub com_weblinks. A ciągi znaków w szablonach są zwykle zmiennymi łańcuchowymi, a ich inicjalizacja i lokalizacja odbywa się w plikach językowych, takich jak język\ru-RU\ru-RU.mod_weblinks.ini i tym podobne.

Czasami początkujący jest zakłopotany tym, który szablon wygenerował tę czy inną linię, która na stronie ekranowej wygląda jak logiczna kontynuacja tej samej narracji. Okazuje się, że jedna linia znajduje się w jednym szablonie, druga w drugim szablonie, a trzecia w trzecim. Poniższa tabela z zakładkami to dane wyjściowe szablonu modułu mod_tabform.

Czasami szablony modułów nazywane są układami. Ale to kwestia terminologii. Istota jest ta sama – jest to „odzież” dla treści. Bardziej słuszne byłoby powiedzenie oznakowanie. Zatem znaczniki jednej strony ekranowej znajdują się w różnych plikach katalogów Joomla.

Menu

Wielu nowych programistów Joomla często nie rozumie, że pozycje menu mogą mieć różne typy. Innymi słowy, pozycje menu mogą odnosić się do obiektów Joomla różnych typów. Mogą to być różne obiekty, takie jak: komponenty (głosowanie, wyszukiwanie, katalog linków itp.).

Wybór typu pozycji menu:

Kontakty (com_contact)
Lista kategorii kontaktów (kategorie)
Lista kontaktów danej kategorii (kategorii)
Kontakt
Ulubione kontakty (polecane)

Materiały (com_content)
Materiały archiwalne (archiwum)
Materiał (artykuł)
Lista wszystkich kategorii (kategorii)
Kategoria bloga
Lista kategorii materiałów (kategoria)
Polecane materiały
Stwórz materiał

Inteligentne wyszukiwanie (com_search)
Szukaj

Witaj świecie! (com_helloworld)
Wiadomość (witaj, świecie)

Kanały wiadomości (com_newsfeeds)
Lista wszystkich kategorii kanałów aktualności (kategorie)
Lista kanałów informacyjnych w kategorii (kategoria)
Kanał informacyjny

Szukaj (com_search)
Formularz wyszukiwania i lista wyników wyszukiwania (wyszukiwanie)

Menedżer użytkowników (com_users)
Formularz autoryzacyjny (logowanie)
Profil użytkownika (profil)
Zmień profil użytkownika
Formularz rejestracyjny
Odzyskiwanie nazwy użytkownika (przypomnienie)
Zmiana hasła (reset)

Opakowanie (com_wrapper)
Obwoluta

Jak widać, tutaj wszystkie typy menu są komponentami. Przez swoją nazwę typ pozycji menu faktycznie wskazuje nazwę szablonu typu komponentu. Szablony komponentów znajdują się w katalogach widoków:

joomla\components\com_weblinks\views\categories
joomla\components\com_weblinks\views\category
joomla\components\com_weblinks\views\weblink
joomla\components\com_users\views\login

Jak widać nazwy typów linków w menu i nazwy szablonów w katalogach vews są takie same.

Deweloper ma możliwość tworzenia nowych, niestandardowych szablonów (układów) komponentów. Te nowe układy zostaną również odzwierciedlone jako nowe typy menu w oknie wyboru typu menu. To jest osobny temat.

Zawartość demonstracyjna dystrybucji Joomla

Zobaczmy, jak zbudowana jest hierarchia elementów menu „O Joomla”, aby wyświetlać komponent com_weblinks w domyślnym szablonie Joomla z treścią demonstracyjną (Beez2 - domyślny).

Przejdźmy do panelu administracyjnego, aby edytować komponent com_weblinks: Komponenty->Linki. Widzimy, że w treści demonstracyjnej dołączonej do dystrybucji utworzono pięć kategorii dla komponentu com_weblinks. Oznacza to, że linki zostaną podzielone na pięć kategorii. Wszystkie utworzone kategorie zostaną zapisane w tabeli bazy danych #_categories. Kategorie innych komponentów są również przechowywane w tej samej tabeli.

Przykładowe łącza internetowe do danych
|-Połączenia parkowe
|-Joomla! Konkretne linki
|-|-Inne zasoby
Bez kategorii

W menu O Joomla (w edytorze menu) została utworzona odpowiednio hierarchia pozycji menu:

Hierarchia pozycji menu:

Korzystanie z Joomli! (typ: materiał)
|-Używanie rozszerzeń (typ: lista wszystkich kategorii):: lista kategorii w materiałach
|-|-Komponenty (typ: kategoria blog) :: kategoria w materiałach
|-|-|-Komponent łączy internetowych (typ: materiał)
|-|-|-|-Prześlij łącze internetowe (wpisz: utwórz łącze):: w komponencie Linki
|-|-|-|-Linki internetowe Pojedyncza kategoria (typ: lista linków w kategorii) :: w komponencie Linki
|-|-|-|-Kategorie Linków (typ: lista kategorii linków) :: w komponencie Linki

Widzimy, że niektóre pozycje menu mają typy: lista kategorii, lista linków w kategorii i utwórz link.
„Lista kategorii linków” określa najwyższą kategorię, z której będzie wyświetlana hierarchia.
„Lista linków w kategorii” określa kategorię, do której linki będą wyświetlane.
W pozycji „Utwórz link” wyświetlony zostanie formularz, który będzie musiał wypełnić zarejestrowany użytkownik.
Swoją drogą tak wygląda link do tego formularza w edytorze (jego wygląd zmieni się w pasku adresu):

indeks.php?option=com_weblinks&view=form&layout=edit

Niektóre pozycje menu mogą być widoczne tylko dla zarejestrowanych użytkowników! Przykładowo pozycja menu typu „Utwórz link” będzie widoczna tylko dla zarejestrowanych użytkowników. Ta funkcja została stworzona specjalnie po to, aby zarejestrowani użytkownicy mogli tworzyć linki, które będą publikowane na stronie.

Zatem komponent com_weblinks stanowi dobry sposób na interaktywne wypełnienie strony interesującymi linkami. Co więcej, wszystkie linki, które zostaną umieszczone na takiej stronie, będą miały przekierowanie, czyli nie będą indeksowane jako zewnętrzne. Być może widziałeś takie linki na forach. Po najechaniu myszką na taki link wyświetli się adres Twojej witryny i dopiero po kliknięciu zostaniesz przekierowany pod podany przez Ciebie adres.

Główną zaletą i znaczeniem komponentu com_weblinks jest możliwość dodawania przez użytkownika linków do zewnętrznych stron internetowych, podobnie jak możliwość dodawania przez użytkownika nowych treści - artykułów, obrazów, plików wideo itp.

Umożliwienie zarejestrowanemu użytkownikowi z uprawnieniami wypełniania witryny treścią bez bezpośredniego kodowania to podstawowa filozofia CMS Joomla.

Bez kategorii
Przykładowe artykuły z danymi
|- Joomla!
|-|- Rozszerzenia
|-|-|- Komponenty
|-|-|- Moduły
|-|-|-|- Moduły treści
|-|-|-|- Moduły użytkownika
|-|-|-|- Moduły wyświetlaczy
|-|-|-|- Moduły narzędziowe
|-|-|-|- Moduły nawigacyjne
|-|-|- Szablony
|-|-|-|- Atomowy
|-|-|-|- Beez 20
|-|-|-|- Beez 5
|-|-|- Języki
|-|-|- Wtyczki
|- Miejsce parku
|-|- Blog o parku
|-|- Galeria zdjęć
|-|-|- Zwierzęta
|-|-|- Krajobraz
|- Witryna sklepu z owocami
|-|- Hodowcy
|-|- Przepisy

Wydaje się, że nie ma zbyt wielu kategorii treści!
Hierarchię kategorii w materiałach można także przeglądać za pomocą zapytania do tabeli kategorii w bazie danych:

WYBIERZ * Z `#_kategorii` GDZIE `rozszerzenie` = "com_content"

W tym miesiącu osoby zajmujące się wyszukiwaniem błędów nie chcą nas zepsuć nowymi, głośnymi exploitami w popularnych aplikacjach. Oczywiście w produktach znanych firm opublikowano wiele porad, jednak bardzo niewiele z nich zawiera czytelne kody PoC. W naszej recenzji starałem się zebrać najważniejsze i kompletne luki opisane ostatnio, więc usiądźcie wygodnie i miłej lektury.

Luka w PHP podczas przetwarzania żądań HTTP Head. Krótki opis

3 marca niejaki Adam Ivanyuk odkrył interesującą funkcję w interpreterze PHP, która nie całkiem poprawnie przetwarza żądania HEAD. Badacz nazwał tę lukę „sztuczką metody HTTP HEAD w skryptach php”.

Wielu programistów projektuje swoje skrypty PHP z nadzieją, że wszystkie zapisane w nich instrukcje zostaną pomyślnie wykonane bez przerywania gdzieś pośrodku (szczególnie w krótkich skryptach). Dzieje się tak, jeśli użytkownik końcowy zażąda skryptu za pomocą metod GET, POST, PUT.

Ale powinieneś wiedzieć, że istnieją inne metody HTTP - na przykład HEAD. Właśnie podczas przetwarzania tej metody w PHP może pojawić się luka w zabezpieczeniach.

Przyjrzyjmy się jednemu ze źródeł interpretera: ./main/SAPI.c, linia 315:

if (SG(request_info).request_method &&
!strcmp(SG(request_info).request_method, "HEAD"))
{
SG(request_info).headers_only = 1;
...

Po nadejściu jakichkolwiek danych wykonywana jest funkcja php_ub_body_write. Następnie spójrz na main/output.c, linia 699:

if (SG(request_info).headers_only) (
if(SG(headers_sent))
{
zwróć 0;
}
php_header(TSRMLS_C);
zend_ratunkowy();
}

Tutaj możesz zobaczyć, że przy pierwszym wydrukowaniu na ekranie i przy użyciu metody HEAD funkcja zend_bailout psuje skrypt.

Wykorzystać

Przejdźmy teraz do tego skryptu za pomocą metody HEAD:

Jak można się spodziewać, nasza księga gości zatrzyma swoje działanie w wierszu „echo $data;”, więc plik book.txt zostanie po prostu zresetowany do zera.
Przykład ten ma raczej destrukcyjny charakter. W drugim przykładzie możemy ominąć autoryzację w prymitywnym panelu administracyjnym:

W tym skrypcie podczas logowania przy użyciu zwykłych metod w sesji ustawiana jest zmienna administracyjna. Następnie, jeśli użytkownik wprowadzi nieprawidłowe hasło, zmienna ta zostanie zresetowana i użytkownik nie zostanie administratorem.

Jeśli do panelu administracyjnego wejdziemy przez HEAD, jego wykonanie zostanie przerwane przy fragmencie kodu z „echem”, dzięki czemu zmienna administracyjna nie zostanie zresetowana, a my będziemy mogli bezpiecznie poruszać się po zamkniętej części aplikacji. Należy tutaj pamiętać, że większość serwerów internetowych ma wartość buforowania wyjściowego ustawioną na 4096 bajtów, więc w działającym przykładzie możemy potrzebować ciągu „Długi ciąg zawiera około 4090 znaków”.

Wykorzystać
  • PHP

    Tutaj tablica $check zawiera nasze dane POST, a zmienna $locked to serializowany ciąg znaków zaciemniony przy użyciu funkcji str_rot13(), która jest całkowicie pod naszą kontrolą.

    W tym miejscu warto zrobić małą dygresję dla tych, którzy nie zapoznali się z odpowiednimi artykułami w ][, i krótko opowiedzieć o błędzie pojawiającym się w magicznych metodach PHP. Tak więc w wersji 5 PHP pojawiła się podstawowa koncepcja programowania OOP: konstruktor i destruktor. Konstruktor jest implementowany metodą „__construct”, a destruktor metodą „__destruct”. Po zakończeniu swojej pracy i wywołaniu za pomocą funkcji unserialize() każdy obiekt wykonuje własną metodę __ destruct, jeśli jest to zapisane w kodzie.

    Wróćmy teraz do naszego frameworka i spójrzmy na destruktor klasy App z pliku ./libs/configure.php:

    funkcja __destruct()
    {
    jeśli ($this->__cache)
    {
    $core = App::core("ciasto");
    unset($this->__paths);
    Pamięć podręczna::write("dir_map", array_fi lter($this->__paths),
    "ciasto_core");
    Pamięć podręczna::write("fi le_map", array_fi lter($this->__map),
    "ciasto_core");
    Pamięć podręczna::write("object_map", $this->__objects,
    "ciasto_core");
    }
    }

    Z powyższego kodu widać, że tę metodę można naruszyć poprzez zapisanie dowolnych wartości do obiektu Cache. Najciekawszym kluczem do złamania jest „file_map”. Zarządza połączeniami pomiędzy klasami i odpowiadającymi im plikami PHP, a także służy do ładowania dodatkowych klas podczas wykonywania skryptu.

    Rzeczywisty kod ładowania klas jest nieco bardziej skomplikowany, ale wszystko sprowadza się do następującego kodu z metody __load wewnątrz klasy App:

    Bingo! Zastępując zmienną $file, możemy dołączyć nasz własny kod PHP! Co więcej, będzie to prawdziwy błąd zdalnego dołączania plików - dzięki temu nie będziemy potrzebować żadnych dodatkowych sztuczek przy przesyłaniu plików lokalnych na serwer. Autor znalezionej luki oferuje jednak opcję LFI umożliwiającą wykorzystanie tej luki, ponieważ CakePHP wykorzystuje lokalną pamięć podręczną opartą na plikach, która jest zlokalizowana w postaci serializowanej w katalogu znanym atakującemu.

    Wykorzystać

    Jako mały PoC do generowania trującego serializowanego ciągu znaków Felix oferuje następujący kod:

    Oczywiście musisz najpierw załączyć niezbędne klasy z CakePHP. Istnieje również w pełni funkcjonalny exploit Pythona, który można znaleźć na stronie malloc.im/burnedcake.py.

    Exploit ten powinien działać w każdej aplikacji zbudowanej na CakePHP, korzystającej z formularzy POST z tokenami bezpieczeństwa i w której nie zmieniono standardowej lokalizacji plików pamięci podręcznej. Domyślnie exploit wyświetla konfigurację bazy danych; inne przydatne funkcje można łatwo dodać, zmieniając wbudowany ładunek PHP.

    Cele
    • CakePHP getState("fi lter_order_dir");
      $fi lter_order = JFilterInput::clean($fi lter_order, "cmd");
      $fi lter_order_dir =
      JFilterInput::clean($fi lter_order_dir, "słowo");
      // Musimy uzyskać listę wszystkich
      // linki internetowe w danej kategorii
      $zapytanie = "WYBIERZ *" .
      „Z #__linki internetowe” .
      „GDZIE kotid = „. (int) $to->_id.
      „AND opublikowany = 1” .
      „AND zarchiwizowane = 0”.
      "ZAMÓW PRZEZ". $fi lter_order "".
      $fi lter_order_dir .”, zamawianie”;
      zwróć $zapytanie;
      }

      Tutaj widać, że zmienne $filter_order i $filter_order_dir nie są sprawdzane pod kątem ścisłej zgodności z instrukcjami SQL; sprawdzenie odbywa się jedynie przy użyciu standardowej metody clean z klasy JFilterInput:

      Wklejamy ten kod w dowolnym miejscu serwisu, który wyświetla 5 losowych linków z bazy oraz losową kotwicę. Kotwice lepiej rozcieńczyć niż wpisywać tylko 1 do linku. Dzięki odpowiedniemu linkowaniu na Twojej stronie od razu zauważysz wzrost ruchu i poprawę pozostałych wskaźników serwisu.

      Czekam na Wasze pytania w komentarzach do tego wpisu.

      Data publikacji: 03.03.2014
        Recenzje i komentarze:

        Dmitrij:
        Dziękuję za skrypt, zastosuję się do niego. Nie da się skopiować kodu źródłowego ze strony, kopiuje się go tylko w małych fragmentach, wygodniej byłoby w całości.

        Cyryl:
        Dziękuję za uwagę o kopiowaniu, dopiero teraz to zobaczyłem, zaraz postaram się to poprawić.

        Aleksiej Pawłow:
        Błąd w linii $tex = eksploduj(":",$sendlist[$count] Potrzebujesz średnika, a nie dwukropka. Zmieniłem trochę kod, żeby był jaśniejszy: