У ДОМА Визи Виза за Гърция Виза за Гърция за руснаци през 2016 г.: необходимо ли е, как да го направя

Уеб връзки php декорация. Хакове и добавки. Изпълнение на произволен код в CakePHP

Този месец копачите на бъгове не искат да ни развалят с нови експлойти с висок профил в популярни приложения. Разбира се, много съвети са публикувани в продукти на известни компании, но много малко от тях съдържат четливи PoC кодове. В нашия преглед се опитах да събера най-значимите и пълни уязвимости, описани наскоро, така че седнете удобно и се наслаждавайте на четенето.

PHP уязвимост при обработка на HTTP Head заявки Накратко

На 3 март известен Адам Иванюк откри интересна функция в PHP интерпретатора, която не обработва HEAD заявките съвсем правилно. Изследователят нарече тази уязвимост „трик с HTTP HEAD метод в php скриптове“.

Много програмисти проектират своите PHP скриптове, надявайки се, че всички инструкции, написани в тях, ще се изпълнят успешно, без да се счупят някъде по средата (особено при кратки скриптове). Това се случва, ако скриптът е поискан от крайния потребител с помощта на методите GET, POST, PUT.

Но трябва да знаете, че има и други HTTP методи - например HEAD. Точно при обработката на този метод в PHP може да възникне дупка в сигурността.

Нека да разгледаме един от източниците на интерпретатора: ./main/SAPI.c, ред 315:

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

Когато пристигнат някакви данни, функцията php_ub_body_write се изпълнява. След това погледнете main/output.c, ред 699:

if (SG(request_info).headers_only) (
if(SG(headers_sent))
{
връщане 0;
}
php_header(TSRMLS_C);
zend_bailout();
}

Тук можете да видите, че когато печатате за първи път и използвате метода HEAD, функцията zend_bailout нарушава скрипта.

експлоатирайте

Сега нека получим достъп до този скрипт с помощта на метода HEAD:

Както бихте очаквали, нашата книга за гости ще спре изпълнението си на реда „echo $data;“, така че файлът book.txt просто ще бъде нулиран.
Този пример е доста разрушителен по своята същност. Във втория пример можем да заобиколим оторизацията в примитивния административен панел:

В този скрипт, когато се влиза с помощта на обичайните методи, в сесията се задава административна променлива. След това, ако потребителят въведе неправилна парола, тази променлива се нулира и потребителят не става администратор.

Ако влезем в админ панела през HEAD, неговото изпълнение ще бъде прекъснато на частта от кода с „echo“, така че административната променлива няма да бъде нулирана и можем спокойно да се лутаме из затворената част на приложението. Нещото, което трябва да имате предвид тук е, че повечето уеб сървъри имат изходна буферна стойност, зададена на 4096 байта, така че в работещ пример може да се нуждаем от низа „Дългият низ съдържа около 4090 знака“.

експлоатирайте
  • PHP

    Тук масивът $check съдържа нашите POST данни, а променливата $locked е сериализиран низ, маскиран с помощта на функцията str_rot13(), която е изцяло под наш контрол.

    Тук си струва да направим малко отклонение за тези, които не са чели съответните статии в ][, и да говорим накратко за грешката, която се появява в магическите методи на PHP. И така, във версия 5 на PHP се появи основната концепция на ООП програмирането: конструктор и деструктор. Конструкторът се имплементира с помощта на метода "__construct", а деструкторът се имплементира с помощта на метода "__destruct". След завършване на работата си и когато бъде извикан чрез функцията unserialize(), всеки обект изпълнява свой собствен метод __ destruct, ако е записан в кода.

    Сега нека се върнем към нашата рамка и да разгледаме деструктора на класа на приложението от файла ./libs/configure.php:

    функция __destruct()
    {
    ако ($this->__cache)
    {
    $core = App::core("торта");
    unset($this->__paths);
    Cache::write("dir_map", array_fi lter($this->__paths),
    "cake_core");
    Cache::write("fi le_map", array_fi lter($this->__map),
    "cake_core");
    Cache::write("object_map", $this->__objects,
    "cake_core");
    }
    }

    От кода по-горе можете да видите, че този метод може да бъде компрометиран чрез записване на произволни стойности в обекта Cache. Най-интересният ключ за кракване е 'file_map'. Той управлява връзките между класовете и съответните PHP файлове, а също така се използва за зареждане на допълнителни класове по време на изпълнение на скрипт.

    Действителният код за зареждане на класове е малко по-сложен, но всичко се свежда до следния код от метода __load в класа на приложението:

    Бинго! Като заместим променливата $file, можем да включим наш собствен PHP код! Освен това, това ще бъде истински бъг за отдалечено включване на файлове - следователно няма да имаме нужда от допълнителни трикове за качване на локални файлове на сървъра. Въпреки това, авторът на откритата уязвимост предлага LFI опция за експлоатиране на тази дупка, тъй като CakePHP използва базиран на файл локален кеш, който се намира в сериализирана форма в директория, известна на атакуващия.

    експлоатирайте

    Като малък PoC за генериране на отровен сериализиран низ, felix предлага следния код:

    Разбира се, първо трябва да включите необходимите класове от CakePHP. Има и напълно функционален експлойт на Python, който можете да намерите на malloc.im/burnedcake.py.

    Този експлойт трябва да работи във всяко приложение, изградено на CakePHP, използващо POST формуляри с токени за сигурност и в което стандартното местоположение на кеш файловете не е променено. По подразбиране експлойтът показва конфигурацията на базата данни; други полезни функции могат лесно да бъдат добавени чрез промяна на вграденото полезно натоварване на PHP.

    Цели
    • 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, "дума");
      // Трябва да получим списък с всички
      // уеб връзки в дадената категория
      $query = "SELECT *" .
      „ОТ #__уеб връзки“ .
      "WHERE catid = ". (int) $this->_id.
      "И публикувано = 1" .
      „И архивирано = 0“.
      "ПОДРЕДЕНИ ПО". $fi lter_order "".
      $fi lter_order_dir .", подреждане";
      върне $заявка;
      }

      Тук можете да видите, че променливите $filter_order и $filter_order_dir не се проверяват за стриктно съответствие с SQL изразите; проверката се извършва само чрез използване на стандартния чист метод от класа JFilterInput:

      Отново, това е много прост клас с един метод за показване. По-голямата част от логиката тук е специфична за компонента за връзка, но ако се вгледате внимателно, можете да намерите функционалност, използвана в повечето класове на изглед на компонент. В края на метода за показване този клас извиква родителския (JView) метод за показване, като предава името на шаблона за показване. Ако името на шаблона за показване не е предадено, се използва шаблонът "по подразбиране".
      И накрая, отваряме класа на шаблона.

      Шаблонен клас

      Нека се съгласим, че конкретно име на шаблон не е предадено, така че ще се използва шаблонът по подразбиране. В този случай ще бъде разгледан следният файл: .../components/com_weblinks/views/categories/tmpl/default.php
      -> escape ($this -> params -> get ("page_title" ) ) ; ?>

      • ( )

      Голяма част от логиката тук е специфична за компонента, който се изпълнява. Можете също така да видите от кода, че този файл съдържа целия HTML, смесен с PHP - това са неговите характеристики и цел.

      Други файлове, използвани в компоненти

      Няколко от другите типове файлове, които можете да намерите в компонентите:

      • Помощници - компонентите често използват файл helper.php или помощна директория с много файлове. Тези файлове обикновено съдържат само общата функционалност на компонента.
      • Изглежда, че Assets е папка за събиране на всички други файлове, включени в компонента.
      • router.php - този файл се използва, когато настройката за SEF URL е активирана, за превод на URL адреса в двете посоки (в четим за хора такъв с псевдоними и в системния изглед на Joomla с параметри).
      • xml файлове - те обикновено дефинират параметри и друга информация за компонента и неговия преглед. Те се използват например при създаване на компонентни елементи от менюто.
      • index.html – Добра практика е да имате празен файл index.html във всичките си директории. Това е такава пасивна мярка за сигурност.
      • css/images/js - Папки, които съдържат различни файлове за реализиране на дизайна и функционалността от страна на клиента (в браузъра).

      Във файла /includes/joomla.php във функцията cleanText има предложение за замяна на реда

      $текст = strip_tags($текст); $text = strip_tags ($text, " " ) ;

      Този хак е предназначен само за снимки, които се вмъкват като нормални изображения. За изображения, вмъкнати от мамбот (mosimage), този хак няма да работи.

      Как да направите директна връзка да се показва в компонента com_weblinks

      В weblinks.html.php трябва да замените реда:

      $link = sefRelToAbs( "index.php?option=com_weblinks&task=view&catid=" . $catid ."&id=" . $row ->id ) ; $link = $row ->url ; Как да накарам Joomla да работи на два хоста (домейна) едновременно. Тези. например в локалната мрежа на 10.0.0.15 и от интернет сайта-firmy.ru. Въпреки факта, че и двата адреса са присвоени на една и съща машина.

      Първо, целият смисъл на проблема е, че Joomla показва всички изображения и CSS файлове (пътищата им в шаблона) спрямо своята променлива $mosConfig_live_site - основния адрес на сайта, въведен по време на инсталацията. И ако някой се опита да влезе в него с различен адрес, тогава нищо в логиката на работата му не се променя - основният адрес се взема от конфигурационния файл. Например, ако конфигурацията гласи, че Joomla се намира на localhost, тогава достъпът от локалната мрежа, дори до правилно конфигуриран Apache, слушащ адрес 192.168.0.1, няма да промени нищо в нея - src на изображенията все още ще започне с "localhost", който за други машини вече ще има свой собствен localhost. Фокусът на решенията за такива случаи е да се замени променливата $mosConfig_live_site за искания хост, така че всички функции да могат да издават правилните връзки и вече да водят потребителя към. или един или друг виртуален сайт (дайте правилните основни пътища към снимките и основните пътища към адресите). ; за това, в configuration.php, на мястото на дефиницията $mosConfig_live_site, трябва да напишете вашия код.

      if ($_SERVER [ "HTTP_HOST" ] =="host1.ru" ) $mosConfig_live_site = "host1.ru" ; else $mosConfig_live_site = "host2.ru" ;

      Необходимо е да се обърне внимание, че ако използвате кеш, трябва да имате и две различни кеширащи директории за два хоста, тъй като връзките към различни хостове могат да се пресичат в кеша и тогава потребител от грешната мрежа изобщо няма да стигне никъде . Променливата $mosConfig_cachepath е отговорна за кеша.

      Как да накарате два компонента да се показват едновременно на една страница

      Ще ви кажа веднага - не всичко е толкова просто. Все пак не е модул. Следователно, първо, струва си да потърсите алтернатива, т.е. Със сигурност популярен компонент идва с модули, които могат да възпроизведат неговата функционалност. Ако няма нищо такова, това е вариант. Може да се направи като модул или на теория може да се вмъкне в шаблон. Идеята е следната - извикване на компонента чрез index2.php (какво и защо - прочетете целия факт). Тези. можете да направите iframe с src="index2.php?option=com_component&no_html=1" в желаната точка на вмъкване за втория компонент. И ще се покаже там. Друго нещо е, че е малко вероятно да бъде възможно напълно да се осигури функционалност. Но все пак това е изход.

      Или използвайте конструкцията: mosLoadComponent("com_mycomp" ) ;

      Но ако компонентът се изпълнява по този начин, тогава трябва да разберете, че той не знае за вашите манипулации и ще работи според своите $option и $task.

      Как да увеличим дължината на заглавието в статия

      Трябва да изпълните следните две команди в phpMyAdmin (има специална страница за изпълнение на SQL заявки), просто заменете ###_ с вашия истински префикс на таблица. Максималният възможен брой е 255. В примера се използва 200.

      ALTER TABLE `###_content` CHANGE `title_alias` `title_alias` VARCHAR(200) NOT NULL; ALTER TABLE `###_content` CHANGE `title` `title` VARCHAR(200) NOT NULL;

      Как да включите пълни новинарски текстове във вашата RSS емисия, а не само техните заглавия

      За да направите това, във файла /components/com_rss/rss.php трябва да замените

      $item_description = $row ->introtext; $item_description = $row ->пълен текст; Как мога да направя два сайта на Joomla, използвайки една и съща база данни или използвайки едни и същи файлове?

      Що се отнася до използването на една база данни, трябва да напишете една база данни в configuration.php за две машини, но трябва да разбирате какво правите. Тъй като поддържането на сесии за потребители в този случай ще бъде много проблематично, тъй като домейните са различни. Тези. записите за влизане в таблицата #__sessions ще (може) да се припокриват.

      Ако искате да използвате същите файлове, без да копирате голяма дистрибуция, тогава по принцип можете да използвате командата “ln -s” в Linux, за да създадете символни връзки към съществуващи файлове и да не ги копирате за новия сайт.

      Как да създадете виртуална страница, достъпна на определен адрес в общия дизайн на Joomla (http:/ /site.ru/super_page)
      • Първият начин е да използвате някакъв вид SEF компонент, в който посочвате желания виртуален път за статична страница. Тук има минус - този компонент ще започне да преработва всички останали връзки (и като цяло тези компоненти са много енергоемки и изискват много ресурси, за да работят).
      • Създайте псевдоним за такава страница, като използвате mod_rewrite и .htaccess. За да направите това ви трябва:
        • Създайте статична страница с текста, от който се нуждаете, разберете нейния ID и адрес (не е необходимо да създавате такава страница, тя може вече да съществува и като цяло това е всеки компонент, не непременно com_content)
        • Измислете си псевдоним, нека бъде "super_puper"
        • Отворете .htaccess и преди реда "RewriteCond %(REQUEST_FILENAME) !-f" напишете:
      RewriteRule ^(super_puper) index.php?option=com_content&task=view&id=12 RewriteCond %(REQUEST_FILENAME) !-f
        • И сега, при условие че Joomla се намира на site.ru, когато отворите връзката http:/ /site.ru/super_puper, ще се отвори необходимата статична страница с вашата информация. Самата връзка "index.php?option=com_content&task=view&id=12" може да бъде каквато ви трябва, основното е връзката да не е абсолютна (т.е. с http:/ /...), а относителна (трябва да започва с индекс .php?...)
      Как да деактивирате кеширането за конкретна статия

      Това може да е необходимо, ако използвате мамбота rd_addphp, за да вмъкнете всякакви скриптове, които трябва да генерират произволни числа или произволен текст всеки път, независимо от системата за кеширане на Joomla. За да деактивирате кеширането на определен елемент, трябва да разберете неговия идентификатор (в административния панел, когато редактирате, погледнете адресната лента, ще пише нещо като "...&id=123..."). Така че 123 ще бъде нашият идентификатор на статия. Необходимо е да се замени във файла /components/com_content/content.php приблизително на ред 1600

      $cache ->call ("HTML_content::show", $row, $params, $access, $page); if ($row ->id !="123" ) $cache ->call ("HTML_content::show", $row, $params, $access, $page) ; else HTML_content::show ($row, $params, $access, $page) ;

      Където 123 е идентификаторът на статията, от който се нуждаете.

      Инсталирах много компоненти, но списъкът с компоненти в администраторското меню показва намален брой от тях, а след това пише „Още компоненти...“. Как да покажа всички компоненти.

      Имате нужда от ред във файла /administrator/modules/mod_fullmenu.php

      $topLevelLimit = 19;

      заменен от

      $topLevelLimit = 199; Как да инсталирате копие на компонент

      Трябва да се каже, че задачата е изключително трудна. Ако не разбирате как работи компонентът, тогава не трябва дори да опитвате. За тези, които все още искат да отбележат основните точки:

      • В XML файла преименувайте името на компонента в етикета с име
      • След това трябва да преименувате използваните таблици (първо в XML файла и второ във всички компонентни файлове, където и да се използват обектът на база данни $database и методът setQuery)
      • Преименувайте и всички пътища в компонентите. Пътищата могат да се използват в препратки към себе си или в имената на включени файлове. Най-често това се свежда до търсене на името на подниза com_component и замяната му с ново.

      Но този метод не гарантира нищо. При простите това е възможно и ще мине, но при сложните никой не гарантира.

      Как да направите една позиция произволно да показва един от модулите, които са й присвоени
      • Вариант 1 - хакнете функцията mosLoadModules. В шаблона, на мястото, където е необходимо да се покаже един от N модула, пишем (обърнете внимание на третия аргумент):
      mosLoadModules("позиция", display_setup,true);

      И леко коригираме самата горна функция:

      функция mosLoadModules( $position ="left" , $style =0 , $show_random = false ) ( ... $allModules =& initModules() ; if (isset ( $GLOBALS [ "_MOS_MODULES" ] [ $position ] ) ) ( $modules = $GLOBALS [ "_MOS_MODULES" ] [ $position ] ) else ( $modules = array () ; ) //добавете тук if ($show_random && sizeof ($modules) >0 ) ( $tmp = $modules [ rand (0,sizeof ($modules) -1) ] ; $modules = array ($tmp) ; // край на оператора if ( count ( $modules )< 1 ) { $style = 0 ; }

      Добавихме трети аргумент към него (който се използва в шаблона, където написахме true) и променихме кода.

      • Вариант две е по-безболезнен, ние само променяме шаблона. Но по-трудоемко - трябва да създадем няколко позиции. Първо създаваме няколко нови модулни позиции, например new1 ... new10. Запазване. На правилното място в шаблона, преди да извикате функцията mosLoadModules, добавете необходимия код:
      $rand_num = rand (1 ,10 ) ;//от 1 до 10 - както в името на позицията mosLoadModules ( "ново" .$rand_num , display_settings) ; Вярвам, че с преименуването на папката /administrator/ ще направя сайта си по-сигурен

      Тази опция не е стандартна. Но всъщност е възможно, като организирате търсене във файлове на Joomla, да замените всяка поява на такава дума с вашата - секретна. Понякога по-късно могат да се появят грешки за невъзможност за достъп до файлове, но знаейки номера на файла и реда, те могат да бъдат коригирани. Следователно проблемът по принцип е разрешим.

      Нека започнем да разглеждаме компонентите, като разгледаме как основният компонент Weblinks работи в административната част на уебсайт. Този компонент, който е типичен за тази част от уебсайта, е много подобен на другите му компоненти, предназначени да управляват статии, потребители, модули и др.

      Програмните файлове за този компонент са изброени по-долу. Всички тези файлове се намират в папката администратор/компоненти/com_weblinks. В останалата част от тази глава всички имена на файлове на компоненти на Weblinks се отнасят спрямо тази начална папка, освен ако не е отбелязано друго. Повечето от файловете са организирани според модела MVC. По-конкретно, всички файлове с изгледи са в подпапката с изгледи, а всички основни файлове с модели и контролери са съответно в подпапките с модели и контролери. Те също така се допълват от инсталационни, конфигурационни и помощни файлове.

      Файлове от административната част на компонента Weblinks, с изключение на файловете index.html

      • controllers/weblink.php - Основен контролер за редактиране Един контролер за уеблинк
      • controllers/weblinks.php - Основен контролер за компилиране на контролера и показване на списък с уеб връзки на екрана на Weblinks Manager
      • helpers/weblinks.php - Предоставя различни методи, използвани в контролери и изгледи
      • modeli/fields/ordering.php - JformField модел, показващ колоната за подреждане на уеб връзки на екрана на Weblinks Manager
      • modeli/forms/weblink.xml - XML ​​файл, използван в класа Jform-Model Field за оформление на формуляр с полета за въвеждане и редактиране на уеб връзки на екрана
      • models/weblink.php - Модел за модел на уеб връзка с един екран
      • models/weblinks.php - Модел на екранната форма на мениджъра Модел на уеб връзки
      • sql/install.mysql.utf8.sql - SQL файл за създаване на таблица с уеб връзки по време на инсталация
      • sql/uninstall.mysql.ut8.sql - SQL файл за премахване на таблицата с уеб връзки по време на инсталация
      • tables/weblink.php - Предоставя класа Model
      • views/weblink/tmpl/edit_metadata.php - Изходен файл с оформление за редактиране на метаданни за уеб връзки

      Административна част на компонента Weblinks

      • views/weblink/tmpl/edit_params.php - Изходен файл с оформление за редактиране на опции за избор на единична уеб връзка
      • views/weblink/tmpl/edit.php - Изходен файл с оформление за редактиране на уеб връзка
      • views/view.html.php - Основен клас на изглед за показване на единична уеб връзка в HTML формат Файл с изходно оформление за мениджър на уеб връзки
      • views/weblinks/view.html.php - Основен клас на изглед за показване на уеб връзки в HTML формат директно на екрана на Weblinks Manager
      • access.xml - XML ​​файл, предоставящ списък с действия за система със списък за контрол на достъпа (ACL).
      • config.xml - XML ​​файл, предоставящ списък с опции за избор на конфигурация на компонента
      • controller.php - Основен клас контролер
      • weblinks.php - Входна точка за заявката
      • weblinks.xml - XML ​​файл, използван за контрол на инсталационния процес