Добавление акцента. Исследование уязвимости PHP include Бобовые html modules php name

Налицо обычная уязвимость класса PHP-инклудинг. Но, человек, для которого я делал аудит, заявил мне, мол, эту уязвимость эксплуатировать невозможно, поэтому она не считается. Пришлось с ним поспорить

Что такое PHP-include

Проведем маленький ликбез по этой уязвимости. PHP-include — уязвимость которая позволяет «приинклудить» произвольный файл, например такой код:

$module=$_REQUEST["module"]; include("modules/".$module);

И так как в файле «/etc/pаsswd» обычно нет php тегов (), то он выведется в браузер, как вывелся бы html код вынесенный за php теги в обычном php скрипте. Конечно чтение файлов всего лишь одна из возможных реализаций этой атаки. Основная же все таки это инклудинг нужных файлов с нужным php кодом.

Вернемся к примеру. Усложним его:

$module=$_REQUEST["module"]; include("modules/".$module."/module.class.php");

$module = $_REQUEST [ "module" ] ;

include ("modules/" . $module . "/module.class.php" ) ;

Как видите теперь в конце к нашей переменной добавляется строка, которая нам мешает приинклудить любой файл. Так вот, многие функции php не являются бинарно безопасными, т.е такие функции считают NULL-байт за конец строки. Обращаемся к скрипту так:

script.php?module=../../../../../../../../../../../etc/pаsswd%00

И если дирректива magic_quotes отключенна, то мы снова увидим содержимое /etc/pаsswd

Есть ли уязвимость?

Вернемся к нашему коду:

$module=addslashes($_REQUEST["module"]); include("modules/".$module."/module.class.php");

$module = addslashes ($_REQUEST [ "module" ] ) ;

include ("modules/" . $module . "/module.class.php" ) ;

Как видно, наша переменная принудительно проходит через «addslashes» и если мы попытаемся использовать NULL-байт то он будет преобразован в «\0» и инклуда не выйдет.

Но прогресс не стоит на месте! Оказывается некие ребята из USH нашли в PHP интересную фичу PHP filesystem attack vectors (англ.). Если в кратце пересказать суть статьи, то php обрабатывает пути с использованием нескольких особенностей:

  • Усечение пути — php обрезает строку пути до заданной длины MAXPATHLEN (В Windows до 270 символов, в NIX — обычно 4096, в BSD — обычно 1024)
  • Нормализация пути — php обрабатывает путь специальным образом, удаляя лишние символы «/» и «/.» и их различные комбинации
  • Приведение к каноническому виду — убираются лишние переходы, например «dir1/dir2/../dir3» приводится к «dir1/dir3/» при этом существование дирректории «dir2» не проверяется, и прочие похожие преобразования (т.е продолжение нормализации)

Теперь по порядку что происходит с переданным путем:

  1. Если путь передан относительный, то к нему вначале подставляются значения из диррективы include_path
  2. Далее путь обрезается до определенной длины в зависимости от платформы
  3. Проводится нормализация пути
  4. Путь приводится к каноническому виду

Теперь попробуем воспользоваться этим. Попробуем приинклудить некий файл «test.php» который находится в дирректории «modules/». Для этого добавляем в конец симолы «/.» таким образом чтобы общая длина, вместе с именем файла, значением из include_path была заведомо больше 4096 символов.
script.php?module=test.php/././.[...]/././.

При этом необходимо подгадать так, чтобы вся строка пути (уже обрезанная) заканчивалась на точку (важно!), а не на слеш. Для этого можно добавить один слеш вот так:

И один из этих вариантов сработает точно.

Анализируем

Смотрим по порядку какие преобразования произойдут с путем
modules/test.php//././.[...]/./././module.class.php
4200 символов

Первое что происходит со строкой, это к ней добавляется значение из include_path:
/home/site/public_html/modules/test.php//././.[...]/./././module.class.php
4223 символа

Затем строка ускается до MAXPATHLEN (допустим 4096):
/home/site/public_html/modules/test.php//././.[...]/./.
4096 символов

Здесь видно зачем нужно было добавлять еще один слеш (иначе бы строка обрезалась до слеша). Теперь производится нормализация этой строки, сначала убераются лишние слеши:
/home/site/public_html/modules/test.php/././.[...]/./.
4095 символов

В итоге получаем правильный путь до нужного нам файла, и этот путь уже передастся в инклуд, и приинклудится нужный нам файл.

То есть вот так мы приинклудим наш файл «test.php» успешно.
script.php?module=test.php//././.[...]/././.

А значит уязвимость есть и не теоритическая. В итоге мой клиент проспорил, а я выйграл спор и 10 рублей на которые мы поспорили. Конечно, помимо 10 рублей я выйграл еще и доверие и уважение в глазах клиента, что тоже не мало важно.

Заметки

Здесь я рассмотрю пару интересных особенностей эксплуатации этой уязвимости.

Выход из дирректории

Рассмотрим такой код:

) ;

Опустим тот момент, что можно вопсользоваться RFI и приинклудить файл с удаленного сервера. Допустим на сервере «allow_url_include=OFF».

Рассмотрим ситуацию когда нам надо приинклудить файл из дирректории ниже:
script.php?module=../test.php/././.[...]/././.

Такое обращение выдаст ошибку, типа файл не найден. И для того чтобы это обойти нам надо обратится вот так:
script.php?module=blabla/../../test.php/././.[...]/././.

Я не зря описывал про канонизацию путей. Благодаря ей дирректория «blabla» не обязательно должна существовать.

Добавление просто слешей

Внимательный читатель наверное заметил что в описании нормализации я написал что мол убираются лишние слеши «/» и точки со слешами «/.», так почему бы не использовать просто слеши, дабы избежать лишнего гемора с попаданием точки в конец.

Все дело в алгоритмах, то есть, слеш с точкой «/.» убирается полностью. А вот с просто слешами дело обстоит немного сложнее, при нормализации каждые два слеша заменяются на один до тех пор пока не останется один(!) слеш, пример:

/home/site/public_html/modules/test.php//////////////////
57 символов

/home/site/public_html/modules/test.php/////////
48 символов

/home/site/public_html/modules/test.php/////
44 символов

/home/site/public_html/modules/test.php///
42 символов

/home/site/public_html/modules/test.php//
41 символов

/home/site/public_html/modules/test.php/
40 символов

Небольшое отступление:

Причем если обратить внимание на многие, популярные хак ресурсы, то можно заметить эту ошибку. Я так понимаю эта ошибка началась со статьи некоего Raz0r где он предложил вектор:
index.php?act=../../../../../etc/pаsswd/////[…]/////

И обратите внимание даже журнал ][акер повторил эту ошибку в своей статье . При этом даже в оригинальной статье USH было четко написанно что использовать просто слеши не желательно, и необходимо чтобы в конце перед нормализацией остался символ точки. А просто слеши (даже без точки на конце) работают только в PHP c Suhosin.

То есть использовать слеш с точкой «/.» — более универсальный метод, так как, в отличие от слешей «/», он работает для всех версий php.

Заключение

Надеюсь эта статья поможет вам понять, что в своих скриптах нельзя оставлять даже малейшие уязвимости, так как рано или поздно под них можно разработать свой вектор атаки, что может привести к серьезным последствиям.

Мы поверхностно коснулись темы методов вывода контента в теле шаблона. Давайте теперь подробно разберем что это и с чем его едят. Итак, объявления метода jdoc присутствуют в каждом шаблоне Joomla и выводят в тело шаблона (то бишь на страницу сайта) ту или иную информацию. В целом объявление метода выглядит следующим образом

Данная строчка выводит на сайте информацию из компонентов, например статьи из com_content. Тип элементов вывода указывается в атрибуте.

1. type - типы элементов вывода.

  • component - как писал выше, выводит основное содержание страницы. Может вызываться только один раз в шаблоне.
  • head - объявляется так же один раз после открывающего тэга . Служит для вывода стилей, скриптов, и метаданных текущей страницы.</li><li><i>message </i><i>- </i> выводит системные сообщения. Объявляется один раз в теле документа (body).</li><li><i>installation </i> - ничего не выводит и представляет собой «инструкцию» для установки.</li><li><i>module - </i>выводит на странице единичный модуль. Количество объявлений не ограничено.</li><li><i>modules </i> - в отличии от предыдущего типа, позволяет выводить в своей позиции не единичое число модулей.</li> </ul><p>Для первых четырех указанных типов достаточно лишь указать их на странице. В случае с типом модуля задача немного усложняется. Для того, чтобы вывести на странице модуль нам нужно сперва создать для него <b>модульную позицию </b> с уникальным идентификатором (название позиции модуля). Это делается при помощи атрибута name=«имя позиции» и обязательным добавлением строки:</p><p> <position>название позиции</position> в файл templateDetails.xml. Описывая название позиции в templateDetails.xml мы обозначаем ее в системе и видим в менеджере модулей. Имена позиций могут быть произвольными, хотя name=«user3» позиция, по-умолчанию используется для отображения верхнего меню. </p><p><b>2. style - описание стиля вывода (mod chrome). </b></p> <p>От указанного стиля зависит внешний вид и структура оболочки модуля. Выглядит как</p><p> :<jdoc:include type="modules" name="user1" style="xhtml" /> По-умолчанию заложено несколько стилей вывода модулей: </p><ul><li><i>xhtml - </i> выводит модуль в блоке с заголовком function modChrome_xhtml($module, &$params, &$attribs)<br>{<br> if (!empty ($module->content)) : ?><br> <div class="moduletable<?php echo htmlspecialchars($params->get("moduleclass_sfx")); ?>"><br> <?php if ($module->showtitle != 0) : ?><br> <h3><?php echo $module->title; ?></h3><br> <?php endif; ?><br> <?php echo $module->content; ?><br> </div><br> <?php endif;<br>}</li><li><i>table - </i>выводит модуль в верстке табличной структуры<br> function modChrome_table($module, &$params, &$attribs)<br>{ ?><br> <table cellpadding="0" cellspacing="0" class="moduletable<?php echo htmlspecialchars($params->get("moduleclass_sfx")); ?>"><br> <?php if ($module->showtitle != 0) : ?><br> <tr><br> <th><br> <?php echo $module->title; ?><br> </th><br> </tr><br> <?php endif; ?><br> <tr><br> <td><br> <?php echo $module->content; ?><br> </td><br> </tr><br> </table><br> <?php<br>}</li><li><i>horz - </i>выводит содержимое модуля в ячейке таблицы, горизонтально function modChrome_horz($module, &$params, &$attribs)<br>{ ?><br> <table cellspacing="1" cellpadding="0" width="100%"><br> <tr><br> <td><br> <?php modChrome_table($module, $params, $attribs); ?><br> </td><br> </tr><br> </table><br> <?php<br>}</li><li><i>rounded </i> - выводит модуль в нескольких вложенных блоках для сложного стилевого оформления в виде графических границ (напр. закругленных углов) function modChrome_rounded($module, &$params, &$attribs)<br>{ ?><br> <div class="module<?php echo htmlspecialchars($params->get("moduleclass_sfx")); ?>"><br> <div><br> <div><br> <div><br> <?php if ($module->showtitle != 0) : ?><br> <h3><?php echo $module->title; ?></h3><br> <?php endif; ?><br> <?php echo $module->content; ?><br> </div><br> </div><br> </div><br> </div><br> <?php<br>}</li><li><i>outline </i> - добавляет к блоку модуля предустановленные стили css function modChrome_outline($module, &$params, &$attribs)<br>{<br> static $css=false;<br> if (!$css)<br> {<br> $css=true;<br> jimport("joomla.environment.browser");<br> $doc = JFactory::getDocument();<br> $browser = JBrowser::getInstance();<br> $doc->addStyleDeclaration(".mod-preview-info { padding: 2px 4px 2px 4px; border: 1px solid black; position: absolute; background-color: white; color: red;}");<br> $doc->addStyleDeclaration(".mod-preview-wrapper { background-color:#eee; border: 1px dotted black; color:#700;}");<br> if ($browser->getBrowser()=="msie")<br> {<br> if ($browser->getMajor() <= 7) {<br> $doc->addStyleDeclaration(".mod-preview-info {filter: alpha(opacity=80);}");<br> $doc->addStyleDeclaration(".mod-preview-wrapper {filter: alpha(opacity=50);}");<br> }<br> else {<br> $doc->addStyleDeclaration(".mod-preview-info {-ms-filter: alpha(opacity=80);}");<br> $doc->addStyleDeclaration(".mod-preview-wrapper {-ms-filter: alpha(opacity=50);}");<br> }<br> }<br> else<br> {<br> $doc->addStyleDeclaration(".mod-preview-info {opacity: 0.8;}");<br> $doc->addStyleDeclaration(".mod-preview-wrapper {opacity: 0.5;}");<br> }<br> }<br> ?><br> <div class="mod-preview"><br> <div class="mod-preview-info"><?php echo $module->position."[".$module->style."]"; ?></div><br> <div class="mod-preview-wrapper"><br> <?php echo $module->content; ?><br> </div><br> </div><br> <?php<br>}</li><li><i>none </i> - аналогично не указанному вообще style. Выводит модуль без оформления и заголовка function modChrome_none($module, &$params, &$attribs)<br>{<br> echo $module->content;<br>}</li> </ul><p>Все предустановленные стили располагаются в файле templates/system/html/modules.php. Но мы не ограничены использованием только предоставленных вариантов, а вполне можем создавать свои собственные.</p> <p><b>3. Создание пользовательского mode chrome. </b></p> <p><b><br></b>Итак, предоставленные по умолчанию типы представления модулей не удовлетворяют текущих требований. Нужно добавить свой собственный стиль оформления. В качестве примера выберем достаточно часто повторяющуюся ситуацию. По заданию нужно вместо <h3> поместить заголовок модуля в тэг <span>, который является семантически нейтральным. Так же требуется поместить контентблок модуля в отдельный <div>. Для создания собственного стиля вывода модуля, воспользуемся стандартными средствами. В большинстве шаблонов Joomla существет папка html/ (templates/имя шаблона/html/), используется для так называемой шаблонизации. То есть, если скопировать в эту папку шаблон модуля, то вместо шаблона из директории modules/my_module/tmpl/default будет выводиться файл из templates/имя шаблона/html/my_modules/default. Аналогично шаблонизируются и компоненты. Удобно и практично. В папке html/ Вашего шаблона создадим файл modules.php. Если такой папки в шаблоне нет, то создадим ее. В файл запишем</p><p> <?php<br>function modChrome_modbox($module, &$params, &$attribs) // Вызываем функцию<br>{<br> if (!empty ($module->content)) : /* Проверяем наличие в поиции включенного модуля */?><br> <div class="moduletable<?php echo htmlspecialchars($params->get("moduleclass_sfx")); /* выводим суффикс css класса модуля */ ?>"><br> <?php if ($module->showtitle != 0) : /* проверяем включен ли заголовок модуля */ ?><br> <span class="title"><?php echo $module->title; /* Выводим заголовок */ ?></span><br> <?php endif; ?><br> <div class="modcontent"><br> <?php echo $module->content; /* Выводим содержимое модуля */ ?><br> </div><br> </div><br> <?php endif;<br>}<br>?> Готово. Теперь нужно только указать его в качестве стиля вывода. <jdoc:include type="modules" name="user1" style="modbox"/> Назначаем в нашу позицию модуль и смотрим результат.</p> <p>Chrome - это конечная обработка html -кода модуля перед его вставкой в главный шаблон сайта. Существуют несколько предопределенных Chrome-стилей (table, horz, xhtml, rounded, outline), но не всегда то что есть подходит для решения текущих задач.</p> <p>Чтобы определить собственный стиль отображения в шаблоне, нужно создать файл "modules.php" в директории "html". То есть для шаблона с именем "my_template" файл должен располагаться тут - "templates/my_template/html/modules.php".</p> <p>В этом файле вы должны определить функцию с названием "modChrome_STYLE" где STYLE это имя вашего стиля. Эта функция будет принимать три аргумента - $module, &$params и &$attribs как показано ниже:</p> <p>function modChrome_STYLE ($module, &$params, &$attribs) { /* обработка и вывод html-кода модуля */ }</p> <p>В этой функции вы можете использовать любой PHP-код, а так же вам будут доступны все параметры самого модуля, его свойства и любые данные сохраненные в базе данных Joomla. В основном бывают нужны только следующее</p> <ul><li>$module->content - контент самого модуля, непосредственный html-код.</li> <li>$module->title - название модуля, указанное в панели управления в менеджере модулей.</li> <li>$module->showtitle - флаг, показывать название или нет (true или false).</li> </ul><p>Функция modChrome_STYLE - это обыкновенная php-функция, здесь можете использовать абсолютно любой php-код. Ниже приведен пример, если в настройках модуля включено отображение заголовка, то выведется текст заголовка перед контентом модуля.</p> <p>function modChrome_STYLE ($module, &$params, &$attribs) { if ($module->showtitle) { echo "<h2>" .$module->title ."</h2>"; } echo $module->content; }</p> <p>Есть возможность обратиться к любым параметрам модуля. Например, обрамим модуль классом</p> <p><div class="<?php echo $params->get("moduleclass_sfx"); ?>"> <!-- div contents --> </div></p> <p>Так же можно в код позиции добавлять свои атрибуты, которые используются в Chrome. Для этого в тег позиции <jdoc:include /> добавьте собственные атрибуты. Имена дополнительных атрибутов можно указывать произвольные, они все будут передаваться в ассоциативный массив $attribs.</p> <h4>Практический пример Chrome-функции:</h4> <p>function modChrome_custom($module, $params, $attribs) { if (isset($attribs["headerLevel"])) { $headerLevel = $attribs["headerLevel"]; } else { $headerLevel = 3; } if (isset($attribs["background"])) { $background = $attribs["background"]; } else { $background = "blue"; } echo "<div >"; if ($module->showtitle) { echo "<h" .$headerLevel .">" .$module->title ."</h" .$headerLevel .">"; } echo "<div class=".$background.">"; echo $module->content; echo "</div>"; echo "</div>"; }</p> <h4>Практические примеры использования функции "modChrome_custom"</h4> <p><!-- вызов в шаблоне --> <jdoc:include type="modules" name="user1" style="custom" /> <!-- HTML-код на выходе --> <div> <h3><!-- Module title --></h3> <div class="blue"> <!-- Module content --> </div> </div></p> <p><!-- вызов в шаблоне --> <jdoc:include type="modules" name="user1" style="custom" background="green" /> <!-- HTML-код на выходе --> <div> <h3><!-- Module title --></h3> <div class="green"> <!-- Module content --> </div> </div></p> <p><!-- вызов в шаблоне --> <jdoc:include type="modules" name="user1" style="custom" headerLevel="1" background="yellow" /> <!-- HTML-код на выходе --> <div> <h1><!-- Module title --></h1> <div class="yellow"> <!-- Module content --> </div> </div></p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy>");</script> </div> </article> <div class="entry-footer"> </div> <div class="b-related"> <div class="b-related__header"><span>Вам также может быть интересно</span></div> <div class="b-related__items"> <div id="post-4381" class="post-card post-4381 post type-post status-publish format-standard has-post-thumbnail"> <div class="post-card__image"> <a href="/bufer-obmena-kakie-dannye-rossiyan-sohranyat-operatory-svyazi-i-interneta-kak.html"> <img width="330" height="140" src="/uploads/baddf72189df9bc02c61af4c3bd1a77d.jpg" class="attachment-thumb-wide size-thumb-wide wp-post-image" alt="Какие данные россиян сохранят операторы связи и интернета" sizes="(max-width: 330px) 100vw, 330px" / loading=lazy> <div class="entry-meta"> <span class="entry-meta__info"> </span> </div> </a> </div> <header class="entry-header"> <div class="entry-title"><a href="/bufer-obmena-kakie-dannye-rossiyan-sohranyat-operatory-svyazi-i-interneta-kak.html" rel="bookmark">Какие данные россиян сохранят операторы связи и интернета</a></div> </header> <div class="post-card__content"> Легенды о сотрудниках компаний-провайдеров, которые от скуки или выгоды ради мониторят трафик клиентов,... </div> </div> <div id="post-4380" class="post-card post-4380 post type-post status-publish format-standard has-post-thumbnail"> <div class="post-card__image"> <a href="/yuzery-zaplatyat-za-slezhku-bufer-obmena-kakie-dannye-rossiyan-sohranyat.html"> <img width="330" height="140" src="/uploads/0fe2229730ea636f5c4eecdcf0200eea.jpg" class="attachment-thumb-wide size-thumb-wide wp-post-image" alt="Юзеры заплатят за слежку" sizes="(max-width: 330px) 100vw, 330px" / loading=lazy> <div class="entry-meta"> <span class="entry-meta__info"> </span> </div> </a> </div> <header class="entry-header"> <div class="entry-title"><a href="/yuzery-zaplatyat-za-slezhku-bufer-obmena-kakie-dannye-rossiyan-sohranyat.html" rel="bookmark">Юзеры заплатят за слежку</a></div> </header> <div class="post-card__content"> Сейчас все чаще и чаще мне приходиться слышать: «В Отделе «К» работают одни идиоты! Да… они нас никогда не... </div> </div> </div> </div> <div id="content_rb_2485" class="content_rb" data-id="2485"></div> <meta itemscope itemprop="mainEntityOfPage" itemType="https://schema.org/WebPage" itemid="/deti/mladenec/5-mesjacev-ploho-spit.html" /> <meta itemprop="dateModified" content="2017-12-31" /> <meta itemprop="datePublished" content="2017-11-16T21:55:55+00:00" /> <style> #mc-container { padding: 10px; } </style> <div class="comments-area"> <div id="mc-container"> <div id="mc-content"> </div> </div> </div> <div id="content_rb_2689" class="content_rb" data-id="2689"></div> </main> </div> <aside id="secondary" class="widget-area" itemscope itemtype="http://schema.org/WPSideBar"> <div id="search-2" class="widget widget_search"> <form role="search" method="get" id="searchform" action="/" class="search-form"> <label class="screen-reader-text" for="s">Поиск: </label> <input type="text" value="" name="s" id="s" class="search-form__text"> <button type="submit" id="searchsubmit" class="search-form__submit"></button> </form></div><div id="categories-2" class="widget widget_categories"> <div class="widget-header">Рубрики</div> <ul id="top_menu" class="menu"> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/social-networks/">Социальные сети</a> </li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/windows/">Windows</a> </li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/browsers/">Браузеры</a> </li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/malware/">Вредоносное ПО</a> </li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/computer/">Компьютер</a> </li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/programs/">Программы</a> </li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/services/">Сервисы</a> </li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/errors/">Ошибки</a> </li> </ul> </div><div id="custom_html-4" class="widget_text widget widget_custom_html"> <div class="textwidget custom-html-widget"> </div> </div><div id="wpshop_articles-2" class="widget widget_wpshop_articles"> <div class="widget-header">Популярные материалы</div> <div class="widget-article widget-article--compact"> <div class="widget-article__image"> <a href="/chto-smotret-v-pereslavle-zalesskom.html"> <img width="150" height="150" src="/uploads/c5664363890663eae83cf248f987db37.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="Что смотреть в Переславле-Залесском" / loading=lazy> </a> </div> <div class="widget-article__body"> <div class="widget-article__title"><a href="/chto-smotret-v-pereslavle-zalesskom.html">Что смотреть в Переславле-Залесском</a></div> <div class="widget-article__category"> <a href="/category/windows/">Windows</a> </div> </div> </div> <div class="widget-article widget-article--compact"> <div class="widget-article__image"> <a href="/kompyuternaya-pomoshch-kompyuternaya-pomoshch-delat-ne-zagruzhaetsya.html"> <img width="150" height="150" src="/uploads/025537a0f289db1d192967cff7206a8a.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="Компьютерная помощь Делать не загружается виндовс 8" / loading=lazy> </a> </div> <div class="widget-article__body"> <div class="widget-article__title"><a href="/kompyuternaya-pomoshch-kompyuternaya-pomoshch-delat-ne-zagruzhaetsya.html">Компьютерная помощь Делать не загружается виндовс 8</a></div> <div class="widget-article__category"> <a href="/category/malware/">Вредоносное ПО</a> </div> </div> </div> <div class="widget-article widget-article--compact"> <div class="widget-article__image"> <a href="/kak-steret-vse-dannye-s-iphone-6-kak-otvyazat-iphone-ot-apple-id-udalenie-uchetnoi.html"> <img width="150" height="150" src="/uploads/bc8ececcb19480db2de584d033d09f7e.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="Как отвязать iPhone от Apple ID: удаление учетной записи" / loading=lazy> </a> </div> <div class="widget-article__body"> <div class="widget-article__title"><a href="/kak-steret-vse-dannye-s-iphone-6-kak-otvyazat-iphone-ot-apple-id-udalenie-uchetnoi.html">Как отвязать iPhone от Apple ID: удаление учетной записи</a></div> <div class="widget-article__category"> <a href="/category/malware/">Вредоносное ПО</a> </div> </div> </div> <div class="widget-article widget-article--compact"> <div class="widget-article__image"> <a href="/kak-vklyuchit-i-dobavit-oblozhku-dlya-gruppy-vkontakte.html"> <img width="150" height="150" src="/uploads/b8756d391240f5144952f47f24a2c57f.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="Оформление сообщества «ВКонтакте»: самое подробное руководство в рунете для группы или публичной страницы Как добавить фон в группу в контакте" / loading=lazy> </a> </div> <div class="widget-article__body"> <div class="widget-article__title"><a href="/kak-vklyuchit-i-dobavit-oblozhku-dlya-gruppy-vkontakte.html">Оформление сообщества «ВКонтакте»: самое подробное руководство в рунете для группы или публичной страницы Как добавить фон в группу в контакте</a></div> <div class="widget-article__category"> <a href="/category/social-networks/">Социальные сети</a> </div> </div> </div> <div class="widget-article widget-article--compact"> <div class="widget-article__image"> <a href="/igry-battle-net-skachat-prilozhenie-blizzard-plyusy-i-minusy.html"> <img width="150" height="150" src="/uploads/da613d090890a9fa64b420a9a82e70a7.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="Скачать Приложение Blizzard" / loading=lazy> </a> </div> <div class="widget-article__body"> <div class="widget-article__title"><a href="/igry-battle-net-skachat-prilozhenie-blizzard-plyusy-i-minusy.html">Скачать Приложение Blizzard</a></div> <div class="widget-article__category"> <a href="/category/services/">Сервисы</a> </div> </div> </div> <div class="widget-article widget-article--compact"> <div class="widget-article__image"> <a href="/vov-interfeis-addony-nastroika-grafika-i-sistemnye-trebovaniya-skachat-wow.html"> <img width="150" height="150" src="/uploads/ef58659210a20c32999eef018af14357.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="ВОВ: интерфейс, аддоны, настройка, графика и системные требования" / loading=lazy> </a> </div> <div class="widget-article__body"> <div class="widget-article__title"><a href="/vov-interfeis-addony-nastroika-grafika-i-sistemnye-trebovaniya-skachat-wow.html">ВОВ: интерфейс, аддоны, настройка, графика и системные требования</a></div> <div class="widget-article__category"> <a href="/category/windows/">Windows</a> </div> </div> </div> </div><div id="custom_html-5" class="widget_text widget widget_custom_html"> <div class="widget-header">Полезно знать</div> <div class="textwidget custom-html-widget"> </div> </div> </aside> </div> <div class="footer-navigation container"> <div class="main-navigation-inner "> <div class="menu-footer_menu-container"><ul id="footer_menu" class="menu"> <li class="menu-item type-post_type object-page "><a href="">О проекте</a></li> <li class="menu-item type-post_type object-page "><a href="/sitemap.xml">Карта сайта</a></li> <li class="menu-item type-post_type object-page "><a href="">Рекламодателям</a></li> </ul></div> </div> </div> <footer class="site-footer container" itemscope itemtype="http://schema.org/WPFooter"> <div class="site-footer-inner "> <div class="footer-info"> © 2024 engineermedia.ru Основы работы на персональном компьютере </div> <div class="footer-social"> <div class="social-buttons social-buttons--square social-buttons--circle social-buttons--small"> </div> </div> <div class="footer-counters"> </div> </div> </footer> <button type="button" class="scrolltop js-scrolltop"></button> </div> <script type='text/javascript' src='https://engineermedia.ru/wp-content/plugins/adsplacer_pro/assets/js/jquery.adsplacer.adblock.js'></script> <script type='text/javascript'> /* <![CDATA[ */ var tocplus = { "smooth_scroll": "1" }; /* ]]> */ </script> <script type='text/javascript' src='https://engineermedia.ru/wp-content/plugins/table-of-contents-plus/front.min.js'></script> <script type='text/javascript' src='https://engineermedia.ru/wp-content/plugins/wp-polls/polls-js.js'></script> <script type='text/javascript' src='https://engineermedia.ru/wp-content/plugins/wp-postratings/js/postratings-js.js'></script> <script type='text/javascript' src='https://engineermedia.ru/wp-content/themes/root/js/scripts.min.js'></script> <script type='text/javascript'> /* <![CDATA[ */ var q2w3_sidebar_options = [{ "sidebar": "sidebar-1", "margin_top": -10, "margin_bottom": 250, "stop_id": "", "screen_max_width": 991, "screen_max_height": 0, "width_inherit": false, "refresh_interval": 1500, "window_load_hook": false, "disable_mo_api": false, "widgets": ["custom_html-5"] }]; /* ]]> */ </script> <script type='text/javascript' src='https://engineermedia.ru/wp-content/plugins/q2w3-fixed-widget/js/q2w3-fixed-widget.min.js'></script> <script type="text/javascript" id="slb_context"> /* <![CDATA[ */ if (!!window.jQuery) { (function($) { $(document).ready(function() { if (!!window.SLB) { { $.extend(SLB, { "context": ["public", "user_guest"] }); } } }) })(jQuery); } /* ]]> */ </script> </body> </html>